X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.procore%2Fsrc%2Ffi%2Fvtt%2Fsimantics%2Fprocore%2Finternal%2FDirectQuerySupportImpl.java;fp=bundles%2Forg.simantics.db.procore%2Fsrc%2Ffi%2Fvtt%2Fsimantics%2Fprocore%2Finternal%2FDirectQuerySupportImpl.java;h=bad6916dd3727927ebb1c3e44d06ec50bd25b98e;hb=6326b65c5c6a785aadcb615cb95ceadd8f53964a;hp=0b640861e1d6af93255b25114c429b2f374ce54f;hpb=6d56f5ff3422fd5200d396d325422a4ccaf19f94;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/DirectQuerySupportImpl.java b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/DirectQuerySupportImpl.java index 0b640861e..bad6916dd 100644 --- a/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/DirectQuerySupportImpl.java +++ b/bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/DirectQuerySupportImpl.java @@ -1,12 +1,9 @@ package fi.vtt.simantics.procore.internal; -import org.simantics.db.AsyncReadGraph; import org.simantics.db.DirectStatements; import org.simantics.db.ReadGraph; import org.simantics.db.RelationInfo; import org.simantics.db.Resource; -import org.simantics.db.common.procedure.wrapper.NoneToAsyncProcedure; -import org.simantics.db.common.procedure.wrapper.SyncToAsyncProcedure; import org.simantics.db.exception.AssumptionException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.NoSingleResultException; @@ -19,18 +16,15 @@ import org.simantics.db.impl.ForPossibleRelatedValueProcedure; import org.simantics.db.impl.ResourceImpl; import org.simantics.db.impl.TransientGraph; import org.simantics.db.impl.graph.ReadGraphImpl; -import org.simantics.db.procedure.AsyncContextMultiProcedure; -import org.simantics.db.procedure.AsyncContextProcedure; -import org.simantics.db.procedure.AsyncMultiProcedure; -import org.simantics.db.procedure.AsyncProcedure; -import org.simantics.db.procedure.Procedure; +import org.simantics.db.procedure.SyncContextMultiProcedure; +import org.simantics.db.procedure.SyncContextProcedure; +import org.simantics.db.procedure.SyncMultiProcedure; import org.simantics.db.procedure.SyncProcedure; import org.simantics.db.procore.cluster.ClusterBig; import org.simantics.db.procore.cluster.ClusterImpl; import org.simantics.db.procore.cluster.ClusterSmall; import org.simantics.db.procore.cluster.ResourceTableSmall; import org.simantics.db.procore.cluster.ValueTableSmall; -import org.simantics.db.request.AsyncRead; import org.simantics.db.service.DirectQuerySupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,18 +40,18 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } @Override - final public void forEachDirectPersistentStatement(AsyncReadGraph graph, final Resource subject, final AsyncProcedure procedure) { + final public DirectStatements getDirectPersistentStatements(ReadGraph graph, final Resource subject) { ReadGraphImpl impl = (ReadGraphImpl)graph; - impl.processor.forEachDirectStatement(impl, subject, procedure, true); + return impl.processor.getDirectStatements(impl, subject, true); } @Override - final public void forEachDirectStatement(AsyncReadGraph graph, final Resource subject, final AsyncProcedure procedure) { + final public DirectStatements getDirectStatements(ReadGraph graph, final Resource subject) { ReadGraphImpl impl = (ReadGraphImpl)graph; - impl.processor.forEachDirectStatement(impl, subject, procedure, false); + return impl.processor.getDirectStatements(impl, subject, false); } - @Override + /*@Override public void forEachDirectStatement(AsyncReadGraph graph, Resource subject, SyncProcedure procedure) { forEachDirectStatement(graph, subject, new SyncToAsyncProcedure(procedure)); } @@ -66,9 +60,9 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { public void forEachDirectStatement(AsyncReadGraph graph, Resource subject, Procedure procedure) { ReadGraphImpl impl = (ReadGraphImpl)graph; impl.processor.forEachDirectStatement(impl, subject, procedure); - } + }*/ - @Override + /*@Override public void forRelationInfo(AsyncReadGraph graph, Resource subject, AsyncProcedure procedure) { ReadGraphImpl impl = (ReadGraphImpl)graph; impl.processor.forRelationInfo(impl, subject, procedure); @@ -82,130 +76,52 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { @Override public void forRelationInfo(AsyncReadGraph graph, Resource subject, Procedure procedure) { forRelationInfo(graph, subject, new NoneToAsyncProcedure(procedure)); + }*/ + + @Override + public RelationInfo getRelationInfo(ReadGraph graph, Resource subject) throws DatabaseException { + ReadGraphImpl impl = (ReadGraphImpl)graph; + return impl.processor.getRelationInfo(impl, subject); } @Override - public AsyncMultiProcedure compileForEachObject(ReadGraph graph, final Resource relation, AsyncMultiProcedure user) { + public SyncMultiProcedure compileForEachObject(ReadGraph graph, final Resource relation, SyncMultiProcedure user) throws DatabaseException { - try { - RelationInfo info = graph.syncRequest(new AsyncRead() { - - @Override - public void perform(AsyncReadGraph graph, AsyncProcedure procedure) { - forRelationInfo(graph, relation, procedure); - } - - @Override - public int threadHash() { - return hashCode(); - } - - @Override - public int getFlags() { - return 0; - } - - }); - final int predicateKey = ((ResourceImpl)relation).id; - return new ForEachObjectProcedure(predicateKey, info, session.queryProvider2, user); - } catch (DatabaseException e) { - return null; - } + RelationInfo info = getRelationInfo(graph, relation); + final int predicateKey = ((ResourceImpl)relation).id; + return new ForEachObjectProcedure(predicateKey, info, session.queryProvider2, user); } @Override - public AsyncContextMultiProcedure compileForEachObject(ReadGraph graph, final Resource relation, AsyncContextMultiProcedure user) { + public SyncContextMultiProcedure compileForEachObject(ReadGraph graph, final Resource relation, SyncContextMultiProcedure user) throws DatabaseException { - try { - RelationInfo info = graph.syncRequest(new AsyncRead() { - - @Override - public void perform(AsyncReadGraph graph, AsyncProcedure procedure) { - forRelationInfo(graph, relation, procedure); - } - - @Override - public int threadHash() { - return hashCode(); - } - - @Override - public int getFlags() { - return 0; - } - - }); - final int predicateKey = ((ResourceImpl)relation).id; - return new ForEachObjectContextProcedure(predicateKey, info, session.queryProvider2, user); - } catch (DatabaseException e) { - return null; - } + RelationInfo info = getRelationInfo(graph, relation); + final int predicateKey = ((ResourceImpl)relation).id; + return new ForEachObjectContextProcedure(predicateKey, info, session.queryProvider2, user); } @Override - public AsyncProcedure compilePossibleRelatedValue(ReadGraph graph, final Resource relation, AsyncProcedure user) { + public SyncProcedure compilePossibleRelatedValue(ReadGraph graph, final Resource relation, SyncProcedure user) throws DatabaseException { - try { - RelationInfo info = graph.syncRequest(new AsyncRead() { - - @Override - public void perform(AsyncReadGraph graph, AsyncProcedure procedure) { - forRelationInfo(graph, relation, procedure); - } - - @Override - public int threadHash() { - return hashCode(); - } - - @Override - public int getFlags() { - return 0; - } - - }); - final int predicateKey = ((ResourceImpl)relation).id; - return new ForPossibleRelatedValueProcedure(predicateKey, info, user); - } catch (DatabaseException e) { - return null; - } + RelationInfo info = getRelationInfo(graph, relation); + final int predicateKey = ((ResourceImpl)relation).id; + return new ForPossibleRelatedValueProcedure(predicateKey, info, user); } @Override - public AsyncContextProcedure compilePossibleRelatedValue(ReadGraph graph, final Resource relation, AsyncContextProcedure user) { + public SyncContextProcedure compilePossibleRelatedValue(ReadGraph graph, final Resource relation, SyncContextProcedure user) throws DatabaseException { - try { - RelationInfo info = graph.syncRequest(new AsyncRead() { - - @Override - public void perform(AsyncReadGraph graph, AsyncProcedure procedure) { - forRelationInfo(graph, relation, procedure); - } - - @Override - public int threadHash() { - return hashCode(); - } - - @Override - public int getFlags() { - return 0; - } - - }); - final int predicateKey = ((ResourceImpl)relation).id; - return new ForPossibleRelatedValueContextProcedure(predicateKey, info, user); - } catch (DatabaseException e) { - return null; - } + RelationInfo info = getRelationInfo(graph, relation); + final int predicateKey = ((ResourceImpl)relation).id; + return new ForPossibleRelatedValueContextProcedure(predicateKey, info, user); } @Override - public void forEachObjectCompiled(AsyncReadGraph graph, Resource subject, final AsyncMultiProcedure procedure) { + public void forEachObjectCompiled(ReadGraph graph, Resource subject, final SyncMultiProcedure procedure) { assert(subject != null); @@ -261,7 +177,7 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } @Override - public void forEachObjectCompiled(AsyncReadGraph graph, Resource subject, C context, final AsyncContextMultiProcedure procedure) { + public void forEachObjectCompiled(ReadGraph graph, Resource subject, C context, final SyncContextMultiProcedure procedure) { assert(subject != null); @@ -285,7 +201,7 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } @Override - public void forPossibleRelatedValueCompiled(AsyncReadGraph graph, Resource subject, final AsyncProcedure procedure) { + public void forPossibleRelatedValueCompiled(ReadGraph graph, Resource subject, final SyncProcedure procedure) { assert(subject != null); @@ -302,11 +218,24 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { // if(callerThread == suggestSchedule) { - if(info.isFunctional) { - getRelatedValue4(impl, subjectId, proc); - } else { - getRelatedValue4(impl, subjectId, proc); +// if(info.isFunctional) { + try { + T result = getRelatedValue4(impl, subjectId, proc); + try { + proc.execute(graph, result); + } catch (DatabaseException e2) { + LOGGER.error("Unexpected exception while handling related value", e2); } + } catch (DatabaseException e) { + try { + proc.exception(graph, e); + } catch (DatabaseException e2) { + LOGGER.error("Unexpected exception while handling related value", e2); + } + } +// } else { +// getRelatedValue4(impl, subjectId, proc); +// } // } else { // @@ -341,7 +270,7 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } @Override - public void forPossibleRelatedValueCompiled(AsyncReadGraph graph, Resource subject, C context, final AsyncContextProcedure procedure) { + public void forPossibleRelatedValueCompiled(ReadGraph graph, Resource subject, C context, final SyncContextProcedure procedure) { assert(subject != null); @@ -356,15 +285,21 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { // impl.inc(); - if(info.isFunctional) { - getRelatedValue4(impl, subjectId, context, proc); - } else { - getRelatedValue4(impl, subjectId, context, proc); - } +// if(info.isFunctional) { +// } else { +// getRelatedValue4(impl, subjectId, context, proc); +// } + + try { + T result = getRelatedValue4(impl, subjectId, context, proc); + proc.execute(graph, context, result); + } catch (DatabaseException e) { + proc.exception(graph, e); + } } - @Override +/* @Override public void forPossibleType(final AsyncReadGraph graph, Resource subject, final AsyncProcedure procedure) { assert(subject != null); @@ -413,9 +348,11 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } + + */ @Override - public void forPossibleDirectType(final AsyncReadGraph graph, Resource subject, final C context, final AsyncContextProcedure procedure) { + public void forPossibleDirectType(final ReadGraph graph, Resource subject, final C context, final SyncContextProcedure procedure) { assert(subject != null); @@ -479,8 +416,7 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } - - private void getRelatedValue4(final ReadGraphImpl graph, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) { + private T getRelatedValue4(final ReadGraphImpl graph, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) throws DatabaseException { int result = 0; @@ -489,18 +425,14 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { if(subject < 0) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject, predicate)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, - g -> getRelatedValue4(g, subject, context, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, g -> {}); + return getRelatedValue4(graph, subject, context, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { for (int id : g.getObjects(subject, predicate)) { if(result != 0) { - procedure.exception(graph, new DatabaseException("Multiple objects")); -// graph.dec(); - return; + throw new DatabaseException("Multiple objects"); } else { result = id; } @@ -508,121 +440,93 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } if(result == 0) { - - procedure.exception(graph, new DatabaseException("No objects for " + subject )); -// graph.dec(); - return; - + throw new DatabaseException("No objects for " + subject ); } else { - - getValue4(graph, null, result, context, procedure); - return; - + return getValue4(graph, null, result, context, procedure); } } final org.simantics.db.procore.cluster.ClusterImpl cluster = session.clusterTable.getClusterByResourceKey(subject); if(!cluster.isLoaded()) { - cluster.load(session.clusterTranslator, () -> getRelatedValue4(graph, subject, context, procedure)); - return; + cluster.load(); + return getRelatedValue4(graph, subject, context, procedure); } if(cluster.hasVirtual() && session.virtualGraphServerSupport.virtuals.contains(subject)) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject, predicate)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, - g -> getRelatedValue4(g, subject, context, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, g -> {}); + return getRelatedValue4(graph, subject, context, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { for (int id : g.getObjects(subject, predicate)) { if(result != 0) { - procedure.exception(graph, new DatabaseException("Multiple objects")); -// graph.dec(); - return; + throw new DatabaseException("Multiple objects"); } else { result = id; } } } - getRelatedDirectValue4(graph, cluster, subject, result, context, procedure); + return getRelatedDirectValue4(graph, cluster, subject, result, context, procedure); } else { - getRelatedDirectValue4(graph, cluster, subject, 0, context, procedure); + return getRelatedDirectValue4(graph, cluster, subject, 0, context, procedure); } } - private void getValue4(final ReadGraphImpl graph, final ClusterImpl containerCluster, final int subject, final ForPossibleRelatedValueProcedure procedure) { + private T getValue4(final ReadGraphImpl graph, final ClusterImpl containerCluster, final int subject, final ForPossibleRelatedValueProcedure procedure) throws DatabaseException { Object result = null; if(subject < 0) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, - g -> getValue4(g, containerCluster, subject, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, g -> {}); + return getValue4(graph, containerCluster, subject, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { Object value = g.getValue(subject); if(value != null) { if(result != null) { - procedure.exception(graph, new DatabaseException("Multiple values")); -// graph.dec(); - return; + throw new DatabaseException("Multiple values"); } else { result = value; } } } - - procedure.execute(graph, (T)"name"); -// graph.dec(); - return; - + + return (T)"name"; + } ClusterImpl cluster = containerCluster; if(!containerCluster.contains(subject)) { cluster = session.clusterTable.getClusterByResourceKey(subject); if(!cluster.isLoaded()) { - cluster.load(session.clusterTranslator, new Runnable() { - - @Override - public void run() { - getValue4(graph, containerCluster, subject, procedure); - } - - }); - return; + cluster.load(); + return getValue4(graph, containerCluster, subject, procedure); } } if(cluster.hasVirtual() && session.virtualGraphServerSupport.virtuals.contains(subject)) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, - g -> getValue4(g, containerCluster, subject, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, g -> {}); + return getValue4(graph, containerCluster, subject, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { Object value = g.getValue(subject); if(value != null) { if(result != null) { - procedure.exception(graph, new DatabaseException("Multiple values")); -// graph.dec(); - return; + throw new DatabaseException("Multiple values"); } else { result = value; } @@ -630,93 +534,72 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } if(result != null) { - - procedure.execute(graph, (T)result); -// graph.state.barrier.dec(); - + return (T)result; } else { - if(ClusterTypeEnum.SMALL == cluster.getType()) - getDirectValue4(graph, (ClusterSmall)cluster, subject, procedure); + return getDirectValue4(graph, (ClusterSmall)cluster, subject); else - getDirectValue4(graph, (ClusterBig)cluster, subject, procedure); + return getDirectValue4(graph, (ClusterBig)cluster, subject); } } else { if(ClusterTypeEnum.SMALL == cluster.getType()) - getDirectValue4(graph, (ClusterSmall)cluster, subject, procedure); + return getDirectValue4(graph, (ClusterSmall)cluster, subject); else - getDirectValue4(graph, (ClusterBig)cluster, subject, procedure); + return getDirectValue4(graph, (ClusterBig)cluster, subject); } } - private void getValue4(final ReadGraphImpl graph, final ClusterImpl containerCluster, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) { + private T getValue4(final ReadGraphImpl graph, final ClusterImpl containerCluster, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) throws DatabaseException { Object result = null; if(subject < 0) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, - g -> getValue4(g, containerCluster, subject, context, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, g -> {}); + return getValue4(graph, containerCluster, subject, context, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { Object value = g.getValue(subject); if(value != null) { if(result != null) { - procedure.exception(graph, new DatabaseException("Multiple values")); -// graph.dec(); - return; + throw new DatabaseException("Multiple values"); } else { result = value; } } } - procedure.execute(graph, context, (T)"name"); -// graph.dec(); - return; - + return (T)"name"; + } ClusterImpl cluster = containerCluster; if(!containerCluster.contains(subject)) { cluster = session.clusterTable.getClusterByResourceKey(subject); if(!cluster.isLoaded()) { - cluster.load(session.clusterTranslator, new Runnable() { - - @Override - public void run() { - getValue4(graph, containerCluster, subject, context, procedure); - } - - }); - return; + cluster.load(); + return getValue4(graph, containerCluster, subject, context, procedure); } } if(cluster.hasVirtual() && session.virtualGraphServerSupport.virtuals.contains(subject)) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, - g -> getValue4(g, containerCluster, subject, context, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, g -> {}); + return getValue4(graph, containerCluster, subject, context, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { Object value = g.getValue(subject); if(value != null) { if(result != null) { - procedure.exception(graph, new DatabaseException("Multiple values")); -// graph.dec(); - return; + throw new DatabaseException("Multiple values"); } else { result = value; } @@ -724,84 +607,64 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } if(result != null) { - - procedure.execute(graph, context, (T)result); -// graph.state.barrier.dec(); - + return (T)result; } else { - if(ClusterTypeEnum.SMALL == cluster.getType()) - getDirectValue4(graph, (ClusterSmall)cluster, subject, context, procedure); + return getDirectValue4(graph, (ClusterSmall)cluster, subject); else - getDirectValue4(graph, (ClusterBig)cluster, subject, context, procedure); + return getDirectValue4(graph, (ClusterBig)cluster, subject); } } else { if(ClusterTypeEnum.SMALL == cluster.getType()) - getDirectValue4(graph, (ClusterSmall)cluster, subject, context, procedure); + return getDirectValue4(graph, (ClusterSmall)cluster, subject); else - getDirectValue4(graph, (ClusterBig)cluster, subject, context, procedure); + return getDirectValue4(graph, (ClusterBig)cluster, subject); } } - private void getRelatedDirectValue4(final ReadGraphImpl graph, final ClusterImpl cluster, final int subject, final int result, final ForPossibleRelatedValueProcedure procedure) { + private T getRelatedDirectValue4(final ReadGraphImpl graph, final ClusterImpl cluster, final int subject, final int result, final ForPossibleRelatedValueProcedure procedure) throws DatabaseException { - try { - - int so = cluster.getSingleObject(subject, procedure, session.clusterTranslator); - if(so == 0) { - if(result == 0) { - procedure.exception(graph, new DatabaseException("No objects " + subject + " " + procedure.predicateKey)); -// graph.dec(); - } else { - getValue4(graph, cluster, result, procedure); - } + int so = cluster.getSingleObject(subject, procedure, session.clusterTranslator); + if(so == 0) { + if(result == 0) { + throw new DatabaseException("No objects " + subject + " " + procedure.predicateKey); } else { - if(result == 0) { - getValue4(graph, cluster, so, procedure); - } else { - procedure.exception(graph, new DatabaseException("Multiple objects")); -// graph.dec(); - } + return getValue4(graph, cluster, result, procedure); + } + } else { + if(result == 0) { + return getValue4(graph, cluster, so, procedure); + } else { + throw new DatabaseException("Multiple objects"); } - - } catch (DatabaseException e) { - e.printStackTrace(); } - - } - private void getRelatedDirectValue4(final ReadGraphImpl graph, final ClusterImpl cluster, final int subject, final int result, final C context, final ForPossibleRelatedValueContextProcedure procedure) { - - try { + } + + private T getRelatedDirectValue4(final ReadGraphImpl graph, final ClusterImpl cluster, final int subject, final int result, final C context, final ForPossibleRelatedValueContextProcedure procedure) throws DatabaseException { - int so = cluster.getSingleObject(subject, procedure, session.clusterTranslator); - if(so == 0) { - if(result == 0) { - procedure.exception(graph, new NoSingleResultException("No objects " + subject + " " + procedure.predicateKey, result)); -// graph.dec(); - } else { - getValue4(graph, cluster, result, context, procedure); - } + int so = cluster.getSingleObject(subject, procedure, session.clusterTranslator); + if(so == 0) { + if(result == 0) { + throw new NoSingleResultException("No objects " + subject + " " + procedure.predicateKey, result); } else { - if(result == 0) { - getValue4(graph, cluster, so, context, procedure); - } else { - procedure.exception(graph, new NoSingleResultException("Multiple objects for " + subject + " " + procedure.predicateKey, result)); -// graph.dec(); - } + return getValue4(graph, cluster, result, context, procedure); + } + } else { + if(result == 0) { + return getValue4(graph, cluster, so, context, procedure); + } else { + throw new NoSingleResultException("Multiple objects for " + subject + " " + procedure.predicateKey, result); } - - } catch (DatabaseException e) { - LOGGER.error("Could not compute related value for subject {} with predicate {}", subject, procedure.predicateKey); } } - public void getRelatedValue4(final ReadGraphImpl graph, final int subject, final ForPossibleRelatedValueProcedure procedure) { + public T getRelatedValue4(final ReadGraphImpl graph, final int subject, final ForPossibleRelatedValueProcedure procedure) throws DatabaseException { int result = 0; @@ -810,18 +673,14 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { if(subject < 0) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject, predicate)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, - g -> getRelatedValue4(g, subject, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, g -> {}); + return getRelatedValue4(graph, subject, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { for (int id : g.getObjects(subject, predicate)) { if(result != 0) { - procedure.exception(graph, new DatabaseException("Multiple objects")); -// graph.dec(); - return; + throw new DatabaseException("Multiple objects"); } else { result = id; } @@ -829,64 +688,47 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { } if(result == 0) { - - procedure.exception(graph, new DatabaseException("No objects for " + subject )); -// graph.dec(); - return; - + throw new DatabaseException("No objects for " + subject ); } else { - - getValue4(graph, null, result, procedure); - return; - + return getValue4(graph, null, result, procedure); } } final org.simantics.db.procore.cluster.ClusterImpl cluster = session.clusterTable.getClusterByResourceKey(subject); if(!cluster.isLoaded()) { - cluster.load(session.clusterTranslator, new Runnable() { - - @Override - public void run() { - getRelatedValue4(graph, subject, procedure); - } - - }); - return; + cluster.load(); + return getRelatedValue4(graph, subject, procedure); } if(cluster.hasVirtual() && session.virtualGraphServerSupport.virtuals.contains(subject)) { if(!SessionImplSocket.areVirtualStatementsLoaded(session.virtualGraphServerSupport, subject, predicate)) { - SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, - g -> getRelatedValue4(graph, subject, procedure) - ); - return; + SessionImplSocket.loadVirtualStatements(session.virtualGraphServerSupport, graph, subject, predicate, g -> {}); + return getRelatedValue4(graph, subject, procedure); } for(TransientGraph g : session.virtualGraphServerSupport.providers) { for (int id : g.getObjects(subject, predicate)) { if(result != 0) { - procedure.exception(graph, new DatabaseException("Multiple objects")); -// graph.dec(); - return; + throw new DatabaseException("Multiple objects"); } else { result = id; } } } - getRelatedDirectValue4(graph, cluster, subject, result, procedure); + return getRelatedDirectValue4(graph, cluster, subject, result, procedure); } else { - getRelatedDirectValue4(graph, cluster, subject, 0, procedure); + return getRelatedDirectValue4(graph, cluster, subject, 0, procedure); } } - + + /* private void getDirectValue4(final ReadGraphImpl graph, final ClusterSmall cluster, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) { try { @@ -900,40 +742,16 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { // graph.dec(); } + */ - private void getDirectValue4(final ReadGraphImpl graph, final ClusterBig cluster, final int subject, final ForPossibleRelatedValueProcedure procedure) { + private T getDirectValue4(final ReadGraphImpl graph, final ClusterBig cluster, final int subject) throws DatabaseException { - try { - byte[] bytes = cluster.getValue(subject, session.clusterTranslator); - T value = (T)utf(bytes); - procedure.execute(graph, value); - } catch (DatabaseException e) { - procedure.execute(graph, null); - } - -// graph.dec(); + byte[] bytes = cluster.getValue(subject, session.clusterTranslator); + return (T)utf(bytes); } - private void getDirectValue4(final ReadGraphImpl graph, final ClusterBig cluster, final int subject, final C context, final ForPossibleRelatedValueContextProcedure procedure) { - - try { - byte[] bytes = cluster.getValue(subject, session.clusterTranslator); - if(bytes == null) { - procedure.execute(graph, context, null); - } else { - T value = (T)utf(bytes); - procedure.execute(graph, context, value); - } - } catch (DatabaseException e) { - procedure.execute(graph, context, null); - } - -// graph.dec(); - - } - - private void getDirectValue4(final ReadGraphImpl graph, final ClusterSmall cluster, final int subject, final ForPossibleRelatedValueProcedure procedure) { + private T getDirectValue4(final ReadGraphImpl graph, final ClusterSmall cluster, final int subject) { ResourceTableSmall rt = cluster.resourceTable; ValueTableSmall vt = cluster.valueTable; @@ -941,7 +759,7 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { byte[] bs = vt.table; long[] ls = rt.table; - int index = ((subject&0xFFFF) << 1) - 1 + rt.offset; + int index = ((subject&0xFFF) << 1) - 1 + rt.offset; int valueIndex = (int)(ls[index] >>> 24) & 0x3FFFFF + vt.offset; @@ -952,11 +770,8 @@ public class DirectQuerySupportImpl implements DirectQuerySupport { chars[i] = (char)bs[valueIndex++]; } - T value = (T)new String(chars); + return (T)new String(chars); - procedure.execute(graph, value); -// graph.dec(); - } final private String utf(byte[] bytes) throws AssumptionException {