]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java
Still working for multiple readers
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / graph / ReadGraphImpl.java
index c6e41f6189dec87cd4022f5712c08e9701d2b58c..f0147e047e001cf6f82d809a269aec65e100ed13 100644 (file)
@@ -88,6 +88,7 @@ import org.simantics.db.common.primitiverequest.UniqueAdapter;
 import org.simantics.db.common.primitiverequest.Value;
 import org.simantics.db.common.primitiverequest.ValueImplied;
 import org.simantics.db.common.primitiverequest.VariantValueImplied;
+import org.simantics.db.common.procedure.BlockingAsyncProcedure;
 import org.simantics.db.common.procedure.adapter.AsyncMultiProcedureAdapter;
 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
@@ -136,6 +137,7 @@ import org.simantics.db.impl.ResourceImpl;
 import org.simantics.db.impl.internal.RandomAccessValueSupport;
 import org.simantics.db.impl.internal.ResourceData;
 import org.simantics.db.impl.procedure.CallWrappedSingleQueryProcedure4;
+import org.simantics.db.impl.procedure.InternalProcedure;
 import org.simantics.db.impl.procedure.ResultCallWrappedQueryProcedure4;
 import org.simantics.db.impl.procedure.ResultCallWrappedSingleQueryProcedure4;
 import org.simantics.db.impl.query.CacheEntry;
@@ -144,6 +146,7 @@ import org.simantics.db.impl.query.QueryCacheBase;
 import org.simantics.db.impl.query.QueryProcessor;
 import org.simantics.db.impl.query.QuerySupport;
 import org.simantics.db.impl.query.TripleIntProcedure;
+import org.simantics.db.impl.query.QueryProcessor.SessionTask;
 import org.simantics.db.impl.support.ResourceSupport;
 import org.simantics.db.procedure.AsyncListener;
 import org.simantics.db.procedure.AsyncMultiListener;
