]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/DirectObjects.java
Generate parts of db client query code
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / DirectObjects.java
index 360e067fa28754aaee943b088e55ae25548b8166..c38a50b561fa643538a4f9bfd0d4dd6a09391a95 100644 (file)
  *******************************************************************************/
 package org.simantics.db.impl.query;
 
-import java.util.Collection;
-import java.util.concurrent.Semaphore;
-
 import org.simantics.db.common.exception.DebugException;
+import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.impl.graph.ReadGraphImpl;
 import org.simantics.db.procedure.ListenerBase;
 import org.simantics.db.request.RequestFlags;
 
 final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
 
-       private DirectObjects(final int r1, final int r2) {
+       DirectObjects(final int r1, final int r2) {
                super(r1, r2);
        }
 
@@ -30,88 +28,36 @@ final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
                return RequestFlags.INVALIDATE;
        }
        
-    @Override
-    public void clearResult(QuerySupport support) {
-       setResult(INVALID_RESULT);
-    }
-
-       final static DirectObjects entry(final QueryProcessor provider, final int r1, final int r2) {
-
-               return (DirectObjects)provider.cache.directObjectsMap.get(id(r1,r2));
-
-       }
-       
-       final static Collection<DirectObjects> entries(final QueryProcessor processor, final int r1) {
-               DoubleKeyQueryHashMap<IntProcedure> hash = processor.cache.directObjectsMap;
-               return hash.values(r1);
-       }
-
-       final static void runner(ReadGraphImpl graph, final int r1, final int r2, CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {
-
-       QueryProcessor processor = graph.processor;
-               
-               DirectObjects entry = (DirectObjects)processor.cache.directObjectsMap.get(id(r1,r2));
-               if(entry == null) {
-                       
-               entry = new DirectObjects(r1, r2);
-               entry.setPending();
-               entry.clearResult(processor.querySupport);
-               entry.putEntry(processor);
-               
-                       processor.performForEach(graph, entry, parent, listener, procedure);
-                       
-               } else {
-                       
-            if(entry.isPending()) {
-                synchronized(entry) {
-                    if(entry.isPending()) {
-                        processor.registerDependencies(graph, entry, parent, listener, procedure, false);
-                                               entry.computeForEach(graph, processor, procedure, true);
-                        return;
-                    }
-                }
-            }
-               
-                       processor.performForEach(graph, entry, parent, listener, procedure);
-                       
-               }
-
-       }
-
-       final public static void queryEach(ReadGraphImpl graph, final int r1, final int r2, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {
-
-        assert(r1 != 0);
-        assert(r2 != 0);
-        
-        if(parent == null && listener == null) {
-               DirectObjects.computeForEach(graph, r1, r2, null, procedure);
-        } else {
-               runner(graph, r1, r2, parent, listener, procedure);
-        }
-
-       }
-
-       @Override
-       public BinaryQuery<IntProcedure> getEntry(QueryProcessor provider) {
-               return provider.cache.directObjectsMap.get(id);
-       }
-
-       @Override
-       public void putEntry(QueryProcessor provider) {
-               provider.cache.directObjectsMap.put(id, this);
-       }
+//    @Override
+//    public void clearResult(QuerySupport support) {
+//     setResult(INVALID_RESULT);
+//    }
+
+//     final public static void queryEach(ReadGraphImpl graph, final int r1, final int r2, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) throws DatabaseException {
+//
+//        assert(r1 != 0);
+//        assert(r2 != 0);
+//        
+//        if(parent == null && listener == null) {
+//             DirectObjects.computeForEach(graph, r1, r2, null, procedure);
+//        } else {
+//             QueryCache.runnerDirectObjects(graph, r1, r2, parent, listener, procedure);
+//        }
+//
+//     }
 
        @Override
        final public void removeEntry(QueryProcessor provider) {
-               provider.cache.directObjectsMap.remove(id);
+               provider.cache.remove(this);
        }
 
        @Override
-       public void computeForEach(ReadGraphImpl graph, final QueryProcessor queryProvider, final IntProcedure procedure, final boolean store) {
+       public Object compute(ReadGraphImpl graph, final IntProcedure procedure) throws DatabaseException {
                computeForEach(graph, r1(), r2(), this, procedure);
+               return getResult();
        }
 
-       static public void computeForEach(ReadGraphImpl graph, int r1, int r2, final DirectObjects entry, final IntProcedure procedure) {
+       static public void computeForEach(ReadGraphImpl graph, int r1, int r2, final DirectObjects entry, final IntProcedure procedure) throws DatabaseException {
 
                QueryProcessor processor = graph.processor;
                
@@ -120,8 +66,9 @@ final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
                processor.querySupport.getObjects(graph, r1, r2, new IntProcedure() {
 
                        @Override
-                       public void execute(ReadGraphImpl graph, int i) {
+                       public void execute(ReadGraphImpl graph, int i) throws DatabaseException {
                                procedure.execute(graph, i);
+                               if(entry != null) entry.add(i);
                        }
 
                        @Override
@@ -150,29 +97,46 @@ final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
                statusOrException = READY;
        }
        
+       final public void add(int add) {
+
+               assert(isPending());
+
+               IntArray value = (IntArray)getResult();
+               value.add(add);
+
+       }
+
        final private void finish(ReadGraphImpl graph, QueryProcessor provider) {
                setReady();
        }
 
        @Override
-       public Object performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {
+       public Object performFromCache(ReadGraphImpl graph, IntProcedure procedure) throws DatabaseException {
 
                assert(isReady());
-               computeForEach(graph, provider, procedure, false);
-               return null;
+
+               if(handleException(graph, procedure)) return getResult();
+
+               final IntArray value = (IntArray)getResult();
+               if(value.data == null) {
+                       if(value.sizeOrData != IntArray.NO_DATA) procedure.execute(graph, value.sizeOrData);
+               } else {
+                       for(int i = 0;i < value.sizeOrData ; i++) procedure.execute(graph, value.data[i]);
+               }
+
+               procedure.finished(graph);
+               
+               return value;
 
        }
 
        @Override
-       public void recompute(ReadGraphImpl graph, QueryProcessor provider) {
-
-        final Semaphore s = new Semaphore(0);
+       public void recompute(ReadGraphImpl graph) throws DatabaseException {
                
-               computeForEach(graph, provider, new IntProcedure() {
+               compute(graph, new IntProcedure() {
 
                        @Override
                        public void finished(ReadGraphImpl graph) {
-                               s.release();
                        }
 
                        @Override
@@ -184,11 +148,7 @@ final public class DirectObjects extends CollectionBinaryQuery<IntProcedure> {
                        public void execute(ReadGraphImpl graphd, int i) {
                        }
 
-               }, true);
-
-        while(!s.tryAcquire()) {
-               provider.resume(graph);
-        }
+               });
 
        }