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