]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/QueryControlImpl.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / QueryControlImpl.java
diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/QueryControlImpl.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/QueryControlImpl.java
new file mode 100644 (file)
index 0000000..c34de8d
--- /dev/null
@@ -0,0 +1,157 @@
+package fi.vtt.simantics.procore.internal;\r
+\r
+import java.util.Collection;\r
+\r
+import org.simantics.db.AsyncReadGraph;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.impl.ResourceImpl;\r
+import org.simantics.db.impl.graph.ReadGraphImpl;\r
+import org.simantics.db.procedure.AsyncContextMultiProcedure;\r
+import org.simantics.db.procedure.AsyncMultiProcedure;\r
+import org.simantics.db.request.ExternalRead;\r
+import org.simantics.db.service.QueryControl;\r
+import org.simantics.utils.DataContainer;\r
+\r
+public class QueryControlImpl implements QueryControl {\r
+       \r
+       final private SessionImplSocket session;\r
+       \r
+       QueryControlImpl(SessionImplSocket session) {\r
+               this.session = session;\r
+       }\r
+\r
+       @Override\r
+       public int getAmountOfQueryThreads() {\r
+               return session.getAmountOfQueryThreads();\r
+       }\r
+       \r
+    @Override\r
+    public int getGraphThread(AsyncReadGraph graph) {\r
+       return 0;\r
+    }\r
+\r
+    @Override\r
+    public int flush() {\r
+        final DataContainer<Integer> result = new DataContainer<Integer>(); \r
+        try {\r
+            session.syncRequest(new WriteRequest() {\r
+\r
+                @Override\r
+                public void perform(WriteGraph graph) throws DatabaseException {\r
+                    result.set(session.queryProvider2.clean());\r
+                }\r
+                \r
+            });\r
+        } catch (DatabaseException e) {\r
+            e.printStackTrace();\r
+        }\r
+        return result.get();\r
+    }\r
+\r
+    @Override\r
+    public int flush(ReadGraph graph) {\r
+       return session.queryProvider2.clean();\r
+    }\r
+    \r
+    @Override\r
+    public int count() {\r
+        return session.queryProvider2.querySize();\r
+    }\r
+    \r
+    @Override\r
+    public void gc(ReadGraph graph, int allowedTimeInMs) {\r
+       // 20% young target\r
+       session.queryProvider2.gc(20, allowedTimeInMs);\r
+    }\r
+    \r
+    @Override\r
+    public void gc(final Collection<ExternalRead<?>> requests) {\r
+        try {\r
+               session.syncRequest(new WriteRequest() {\r
+                @Override\r
+                public void perform(WriteGraph graph) throws DatabaseException {\r
+                    gc(graph, requests);\r
+                }\r
+            });\r
+        } catch (DatabaseException e) {\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {\r
+        if (graph == null)\r
+            throw new IllegalArgumentException("null WriteGraph");\r
+        if (requests == null)\r
+            throw new IllegalArgumentException("null requests");\r
+        session.queryProvider2.clean(requests);\r
+    }\r
+    \r
+       @Override\r
+       public boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final AsyncMultiProcedure<Resource> procedure) {\r
+               final ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+               ResourceImpl res = (ResourceImpl)resource;\r
+               int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);\r
+               if(0 == targetThread) return true;\r
+               //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);\r
+//             impl.state.barrier.inc();\r
+//             \r
+//             AsyncReadGraph targetGraph = impl.newAsync();\r
+               procedure.execute(impl, resource);\r
+//             impl.state.barrier.dec();\r
+               \r
+               return false;\r
+               \r
+       }\r
+\r
+       @Override\r
+       public <C> boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final C context, final AsyncContextMultiProcedure<C, Resource> procedure) {\r
+               final ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+               ResourceImpl res = (ResourceImpl)resource;\r
+               int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);\r
+               if(0 == targetThread) return true;\r
+               //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);\r
+//             impl.state.barrier.inc();\r
+//             \r
+//             AsyncReadGraph targetGraph = impl.newAsync();\r
+               procedure.execute(impl, context, resource);\r
+//             impl.state.barrier.dec();\r
+               \r
+               return false;\r
+       }\r
+\r
+       @Override\r
+       public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {\r
+               final ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+\r
+//             impl.state.barrier.inc();\r
+//\r
+//             AsyncReadGraph targetGraph = impl.newAsync();\r
+               procedure.execute(impl);\r
+//             impl.state.barrier.dec();\r
+\r
+       }\r
+       \r
+       @Override\r
+       public ReadGraph getIndependentGraph(ReadGraph graph) {\r
+               ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+               return impl.withParent(null);\r
+       }\r
+\r
+       @Override\r
+       public boolean hasParentRequest(ReadGraph graph) {\r
+               ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+               return impl.parent != null;\r
+       }\r
+       \r
+       @Override\r
+       public boolean resume(AsyncReadGraph graph) {\r
+               ReadGraphImpl impl = (ReadGraphImpl)graph;\r
+               return impl.processor.querySupport.resume(impl);\r
+       }\r
+\r
+}\r