1 package fi.vtt.simantics.procore.internal;
3 import java.util.Collection;
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;
21 public class QueryControlImpl implements QueryControl {
23 private static final Logger LOGGER = LoggerFactory.getLogger(QueryControlImpl.class);
25 final private SessionImplSocket session;
27 QueryControlImpl(SessionImplSocket session) {
28 this.session = session;
32 public int getAmountOfQueryThreads() {
33 return session.getAmountOfQueryThreads();
37 public int getGraphThread(AsyncReadGraph graph) {
43 final DataContainer<Integer> result = new DataContainer<Integer>();
45 session.syncRequest(new WriteRequest() {
48 public void perform(WriteGraph graph) throws DatabaseException {
49 result.set(session.queryProvider2.clean());
53 } catch (DatabaseException e) {
54 LOGGER.error("query flush failed", e);
60 public int flush(ReadGraph graph) {
61 return session.queryProvider2.clean();
66 return session.queryProvider2.querySize();
70 public void gc(ReadGraph graph, int allowedTimeInMs) {
72 session.queryProvider2.gc(20, allowedTimeInMs);
76 public void gc(final Collection<ExternalRead<?>> requests) {
78 session.syncRequest(new WriteRequest() {
80 public void perform(WriteGraph graph) throws DatabaseException {
84 } catch (DatabaseException e) {
85 LOGGER.error("query gc failed", e);
90 public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {
92 throw new IllegalArgumentException("null WriteGraph");
94 throw new IllegalArgumentException("null requests");
95 session.queryProvider2.clean(requests);
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();
107 // AsyncReadGraph targetGraph = impl.newAsync();
108 procedure.execute(impl, resource);
109 // impl.state.barrier.dec();
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();
124 // AsyncReadGraph targetGraph = impl.newAsync();
125 procedure.execute(impl, context, resource);
126 // impl.state.barrier.dec();
132 public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {
133 final ReadGraphImpl impl = (ReadGraphImpl)graph;
135 // impl.state.barrier.inc();
137 // AsyncReadGraph targetGraph = impl.newAsync();
138 procedure.execute(impl);
139 // impl.state.barrier.dec();
144 public ReadGraph getIndependentGraph(ReadGraph graph) {
145 ReadGraphImpl impl = (ReadGraphImpl)graph;
146 return impl.withParent(null, null, false);
150 public boolean hasParentRequest(ReadGraph graph) {
151 ReadGraphImpl impl = (ReadGraphImpl)graph;
152 return impl.parent != null;
156 public boolean resume(ReadGraph graph) {
157 ReadGraphImpl impl = (ReadGraphImpl)graph;
158 return impl.processor.querySupport.resume(impl);