import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import org.simantics.db.common.primitiverequest.ValueImplied;
import org.simantics.db.common.primitiverequest.VariantValueImplied;
import org.simantics.db.common.procedure.adapter.AsyncMultiProcedureAdapter;
+import org.simantics.db.common.procedure.adapter.AsyncProcedureAdapter;
import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
import org.simantics.db.common.procedure.adapter.SyncMultiProcedureAdapter;
import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
final static boolean EMPTY_RESOURCE_CHECK = false;
final public CacheEntry parent;
+ public final ReadGraphImpl parentGraph;
final public QueryProcessor processor;
- public AsyncBarrierImpl asyncBarrier = null;
+ public final AsyncBarrierImpl asyncBarrier;
final static Binding DATA_TYPE_BINDING_INTERNAL = Bindings.getBindingUnchecked(Datatype.class);
final static Serializer DATA_TYPE_SERIALIZER = Bindings.getSerializerUnchecked(DATA_TYPE_BINDING_INTERNAL);
@Override
public <T> T syncRequest(final Read<T> request) throws DatabaseException {
-
assert (request != null);
-
- return QueryCache.resultReadEntry(this, request, parent, null, null);
-
+ return (T)QueryCache.runnerReadEntry(this, request, parent, null, null, true);
}
@Override
throws DatabaseException {
assert (request != null);
- asyncBarrier = new AsyncBarrierImpl(null);
- BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(this, null, request);
- syncRequest(request, ap);
- return ap.get();
+ return syncRequest(request, new AsyncProcedureAdapter<>() );
}
ListenerBase listener = getListenerBase(procedure);
- BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(this, procedure, request);
-
- QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true);
-
- return ap.get();
-
- }
-
- final private <T> void syncRequest(final AsyncRead<T> request, final AsyncReadProcedure<T> procedure) throws DatabaseException {
-
- assert (request != null);
-
- ListenerBase listener = getListenerBase(procedure);
- assert(listener == null);
-
- BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(this, procedure, request);
-
- QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true);
-
- ap.get();
+// BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(this, procedure, request);
+ return (T)QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure, true);
+// return ap.get();
}
assert (request != null);
assert (procedure != null);
- processor.schedule(new SessionTask(false) {
+ processor.schedule(new SessionTask(this) {
@Override
- public void run(int thread) {
+ public void run0(int thread) {
try {
final ListenerBase listener = getListenerBase(procedure);
QueryCache.runnerReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false);
}
public static ReadGraphImpl createAsync(QueryProcessor support) {
- return new ReadGraphImpl(null, support);
+ return new ReadGraphImpl(null, null, support);
}
@Override
assert (request != null);
assert (procedure != null);
- processor.schedule(new SessionTask(false) {
+ processor.schedule(new SessionTask(this) {
@Override
- public void run(int thread) {
+ public void run0(int thread) {
try {
final ListenerBase listener = getListenerBase(procedure);
QueryCache.runnerAsyncReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false);
* Internal routines
*/
- protected static String INTERNAL_ERROR_STRING = "Transaction aborted due to internal client error. Contact application support.";
+ protected static String INTERNAL_ERROR_STRING = "Transaction aborted due to internal client error.";
/*
* callerThread is the currently running thread state.syncThread is blocking for
* this execution state.syncParent is the blocking request
*/
- final private boolean isExternal(int thread) {
- return thread == Integer.MIN_VALUE;
+ ReadGraphImpl(ReadGraphImpl parentGraph, CacheEntry parent, QueryProcessor support) {
+ this.parentGraph = parentGraph;
+ this.parent = parent;
+ this.processor = support;
+ this.asyncBarrier = new AsyncBarrierImpl(parentGraph != null ? parentGraph.asyncBarrier : null, parent);
+ }
+
+ ReadGraphImpl(ReadGraphImpl graph, CacheEntry parent) {
+ this(graph, parent, graph.processor);
}
ReadGraphImpl(ReadGraphImpl graph) {
- this(graph.parent, graph.processor);
+ this(graph, graph.parent);
}
- ReadGraphImpl(CacheEntry parent, QueryProcessor support) {
- this.parent = parent;
- this.processor = support;
+ public ReadGraphImpl withParent(CacheEntry parent) {
+ return new ReadGraphImpl(this, parent);
}
- public static ReadGraphImpl create(QueryProcessor support) {
- return new ReadGraphImpl(null, support);
+ public ReadGraphImpl forRecompute(CacheEntry parent) {
+ return new ReadGraphImpl(null, parent, processor);
}
- public static ReadGraphImpl newAsync(ReadGraphImpl parent) {
- ReadGraphImpl result = new ReadGraphImpl(parent);
- result.asyncBarrier = new AsyncBarrierImpl(parent.asyncBarrier);
- return result;
+ public static ReadGraphImpl create(QueryProcessor support) {
+ return new ReadGraphImpl(null, null, support);
}
public ReadGraphImpl newRestart(ReadGraphImpl impl) {
}
- public ReadGraphImpl withParent(CacheEntry parent) {
- if(parent == this.parent) return this;
- else return new ReadGraphImpl(parent, processor);
- }
-
final private ListenerBase getListenerBase(final Object procedure) {
if (procedure instanceof ListenerBase)
return (ListenerBase) procedure;
@Override
public boolean performPending() {
- return processor.performPending(processor.thread.get());
+ return processor.performPending(this);
+ }
+
+ public Set<ReadGraphImpl> ancestorSet() {
+ HashSet<ReadGraphImpl> result = new HashSet<>();
+ ReadGraphImpl g = this;
+ while(g != null) {
+ result.add(g);
+ g = g.parentGraph;
+ }
+ return result;
}
}