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.request.Read;
17 import org.simantics.db.service.QueryControl;
18 import org.simantics.utils.DataContainer;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
22 public class QueryControlImpl implements QueryControl {
24 private static final Logger LOGGER = LoggerFactory.getLogger(QueryControlImpl.class);
26 final private SessionImplSocket session;
28 QueryControlImpl(SessionImplSocket session) {
29 this.session = session;
33 public int getAmountOfQueryThreads() {
34 return session.getAmountOfQueryThreads();
38 public int getGraphThread(AsyncReadGraph graph) {
44 final DataContainer<Integer> result = new DataContainer<Integer>();
46 session.syncRequest(new WriteRequest() {
49 public void perform(WriteGraph graph) throws DatabaseException {
50 result.set(session.queryProvider2.clean());
54 } catch (DatabaseException e) {
55 LOGGER.error("query flush failed", e);
61 public int flush(ReadGraph graph) {
62 return session.queryProvider2.clean();
67 return session.queryProvider2.querySize();
71 public void gc(ReadGraph graph, int allowedTimeInMs) {
73 session.queryProvider2.gc(20, allowedTimeInMs);
77 public void gc(final Collection<ExternalRead<?>> requests) {
79 session.syncRequest(new WriteRequest() {
81 public void perform(WriteGraph graph) throws DatabaseException {
85 } catch (DatabaseException e) {
86 LOGGER.error("query gc failed", e);
91 public void gc(WriteGraph graph, final Collection<ExternalRead<?>> requests) {
93 throw new IllegalArgumentException("null WriteGraph");
95 throw new IllegalArgumentException("null requests");
96 session.queryProvider2.clean(requests);
100 public boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final AsyncMultiProcedure<Resource> procedure) {
101 final ReadGraphImpl impl = (ReadGraphImpl)graph;
102 ResourceImpl res = (ResourceImpl)resource;
103 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
104 if(0 == targetThread) return true;
105 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
106 // impl.state.barrier.inc();
108 // AsyncReadGraph targetGraph = impl.newAsync();
109 procedure.execute(impl, resource);
110 // impl.state.barrier.dec();
117 public <C> boolean scheduleByCluster(AsyncReadGraph graph, final Resource resource, final C context, final AsyncContextMultiProcedure<C, Resource> procedure) {
118 final ReadGraphImpl impl = (ReadGraphImpl)graph;
119 ResourceImpl res = (ResourceImpl)resource;
120 int targetThread = ((res.id >>> 16) & session.queryProvider2.THREAD_MASK);
121 if(0 == targetThread) return true;
122 //System.err.println("scheduleByCluster[" + res.id + "|" + (res.id>>>16) + "] " + impl.callerThread + " -> " + targetThread);
123 // impl.state.barrier.inc();
125 // AsyncReadGraph targetGraph = impl.newAsync();
126 procedure.execute(impl, context, resource);
127 // impl.state.barrier.dec();
133 public void schedule(AsyncReadGraph graph, int targetThread, final ControlProcedure procedure) {
134 final ReadGraphImpl impl = (ReadGraphImpl)graph;
136 // impl.state.barrier.inc();
138 // AsyncReadGraph targetGraph = impl.newAsync();
139 procedure.execute(impl);
140 // impl.state.barrier.dec();
145 public ReadGraph getIndependentGraph(ReadGraph graph) {
146 ReadGraphImpl impl = (ReadGraphImpl)graph;
147 return impl.withParent(null, null, false);
151 public <T> T syncRequestIndependent(ReadGraph graph, Read<T> request) throws DatabaseException {
152 ReadGraphImpl independent = ((ReadGraphImpl)graph).withParent(null, null, false);
153 independent.asyncBarrier.inc();
155 return independent.syncRequest(request);
157 independent.asyncBarrier.dec();
162 public boolean hasParentRequest(ReadGraph graph) {
163 ReadGraphImpl impl = (ReadGraphImpl)graph;
164 return impl.parent != null;
168 public boolean resume(ReadGraph graph) {
169 ReadGraphImpl impl = (ReadGraphImpl)graph;
170 return impl.processor.querySupport.resume(impl);