1 package fi.vtt.simantics.procore.internal;
\r
3 import java.util.Collection;
\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
19 public class QueryControlImpl implements QueryControl {
\r
21 final private SessionImplSocket session;
\r
23 QueryControlImpl(SessionImplSocket session) {
\r
24 this.session = session;
\r
28 public int getAmountOfQueryThreads() {
\r
29 return session.getAmountOfQueryThreads();
\r
33 public int getGraphThread(AsyncReadGraph graph) {
\r
38 public int flush() {
\r
39 final DataContainer<Integer> result = new DataContainer<Integer>();
\r
41 session.syncRequest(new WriteRequest() {
\r
44 public void perform(WriteGraph graph) throws DatabaseException {
\r
45 result.set(session.queryProvider2.clean());
\r
49 } catch (DatabaseException e) {
\r
50 e.printStackTrace();
\r
52 return result.get();
\r
56 public int flush(ReadGraph graph) {
\r
57 return session.queryProvider2.clean();
\r
61 public int count() {
\r
62 return session.queryProvider2.querySize();
\r
66 public void gc(ReadGraph graph, int allowedTimeInMs) {
\r
68 session.queryProvider2.gc(20, allowedTimeInMs);
\r
72 public void gc(final Collection<ExternalRead<?>> requests) {
\r
74 session.syncRequest(new WriteRequest() {
\r
76 public void perform(WriteGraph graph) throws DatabaseException {
\r
77 gc(graph, requests);
\r
80 } catch (DatabaseException e) {
\r
81 e.printStackTrace();
\r
86 public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {
\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
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
103 // AsyncReadGraph targetGraph = impl.newAsync();
\r
104 procedure.execute(impl, resource);
\r
105 // impl.state.barrier.dec();
\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
120 // AsyncReadGraph targetGraph = impl.newAsync();
\r
121 procedure.execute(impl, context, resource);
\r
122 // impl.state.barrier.dec();
\r
128 public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {
\r
129 final ReadGraphImpl impl = (ReadGraphImpl)graph;
\r
131 // impl.state.barrier.inc();
\r
133 // AsyncReadGraph targetGraph = impl.newAsync();
\r
134 procedure.execute(impl);
\r
135 // impl.state.barrier.dec();
\r
140 public ReadGraph getIndependentGraph(ReadGraph graph) {
\r
141 ReadGraphImpl impl = (ReadGraphImpl)graph;
\r
142 return impl.withParent(null);
\r
146 public boolean hasParentRequest(ReadGraph graph) {
\r
147 ReadGraphImpl impl = (ReadGraphImpl)graph;
\r
148 return impl.parent != null;
\r
152 public boolean resume(AsyncReadGraph graph) {
\r
153 ReadGraphImpl impl = (ReadGraphImpl)graph;
\r
154 return impl.processor.querySupport.resume(impl);
\r