-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.db.impl.query;\r
-\r
-import org.simantics.db.impl.graph.ReadGraphImpl;\r
-import org.simantics.db.procedure.AsyncProcedure;\r
-import org.simantics.db.procedure.ListenerBase;\r
-import org.simantics.db.procedure.Procedure;\r
-\r
-\r
-final public class DirectStatements /*extends CollectionBinaryQuery<TripleIntProcedure>*/ {\r
-\r
- /*\r
- public DirectStatements(final int r1, final int r2) {\r
- super(r1, r2);\r
- }\r
-\r
- public static DirectStatements newInstance(final int r1, final int r2) {\r
- return new DirectStatements(r1, r2);\r
- }\r
-\r
- final static DirectStatements entry(final QueryProcessor provider, final int r1, final int r2) {\r
-\r
- return (DirectStatements)provider.statementsMap[provider.resourceThread(r1)].get(id(r1,r2));\r
-\r
- }\r
-\r
- final static Collection<DirectStatements> entries(final QueryProcessor processor, final int r1) {\r
- BinaryQueryHashMap<TripleIntProcedure> hash = processor.statementsMap[processor.resourceThread(r1)];\r
- return hash.values(r1);\r
- }\r
- */\r
- \r
- final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final AsyncProcedure<org.simantics.db.DirectStatements> procedure, boolean ignoreVirtual) {\r
-\r
- assert(r != 0);\r
-\r
- org.simantics.db.DirectStatements result = provider.querySupport.getStatements(graph, r, provider, ignoreVirtual);\r
- procedure.execute(graph, result);\r
-\r
- }\r
-\r
- final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final Procedure<org.simantics.db.DirectStatements> procedure) {\r
-\r
- assert(r != 0);\r
-\r
- try {\r
-\r
- org.simantics.db.DirectStatements result = provider.querySupport.getStatements(graph, r, provider, true);\r
- procedure.execute(result);\r
- \r
-// provider.querySupport.getStatements(graph, r, procedure);\r
-\r
- } catch (Throwable t) {\r
-\r
- t.printStackTrace();\r
-\r
- }\r
-\r
- }\r
-\r
- /*\r
- @Override\r
- public BinaryQuery<TripleIntProcedure> getEntry(int callerThread, QueryProcessor provider) {\r
- return provider.statementsMap[callerThread].get(id);\r
- }\r
-\r
- @Override\r
- public void putEntry(int callerThread, QueryProcessor provider) {\r
- provider.statementsMap[callerThread].put(id, this);\r
- }\r
-\r
- @Override\r
- final public void removeEntry(int callerThread, QueryProcessor provider) {\r
- provider.statementsMap[callerThread].remove(id);\r
- }\r
-\r
- final private void forSingleAssertion(ReadGraphImpl graph, final QueryProcessor queryProvider, final TripleIntProcedure procedure) {\r
-\r
- final AtomicInteger results = new AtomicInteger();\r
-\r
- PrincipalTypes.queryEach(graph, r1(), queryProvider, this, null, new SyncIntProcedure() {\r
-\r
- @Override\r
- public void run(ReadGraphImpl graph) {\r
-\r
- int rc = results.get();\r
-\r
- if(isExcepted()) {\r
-\r
- procedure.exception(graph, (Throwable)getResult());\r
-\r
- } else {\r
-\r
- // No result or single result\r
- if(rc == 0 || rc == 1) {\r
-\r
- finish(graph, queryProvider);\r
- procedure.finished(graph);\r
-\r
- } else {\r
-\r
- ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());\r
- except(exception);\r
- procedure.exception(graph, exception);\r
-\r
- }\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int type) {\r
-\r
- inc();\r
-\r
- AssertedStatements.queryEach(graph, type, r2(), queryProvider, DirectStatements.this, null, new TripleIntProcedureAdapter() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int s, int p, int o) {\r
-\r
- int event = results.getAndIncrement();\r
- if(event == 0) {\r
-\r
- addOrSet(s, p, o);\r
- procedure.execute(graph, s, p, o);\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
-\r
- except(t);\r
- dec(graph);\r
-\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- // Search for one statement\r
- final public void computeFunctionalIndex(ReadGraphImpl graph, final QueryProcessor provider, final RelationInfo ri, final TripleIntProcedure procedure, final boolean store) {\r
-\r
- if(ri.isFinal) {\r
-\r
- boolean found = provider.querySupport.getObjects(graph, r1(), r2(), new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
- addOrSet(r1(), r2(), i);\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- if(DebugException.DEBUG) new DebugException(t).printStackTrace();\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- }\r
-\r
- });\r
-\r
- // If functional relation was found there is no need to check assertions\r
- if(found) {\r
-\r
- final IntArray array = (IntArray)getResult();\r
- if(array.size() > 3) {\r
- Throwable exception = new ManyObjectsForFunctionalRelationException("Functional relation " + r2() + " has multiple objects " + Arrays.toString(array.toArray()) + " for subject " + r1());\r
- except(exception);\r
- procedure.exception(graph, exception);\r
- return;\r
- }\r
- procedure.execute(graph, array.data[0], array.data[1], array.data[2]);\r
- finish(graph, provider);\r
- procedure.finished(graph);\r
- return;\r
-\r
- }\r
-\r
- // Check for assertions\r
- forSingleAssertion(graph, provider, procedure);\r
-\r
-\r
- } else {\r
-\r
- final AtomicBoolean found = new AtomicBoolean(false);\r
-\r
- DirectPredicates.queryEach(graph, r1(), provider, DirectStatements.this, null, new SyncIntProcedure() {\r
-\r
- @Override\r
- public void run(ReadGraphImpl graph) {\r
-\r
- if(found.get()) return;\r
-\r
- // Check for assertions\r
- forSingleAssertion(graph, provider, procedure);\r
-\r
- }\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, final int pred) {\r
-\r
- if(found.get()) return;\r
-\r
- if(pred == r2()) {\r
-\r
- inc();\r
-\r
- DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
-\r
- if(found.compareAndSet(false, true)) {\r
-\r
- addOrSet(r1(), pred, i);\r
- finish(graph, provider);\r
- procedure.execute(graph, r1(), pred, i);\r
- procedure.finished(graph);\r
-\r
- } else {\r
-\r
- ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());\r
- except(exception);\r
- procedure.exception(graph, exception);\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- } else {\r
-\r
- inc();\r
-\r
- SuperRelations.queryEach(graph, pred, provider, DirectStatements.this, null, new InternalProcedure<IntSet>() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, IntSet result) {\r
-\r
- if(found.get()) {\r
- dec(graph);\r
- return;\r
- }\r
-\r
- if(result.contains(r2())) {\r
-\r
- inc();\r
-\r
- DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
-\r
- if(found.compareAndSet(false, true)) {\r
-\r
- addOrSet(r1(), pred, i);\r
- finish(graph, provider);\r
- procedure.execute(graph, r1(), pred, i);\r
- procedure.finished(graph);\r
-\r
- } else {\r
-\r
- ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());\r
- except(exception);\r
- procedure.exception(graph, exception);\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- }\r
-\r
- final private void forAssertions(ReadGraphImpl graph, final QueryProcessor queryProvider, final TripleIntProcedure procedure) {\r
-\r
- PrincipalTypes.queryEach(graph, r1(), queryProvider, this, null, new SyncIntProcedure() {\r
-\r
- @Override\r
- public void run(ReadGraphImpl graph) {\r
-\r
- finish(graph, queryProvider);\r
- procedure.finished(graph);\r
-\r
- }\r
-\r
- TripleIntProcedure proc = new TripleIntProcedureAdapter() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int s, int p, int o) {\r
- addOrSet(s, p, o);\r
- procedure.execute(graph, s, p, o);\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- dec(graph);\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- }; \r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int type) {\r
-\r
- inc();\r
-\r
- AssertedStatements.queryEach(graph, type, r2(), queryProvider, DirectStatements.this, null, proc);\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- dec(graph); \r
- }\r
-\r
- });\r
-\r
-\r
- }\r
-\r
- final public void computeNotFunctionalIndex(ReadGraphImpl graph, final QueryProcessor provider, RelationInfo ri, final TripleIntProcedure procedure, final boolean store) {\r
-\r
- if(ri.isFinal) {\r
-\r
- provider.querySupport.getObjects(graph, r1(), r2(), new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
- addOrSet(r1(), r2(), i);\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- if(DebugException.DEBUG) new DebugException(t).printStackTrace();\r
- procedure.exception(graph, t);\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- }\r
-\r
- });\r
-\r
- final IntArray value = (IntArray)getResult();\r
- for(int i=0;i<value.size();i+=3) {\r
- procedure.execute(graph, value.data[i], value.data[i+1], value.data[i+2]);\r
- }\r
-\r
- forAssertions(graph, provider, procedure);\r
-\r
- } else {\r
-\r
- DirectPredicates.queryEach(graph, r1(), provider, DirectStatements.this, null, new SyncIntProcedure() {\r
-\r
- @Override\r
- public void run(ReadGraphImpl graph) {\r
-\r
- forAssertions(graph, provider, procedure);\r
-\r
- }\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, final int pred) {\r
-\r
- // System.out.println("directpredicates execute " + pred);\r
-\r
- if(pred == r2()) {\r
-\r
- inc();\r
-\r
- DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
- // System.out.println("pred=" + pred + " object=" + i);\r
- addOrSet(r1(), pred, i);\r
- procedure.execute(graph, r1(), pred, i);\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- dec(graph);\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- } else {\r
-\r
- inc();\r
-\r
- SuperRelations.queryEach(graph, pred, provider, DirectStatements.this, null, new InternalProcedure<IntSet>() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, IntSet result) {\r
-\r
- if(result.contains(r2())) {\r
-\r
- inc();\r
-\r
- DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, int i) {\r
-\r
- // if(pred == 65548)\r
- // System.out.println("s=" + r1() + "p=" + pred + " o=" + i);\r
-\r
- addOrSet(r1(), pred, i);\r
- procedure.execute(graph, r1(), pred, i);\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- dec(graph);\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- dec(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- dec(graph);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- }\r
-\r
-\r
- @Override\r
- public void computeForEach(ReadGraphImpl graph, final QueryProcessor provider, final TripleIntProcedure procedure, final boolean store) {\r
-\r
- RelationInfoQuery.queryEach(graph, r2(), provider, this, null, new InternalProcedure<RelationInfo>() {\r
-\r
- @Override\r
- public void execute(ReadGraphImpl graph, final RelationInfo ri) {\r
-\r
- provider.querySupport.ensureLoaded(graph, r1(), r2());\r
- if(ri.isFunctional) {\r
- computeFunctionalIndex(graph, provider, ri, procedure, store);\r
- } else {\r
- computeNotFunctionalIndex(graph, provider, ri, procedure, store);\r
- }\r
- \r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- procedure.exception(graph, t);\r
- }\r
-\r
- });\r
-\r
- }\r
-\r
- @Override\r
- public String toString() {\r
- return "Statements[" + r1() + " - " + r2() + "]";\r
- }\r
-\r
- final private void finish(ReadGraphImpl graph, QueryProcessor provider) {\r
-\r
- assert(isPending());\r
-\r
- synchronized(this) {\r
- setReady();\r
- }\r
-\r
- }\r
-\r
- synchronized public void addOrSet(int s, int p, int o) {\r
-\r
- assert(isPending());\r
-\r
- IntArray value = (IntArray)getResult();\r
- value.add(s);\r
- value.add(p);\r
- value.add(o);\r
-\r
- }\r
-\r
- @Override\r
- public void performFromCache(ReadGraphImpl graph, QueryProcessor provider, final TripleIntProcedure procedure) {\r
-\r
- assert(isReady());\r
-\r
- if(handleException(graph, procedure)) return;\r
- \r
- final IntArray value = (IntArray)getResult();\r
- for(int i=0;i<value.size();i+=3) {\r
- procedure.execute(graph, value.data[i], value.data[i+1], value.data[i+2]);\r
- }\r
-\r
- procedure.finished(graph);\r
-\r
- }\r
-\r
- @Override\r
- public void recompute(ReadGraphImpl graph, QueryProcessor provider) {\r
-\r
- final Semaphore s = new Semaphore(0);\r
-\r
- computeForEach(graph, provider, new TripleIntProcedureAdapter() {\r
-\r
- @Override\r
- public void finished(ReadGraphImpl graph) {\r
- s.release();\r
- }\r
-\r
- @Override\r
- public void exception(ReadGraphImpl graph, Throwable t) {\r
- new Error("Error in recompute.", t).printStackTrace();\r
- s.release();\r
- }\r
-\r
- }, true);\r
-\r
- while(!s.tryAcquire()) {\r
- provider.resume(graph);\r
- }\r
-\r
- }\r
-\r
- @Override\r
- public int type() {\r
- return RequestFlags.IMMEDIATE_UPDATE;\r
- }\r
- */\r
-\r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 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
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.db.impl.query;
+
+import org.simantics.db.impl.graph.ReadGraphImpl;
+import org.simantics.db.procedure.AsyncProcedure;
+import org.simantics.db.procedure.ListenerBase;
+import org.simantics.db.procedure.Procedure;
+
+
+final public class DirectStatements /*extends CollectionBinaryQuery<TripleIntProcedure>*/ {
+
+ /*
+ public DirectStatements(final int r1, final int r2) {
+ super(r1, r2);
+ }
+
+ public static DirectStatements newInstance(final int r1, final int r2) {
+ return new DirectStatements(r1, r2);
+ }
+
+ final static DirectStatements entry(final QueryProcessor provider, final int r1, final int r2) {
+
+ return (DirectStatements)provider.statementsMap[provider.resourceThread(r1)].get(id(r1,r2));
+
+ }
+
+ final static Collection<DirectStatements> entries(final QueryProcessor processor, final int r1) {
+ BinaryQueryHashMap<TripleIntProcedure> hash = processor.statementsMap[processor.resourceThread(r1)];
+ return hash.values(r1);
+ }
+ */
+
+ final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final AsyncProcedure<org.simantics.db.DirectStatements> procedure, boolean ignoreVirtual) {
+
+ assert(r != 0);
+
+ org.simantics.db.DirectStatements result = provider.querySupport.getStatements(graph, r, provider, ignoreVirtual);
+ procedure.execute(graph, result);
+
+ }
+
+ final public static void queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final Procedure<org.simantics.db.DirectStatements> procedure) {
+
+ assert(r != 0);
+
+ try {
+
+ org.simantics.db.DirectStatements result = provider.querySupport.getStatements(graph, r, provider, true);
+ procedure.execute(result);
+
+// provider.querySupport.getStatements(graph, r, procedure);
+
+ } catch (Throwable t) {
+
+ t.printStackTrace();
+
+ }
+
+ }
+
+ /*
+ @Override
+ public BinaryQuery<TripleIntProcedure> getEntry(int callerThread, QueryProcessor provider) {
+ return provider.statementsMap[callerThread].get(id);
+ }
+
+ @Override
+ public void putEntry(int callerThread, QueryProcessor provider) {
+ provider.statementsMap[callerThread].put(id, this);
+ }
+
+ @Override
+ final public void removeEntry(int callerThread, QueryProcessor provider) {
+ provider.statementsMap[callerThread].remove(id);
+ }
+
+ final private void forSingleAssertion(ReadGraphImpl graph, final QueryProcessor queryProvider, final TripleIntProcedure procedure) {
+
+ final AtomicInteger results = new AtomicInteger();
+
+ PrincipalTypes.queryEach(graph, r1(), queryProvider, this, null, new SyncIntProcedure() {
+
+ @Override
+ public void run(ReadGraphImpl graph) {
+
+ int rc = results.get();
+
+ if(isExcepted()) {
+
+ procedure.exception(graph, (Throwable)getResult());
+
+ } else {
+
+ // No result or single result
+ if(rc == 0 || rc == 1) {
+
+ finish(graph, queryProvider);
+ procedure.finished(graph);
+
+ } else {
+
+ ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());
+ except(exception);
+ procedure.exception(graph, exception);
+
+ }
+
+ }
+
+ }
+
+ @Override
+ public void execute(ReadGraphImpl graph, int type) {
+
+ inc();
+
+ AssertedStatements.queryEach(graph, type, r2(), queryProvider, DirectStatements.this, null, new TripleIntProcedureAdapter() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int s, int p, int o) {
+
+ int event = results.getAndIncrement();
+ if(event == 0) {
+
+ addOrSet(s, p, o);
+ procedure.execute(graph, s, p, o);
+
+ }
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+
+ dec(graph);
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+
+ except(t);
+ dec(graph);
+
+ }
+
+ });
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+
+ dec(graph);
+
+ }
+
+ });
+
+ }
+
+ // Search for one statement
+ final public void computeFunctionalIndex(ReadGraphImpl graph, final QueryProcessor provider, final RelationInfo ri, final TripleIntProcedure procedure, final boolean store) {
+
+ if(ri.isFinal) {
+
+ boolean found = provider.querySupport.getObjects(graph, r1(), r2(), new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+ addOrSet(r1(), r2(), i);
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ if(DebugException.DEBUG) new DebugException(t).printStackTrace();
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ }
+
+ });
+
+ // If functional relation was found there is no need to check assertions
+ if(found) {
+
+ final IntArray array = (IntArray)getResult();
+ if(array.size() > 3) {
+ Throwable exception = new ManyObjectsForFunctionalRelationException("Functional relation " + r2() + " has multiple objects " + Arrays.toString(array.toArray()) + " for subject " + r1());
+ except(exception);
+ procedure.exception(graph, exception);
+ return;
+ }
+ procedure.execute(graph, array.data[0], array.data[1], array.data[2]);
+ finish(graph, provider);
+ procedure.finished(graph);
+ return;
+
+ }
+
+ // Check for assertions
+ forSingleAssertion(graph, provider, procedure);
+
+
+ } else {
+
+ final AtomicBoolean found = new AtomicBoolean(false);
+
+ DirectPredicates.queryEach(graph, r1(), provider, DirectStatements.this, null, new SyncIntProcedure() {
+
+ @Override
+ public void run(ReadGraphImpl graph) {
+
+ if(found.get()) return;
+
+ // Check for assertions
+ forSingleAssertion(graph, provider, procedure);
+
+ }
+
+ @Override
+ public void execute(ReadGraphImpl graph, final int pred) {
+
+ if(found.get()) return;
+
+ if(pred == r2()) {
+
+ inc();
+
+ DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+
+ if(found.compareAndSet(false, true)) {
+
+ addOrSet(r1(), pred, i);
+ finish(graph, provider);
+ procedure.execute(graph, r1(), pred, i);
+ procedure.finished(graph);
+
+ } else {
+
+ ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());
+ except(exception);
+ procedure.exception(graph, exception);
+
+ }
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+
+ dec(graph);
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ } else {
+
+ inc();
+
+ SuperRelations.queryEach(graph, pred, provider, DirectStatements.this, null, new InternalProcedure<IntSet>() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, IntSet result) {
+
+ if(found.get()) {
+ dec(graph);
+ return;
+ }
+
+ if(result.contains(r2())) {
+
+ inc();
+
+ DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+
+ if(found.compareAndSet(false, true)) {
+
+ addOrSet(r1(), pred, i);
+ finish(graph, provider);
+ procedure.execute(graph, r1(), pred, i);
+ procedure.finished(graph);
+
+ } else {
+
+ ManyObjectsForFunctionalRelationException exception = new ManyObjectsForFunctionalRelationException("Functional relation has more than one statement.", r1());
+ except(exception);
+ procedure.exception(graph, exception);
+
+ }
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+
+ dec(graph);
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ }
+
+ dec(graph);
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ }
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+
+ dec(graph);
+
+ }
+
+ });
+
+ }
+
+ }
+
+ final private void forAssertions(ReadGraphImpl graph, final QueryProcessor queryProvider, final TripleIntProcedure procedure) {
+
+ PrincipalTypes.queryEach(graph, r1(), queryProvider, this, null, new SyncIntProcedure() {
+
+ @Override
+ public void run(ReadGraphImpl graph) {
+
+ finish(graph, queryProvider);
+ procedure.finished(graph);
+
+ }
+
+ TripleIntProcedure proc = new TripleIntProcedureAdapter() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int s, int p, int o) {
+ addOrSet(s, p, o);
+ procedure.execute(graph, s, p, o);
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ dec(graph);
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ };
+
+ @Override
+ public void execute(ReadGraphImpl graph, int type) {
+
+ inc();
+
+ AssertedStatements.queryEach(graph, type, r2(), queryProvider, DirectStatements.this, null, proc);
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ dec(graph);
+ }
+
+ });
+
+
+ }
+
+ final public void computeNotFunctionalIndex(ReadGraphImpl graph, final QueryProcessor provider, RelationInfo ri, final TripleIntProcedure procedure, final boolean store) {
+
+ if(ri.isFinal) {
+
+ provider.querySupport.getObjects(graph, r1(), r2(), new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+ addOrSet(r1(), r2(), i);
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ if(DebugException.DEBUG) new DebugException(t).printStackTrace();
+ procedure.exception(graph, t);
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ }
+
+ });
+
+ final IntArray value = (IntArray)getResult();
+ for(int i=0;i<value.size();i+=3) {
+ procedure.execute(graph, value.data[i], value.data[i+1], value.data[i+2]);
+ }
+
+ forAssertions(graph, provider, procedure);
+
+ } else {
+
+ DirectPredicates.queryEach(graph, r1(), provider, DirectStatements.this, null, new SyncIntProcedure() {
+
+ @Override
+ public void run(ReadGraphImpl graph) {
+
+ forAssertions(graph, provider, procedure);
+
+ }
+
+ @Override
+ public void execute(ReadGraphImpl graph, final int pred) {
+
+ // System.out.println("directpredicates execute " + pred);
+
+ if(pred == r2()) {
+
+ inc();
+
+ DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+ // System.out.println("pred=" + pred + " object=" + i);
+ addOrSet(r1(), pred, i);
+ procedure.execute(graph, r1(), pred, i);
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ dec(graph);
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ } else {
+
+ inc();
+
+ SuperRelations.queryEach(graph, pred, provider, DirectStatements.this, null, new InternalProcedure<IntSet>() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, IntSet result) {
+
+ if(result.contains(r2())) {
+
+ inc();
+
+ DirectObjects.queryEach(graph, r1(), pred, provider, DirectStatements.this, null, new IntProcedure() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, int i) {
+
+ // if(pred == 65548)
+ // System.out.println("s=" + r1() + "p=" + pred + " o=" + i);
+
+ addOrSet(r1(), pred, i);
+ procedure.execute(graph, r1(), pred, i);
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ dec(graph);
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ }
+
+ dec(graph);
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ }
+
+ }
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ dec(graph);
+ }
+
+ });
+
+ }
+
+ }
+
+
+ @Override
+ public void computeForEach(ReadGraphImpl graph, final QueryProcessor provider, final TripleIntProcedure procedure, final boolean store) {
+
+ RelationInfoQuery.queryEach(graph, r2(), provider, this, null, new InternalProcedure<RelationInfo>() {
+
+ @Override
+ public void execute(ReadGraphImpl graph, final RelationInfo ri) {
+
+ provider.querySupport.ensureLoaded(graph, r1(), r2());
+ if(ri.isFunctional) {
+ computeFunctionalIndex(graph, provider, ri, procedure, store);
+ } else {
+ computeNotFunctionalIndex(graph, provider, ri, procedure, store);
+ }
+
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ procedure.exception(graph, t);
+ }
+
+ });
+
+ }
+
+ @Override
+ public String toString() {
+ return "Statements[" + r1() + " - " + r2() + "]";
+ }
+
+ final private void finish(ReadGraphImpl graph, QueryProcessor provider) {
+
+ assert(isPending());
+
+ synchronized(this) {
+ setReady();
+ }
+
+ }
+
+ synchronized public void addOrSet(int s, int p, int o) {
+
+ assert(isPending());
+
+ IntArray value = (IntArray)getResult();
+ value.add(s);
+ value.add(p);
+ value.add(o);
+
+ }
+
+ @Override
+ public void performFromCache(ReadGraphImpl graph, QueryProcessor provider, final TripleIntProcedure procedure) {
+
+ assert(isReady());
+
+ if(handleException(graph, procedure)) return;
+
+ final IntArray value = (IntArray)getResult();
+ for(int i=0;i<value.size();i+=3) {
+ procedure.execute(graph, value.data[i], value.data[i+1], value.data[i+2]);
+ }
+
+ procedure.finished(graph);
+
+ }
+
+ @Override
+ public void recompute(ReadGraphImpl graph, QueryProcessor provider) {
+
+ final Semaphore s = new Semaphore(0);
+
+ computeForEach(graph, provider, new TripleIntProcedureAdapter() {
+
+ @Override
+ public void finished(ReadGraphImpl graph) {
+ s.release();
+ }
+
+ @Override
+ public void exception(ReadGraphImpl graph, Throwable t) {
+ new Error("Error in recompute.", t).printStackTrace();
+ s.release();
+ }
+
+ }, true);
+
+ while(!s.tryAcquire()) {
+ provider.resume(graph);
+ }
+
+ }
+
+ @Override
+ public int type() {
+ return RequestFlags.IMMEDIATE_UPDATE;
+ }
+ */
+
+}