]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/QueryControlImpl.java
53a3dc1ad0b955c57547e70b450fbf55c6cd8907
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / QueryControlImpl.java
1 package fi.vtt.simantics.procore.internal;
2
3 import java.util.Collection;
4
5 import org.simantics.db.AsyncReadGraph;
6 import org.simantics.db.ReadGraph;
7 import org.simantics.db.Resource;
8 import org.simantics.db.WriteGraph;
9 import org.simantics.db.common.request.WriteRequest;
10 import org.simantics.db.exception.DatabaseException;
11 import org.simantics.db.impl.ResourceImpl;
12 import org.simantics.db.impl.graph.ReadGraphImpl;
13 import org.simantics.db.procedure.AsyncContextMultiProcedure;
14 import org.simantics.db.procedure.AsyncMultiProcedure;
15 import org.simantics.db.request.ExternalRead;
16 import org.simantics.db.service.QueryControl;
17 import org.simantics.utils.DataContainer;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 public class QueryControlImpl implements QueryControl {
22
23         private static final Logger LOGGER = LoggerFactory.getLogger(QueryControlImpl.class);
24
25         final private SessionImplSocket session;
26         
27         QueryControlImpl(SessionImplSocket session) {
28                 this.session = session;
29         }
30
31         @Override
32         public int getAmountOfQueryThreads() {
33                 return session.getAmountOfQueryThreads();
34         }
35         
36     @Override
37     public int getGraphThread(AsyncReadGraph graph) {
38         return 0;
39     }
40
41     @Override
42     public int flush() {
43         final DataContainer<Integer> result = new DataContainer<Integer>(); 
44         try {
45             session.syncRequest(new WriteRequest() {
46
47                 @Override
48                 public void perform(WriteGraph graph) throws DatabaseException {
49                     result.set(session.queryProvider2.clean());
50                 }
51                 
52             });
53         } catch (DatabaseException e) {
54             LOGGER.error("query flush failed", e);
55         }
56         return result.get();
57     }
58
59     @Override
60     public int flush(ReadGraph graph) {
61         return session.queryProvider2.clean();
62     }
63     
64     @Override
65     public int count() {
66         return session.queryProvider2.querySize();
67     }
68     
69     @Override
70     public void gc(ReadGraph graph, int allowedTimeInMs) {
71         // 20% young target
72         session.queryProvider2.gc(20, allowedTimeInMs);
73     }
74     
75     @Override
76     public void gc(final Collection<ExternalRead<?>> requests) {
77         try {
78                 session.syncRequest(new WriteRequest() {
79                 @Override
80                 public void perform(WriteGraph graph) throws DatabaseException {
81                     gc(graph, requests);
82                 }
83             });
84         } catch (DatabaseException e) {
85             LOGGER.error("query gc failed", e);
86         }
87     }
88
89     @Override
90     public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {
91         if (graph == null)
92             throw new IllegalArgumentException("null WriteGraph");
93         if (requests == null)
94             throw new IllegalArgumentException("null requests");
95         session.queryProvider2.clean(requests);
96     }
97     
98         @Override
99         public boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final AsyncMultiProcedure<Resource> procedure) {
100                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
101                 ResourceImpl res = (ResourceImpl)resource;
102                 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
103                 if(0 == targetThread) return true;
104                 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
105 //              impl.state.barrier.inc();
106 //              
107 //              AsyncReadGraph targetGraph = impl.newAsync();
108                 procedure.execute(impl, resource);
109 //              impl.state.barrier.dec();
110                 
111                 return false;
112                 
113         }
114
115         @Override
116         public <C> boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final C context, final AsyncContextMultiProcedure<C, Resource> procedure) {
117                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
118                 ResourceImpl res = (ResourceImpl)resource;
119                 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
120                 if(0 == targetThread) return true;
121                 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
122 //              impl.state.barrier.inc();
123 //              
124 //              AsyncReadGraph targetGraph = impl.newAsync();
125                 procedure.execute(impl, context, resource);
126 //              impl.state.barrier.dec();
127                 
128                 return false;
129         }
130
131         @Override
132         public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {
133                 final ReadGraphImpl impl = (ReadGraphImpl)graph;
134
135 //              impl.state.barrier.inc();
136 //
137 //              AsyncReadGraph targetGraph = impl.newAsync();
138                 procedure.execute(impl);
139 //              impl.state.barrier.dec();
140
141         }
142         
143         @Override
144         public ReadGraph getIndependentGraph(ReadGraph graph) {
145                 ReadGraphImpl impl = (ReadGraphImpl)graph;
146                 return impl.withParent(null, null, false);
147         }
148
149         @Override
150         public boolean hasParentRequest(ReadGraph graph) {
151                 ReadGraphImpl impl = (ReadGraphImpl)graph;
152                 return impl.parent != null;
153         }
154         
155         @Override
156         public boolean resume(ReadGraph graph) {
157                 ReadGraphImpl impl = (ReadGraphImpl)graph;
158                 return impl.processor.querySupport.resume(impl);
159         }
160
161 }