]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/DirectPredicates.java
Multiple reader thread support for db client
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / DirectPredicates.java
index 606afa430c1e35e870aaed5e35abbb51612aa0ef..1a006369a1d6867c0c788449f61900eae12d55ee 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2018 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  *******************************************************************************/
 package org.simantics.db.impl.query;
 
-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.impl.procedure.IntProcedureAdapter;
-import org.simantics.db.procedure.ListenerBase;
+import org.simantics.db.impl.procedure.InternalProcedure;
 
-final public class DirectPredicates extends CollectionUnaryQuery<IntProcedure> {
+public final class DirectPredicates extends UnaryQueryP<IntSet> {
 
-       private DirectPredicates(final int resource) {
+       DirectPredicates(final int resource) {
                super(resource);
        }
 
-       final static DirectPredicates entry(final QueryProcessor provider, final int r) {
-
-               return (DirectPredicates)provider.directPredicatesMap.get(r);
-
-       }
-
-       final static void runner(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {
-
-               DirectPredicates entry = (DirectPredicates)provider.directPredicatesMap.get(r);
-               if(entry == null) {
-
-                       entry = new DirectPredicates(r);
-               entry.setPending();
-               entry.clearResult(provider.querySupport);
-               entry.putEntry(provider);
-                       
-                       provider.performForEach(graph, entry, parent, listener, procedure);
-                       
-               } else {
-                       
-                       if(!entry.isReady()) {
-                               synchronized(entry) {
-                                       if(!entry.isReady()) {
-                                               provider.registerDependencies(graph, entry, parent, listener, procedure, false);
-                                               entry.computeForEach(graph, provider, procedure, true);
-                                               return;
-                                       }
-                               }
-                       }
-                       
-                       provider.performForEach(graph, entry, parent, listener, procedure);
-                       
-               }
-
-       }
-
-       final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final IntProcedure procedure) {
-
-               if(parent == null && listener == null) {
-                       DirectPredicates entry = (DirectPredicates)provider.directPredicatesMap.get(r);
-                       if(entry != null && entry.isReady()) { 
-                               entry.performFromCache(graph, provider, procedure);
-                               return;
-                       } else {
-                           computeForEach(graph, r, null, procedure, false);
-                           return;
-                       }
-               }
-
-               runner(graph, r, provider, parent, listener, procedure);
-
-       }
-
-       
-       @Override
-       public void clearResult(QuerySupport support) {
-               // The cached result is never used
-               setResult(INVALID_RESULT);
-       }
-       
        @Override
-       public UnaryQuery<IntProcedure> getEntry(QueryProcessor provider) {
-               return provider.directPredicatesMap.get(id);
+       public final void removeEntry(QueryProcessor provider) {
+               provider.cache.remove(this);
        }
 
        @Override
-       public void putEntry(QueryProcessor provider) {
-               provider.directPredicatesMap.put(id, this);
+       public void compute(ReadGraphImpl graph, InternalProcedure<IntSet> procedure) throws DatabaseException {
+               computeForEach(graph, id, this, procedure);
        }
 
-       @Override
-       final public void removeEntry(QueryProcessor provider) {
-               provider.directPredicatesMap.remove(id);
-       }
+       public static Object computeForEach(ReadGraphImpl graph, int id, final DirectPredicates entry, final InternalProcedure<IntSet> procedure_) throws DatabaseException {
 
-       @Override
-       public Object computeForEach(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure, boolean store) {
-           return computeForEach(graph, id, this, procedure, store);
-       }
-       
-       public static Object computeForEach(ReadGraphImpl graph, int id, final DirectPredicates entry, final IntProcedure procedure, final boolean store) {
+               InternalProcedure<IntSet> procedure = entry != null ? entry : procedure_;
 
                graph.processor.querySupport.ensureLoaded(graph, id);
-               
-               final IntArray list = new IntArray();
+
+               final IntSet list = new IntSet(graph.processor.querySupport);
 
                graph.processor.querySupport.getPredicates(graph, id, new IntProcedure() {
 
@@ -128,17 +58,10 @@ final public class DirectPredicates extends CollectionUnaryQuery<IntProcedure> {
 
                });
 
-               if(entry != null)
-                   entry.finish(graph, graph.processor);
+               procedure.execute(graph, list);
 
-               if(list.data == null) {
-                       if(list.sizeOrData != IntArray.NO_DATA) procedure.execute(graph, list.sizeOrData);
-               } else {
-                       for(int i = 0;i < list.sizeOrData ; i++) procedure.execute(graph, list.data[i]);
-               }
+               if(entry != null) entry.performFromCache(graph, procedure_);
 
-               procedure.finished(graph);
-               
                return list;
 
        }
@@ -148,56 +71,4 @@ final public class DirectPredicates extends CollectionUnaryQuery<IntProcedure> {
                return "DirectPredicates[" + id + "]";
        }
 
-       @Override
-       public void setReady() {
-               statusOrException = READY;
-       }
-       
-       final private void finish(ReadGraphImpl graph, QueryProcessor provider) {
-
-               setReady();
-
-       }
-
-       @Override
-       public Object performFromCache(ReadGraphImpl graph, QueryProcessor provider, IntProcedure procedure) {
-
-               assert(isReady());
-
-               return computeForEach(graph, provider, procedure, false);
-
-       }
-
-       @Override
-       public void recompute(ReadGraphImpl graph, QueryProcessor provider) {
-
-               final Semaphore s = new Semaphore(0);
-
-               computeForEach(graph, provider, new IntProcedureAdapter() {
-
-                       @Override
-                       public void finished(ReadGraphImpl graph) {
-                               s.release();
-                       }
-
-                       @Override
-                       public void exception(ReadGraphImpl graph, Throwable t) {
-                               s.release();
-                               new Error("Error in recompute.", t).printStackTrace();
-                       }
-
-               }, true);
-
-        while(!s.tryAcquire()) {
-               provider.resume(graph);
-        }
-
-       }
-
-
-    @Override
-    boolean isImmutable(ReadGraphImpl graph) {
-       return graph.processor.isImmutable(id);
-    }
-
 }