@@ -283,8 +286,17 @@ public class ReadGraphImpl implements ReadGraph {
 
                try {
 
-                       return syncRequest(new org.simantics.db.common.primitiverequest.Resource(
-                                       id));
+//                     assert (id != null);
+//                     assert (procedure != null);
+//
+//                     processor.forResource(this, id, procedure);
+//
+////                   return syncRequest(new org.simantics.db.common.primitiverequest.Resource(
+////                                   id));
+                       
+                       Integer rid = QueryCache.resultURIToResource(this, id, parent, null);
+                       if(rid == 0) throw new ResourceNotFoundException(id);
+                       return processor.querySupport.getResource(rid);
 
                } catch (ResourceNotFoundException e) {
 
@@ -314,8 +326,10 @@ public class ReadGraphImpl implements ReadGraph {
 
                try {
 
-                       return syncRequest(new org.simantics.db.common.primitiverequest.Resource(
-                                       id));
+                       return getResource(id);
+                       
+//                     return syncRequest(new org.simantics.db.common.primitiverequest.Resource(
+//                                     id));
 
                } catch (ResourceNotFoundException e) {
                        
@@ -2050,10 +2064,12 @@ public class ReadGraphImpl implements ReadGraph {
                        throws DatabaseException {
 
                assert (request != null);
-               AsyncReadProcedure<T> procedure = new AsyncReadProcedure<T>();
-               syncRequest(request, procedure);
-               procedure.checkAndThrow();
-               return procedure.result;
+//             AsyncReadProcedure<T> procedure = new AsyncReadProcedure<T>();
+               BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(null, request);
+               syncRequest(request, ap);
+               return ap.get();
+//             procedure.checkAndThrow();
+//             return procedure.result;
                
 //             return syncRequest(request, new AsyncProcedureAdapter<T>());
 
@@ -2085,14 +2101,18 @@ public class ReadGraphImpl implements ReadGraph {
 
                ListenerBase listener = getListenerBase(procedure);
 
-               final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(
-                               procedure, request);
+               BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(procedure, request);
+               
+//             final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(
+//                             procedure, request);
                
-               QueryCache.runnerAsyncReadEntry(this, request, parent, listener, wrapper);
+               QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true);
                
                //processor.query(this, request, parent, wrapper, listener);
                
-               return wrapper.getResult();
+               return ap.get();
+               
+//             return wrapper.getResult();
 
 //             if (parent != null || listener != null || ((request.getFlags() & RequestFlags.SCHEDULE) > 0)) {
 //
@@ -2160,10 +2180,14 @@ public class ReadGraphImpl implements ReadGraph {
                ListenerBase listener = getListenerBase(procedure);
                assert(listener == null);
 
+               BlockingAsyncProcedure<T> ap = new BlockingAsyncProcedure<>(procedure, request);
+               
 //             final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(
 //                             procedure, request);
 
-               QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure);
+               QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true);
+               
+               ap.get();
 
        }
 
@@ -5400,47 +5424,64 @@ public class ReadGraphImpl implements ReadGraph {
 
                assert (request != null);
                assert (procedure != null);
+       
+               processor.schedule(Integer.MIN_VALUE, new SessionTask(request, processor.THREAD_MASK+1, -1) {
 
-               final ListenerBase listener = getListenerBase(procedure);
-
-               if (parent != null || listener != null) {
-
-                       try {
-                               QueryCache.runnerReadEntry(this, request, parent, listener, procedure);
-                               //processor.query(this, request, parent, procedure,listener);
-                       } catch (DatabaseException e) {
-                               Logger.defaultLogError(e);
-                               // This throwable has already been transferred to procedure at this point - do nothing about it
-                               //
-                       }
-                       
-               } else {
-
-//                     final ReadGraphImpl newGraph = newSync();
-
-                       try {
-
-                               T result = request.perform(this);
-                               
-                               try {
-                                       procedure.execute(this, result);
-                               } catch (Throwable t) {
-                                       Logger.defaultLogError(t);
-                               }
-
-                       } catch (Throwable t) {
-
+                       @Override
+                       public void run(int thread) {
                                try {
-                                       procedure.exception(this, t);
-                               } catch (Throwable t2) {
-                                       Logger.defaultLogError(t2);
+                                       final ListenerBase listener = getListenerBase(procedure);
+                                       QueryCache.runnerReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false);
+                               } catch (DatabaseException e) {
+                                       Logger.defaultLogError(e);
                                }
-
-                       } finally {
-
                        }
+                       
+               });
 
-               }
+               
+//             quer
+//
+//             final ListenerBase listener = getListenerBase(procedure);
+//
+//             if (parent != null || listener != null) {
+//
+//                     try {
+//                             QueryCache.runnerReadEntry(this, request, parent, listener, procedure);
+//                             //processor.query(this, request, parent, procedure,listener);
+//                     } catch (DatabaseException e) {
+//                             Logger.defaultLogError(e);
+//                             // This throwable has already been transferred to procedure at this point - do nothing about it
+//                             //
+//                     }
+//                     
+//             } else {
+//
+////                   final ReadGraphImpl newGraph = newSync();
+//
+//                     try {
+//
+//                             T result = request.perform(this);
+//                             
+//                             try {
+//                                     procedure.execute(this, result);
+//                             } catch (Throwable t) {
+//                                     Logger.defaultLogError(t);
+//                             }
+//
+//                     } catch (Throwable t) {
+//
+//                             try {
+//                                     procedure.exception(this, t);
+//                             } catch (Throwable t2) {
+//                                     Logger.defaultLogError(t2);
+//                             }
+//
+//                     } finally {
+//
+//                     }
+//
+//             }
 
        }
 
@@ -5512,38 +5553,55 @@ public class ReadGraphImpl implements ReadGraph {
                assert (request != null);
                assert (procedure != null);
 
-               final ListenerBase listener = getListenerBase(procedure);
+               //final ListenerBase listener = getListenerBase(procedure);
 
-               if (parent != null || listener != null) {
+               processor.schedule(Integer.MIN_VALUE, new SessionTask(request, processor.THREAD_MASK+1, -1) {
 
-                       try {
-                               QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure);
-                               //processor.query(this, request, parent, procedure, listener);
-                       } catch (DatabaseException e) {
-                               Logger.defaultLogError(e);
+                       @Override
+                       public void run(int thread) {
+                               try {
+                                       final ListenerBase listener = getListenerBase(procedure);
+                                       QueryCache.runnerAsyncReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false);
+                               } catch (DatabaseException e) {
+                                       Logger.defaultLogError(e);
+                               }
                        }
+                       
+               });
 
-               } else {
-
-                       try {
-                               
-                               request.perform(this, new CallWrappedSingleQueryProcedure4<T>(procedure, request));
-
-                       } catch (Throwable t) {
-
-                               if (t instanceof DatabaseException)
-                                       procedure.exception(this, t);
-                               else
-                                       procedure
-                                                       .exception(
-                                                                       this,
-                                                                       new DatabaseException(
-                                                                                       "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)",
-                                                                                       t));
+               
 
-                       }
 
-               }
+//             if (parent != null || listener != null) {
+//
+//                     try {
+//                             QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure);
+//                             //processor.query(this, request, parent, procedure, listener);
+//                     } catch (DatabaseException e) {
+//                             Logger.defaultLogError(e);
+//                     }
+//
+//             } else {
+//
+//                     try {
+//                             
+//                             request.perform(this, new CallWrappedSingleQueryProcedure4<T>(procedure, request));
+//
+//                     } catch (Throwable t) {
+//
+//                             if (t instanceof DatabaseException)
+//                                     procedure.exception(this, t);
+//                             else
+//                                     procedure
+//                                                     .exception(
+//                                                                     this,
+//                                                                     new DatabaseException(
+//                                                                                     "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)",
+//                                                                                     t));
+//
+//                     }
+//
+//             }
 
        }