X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Ffunction%2FAll.java;h=604faa69ed63d99f944bfabac8686eea2437750f;hb=1251d640abb698a4018ef1ea212f8cdf78befaaf;hp=1c9331069ff13f28a56013cb42eaaa514bcd7f20;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java index 1c9331069..604faa69e 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java @@ -3,6 +3,7 @@ package org.simantics.db.layer0.function; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -27,10 +28,10 @@ import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.issue.StandardIssue; import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied2; +import org.simantics.db.common.primitiverequest.PossibleResource; import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.IsEnumeratedValue; -import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.uri.UnescapedChildMapOfResource; import org.simantics.db.common.utils.CommonDBUtils; import org.simantics.db.common.utils.Functions; @@ -41,12 +42,15 @@ import org.simantics.db.common.validation.L0Validations; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.DoesNotContainValueException; import org.simantics.db.exception.NoSingleResultException; +import org.simantics.db.exception.RuntimeDatabaseException; import org.simantics.db.layer0.exception.MissingVariableValueException; import org.simantics.db.layer0.exception.PendingVariableException; import org.simantics.db.layer0.exception.VariableException; import org.simantics.db.layer0.request.PossibleURI; import org.simantics.db.layer0.request.PropertyInfo; import org.simantics.db.layer0.request.PropertyInfoRequest; +import org.simantics.db.layer0.request.UnescapedAssertedPropertyMapOfResource; +import org.simantics.db.layer0.request.UnescapedMethodMapOfResource; import org.simantics.db.layer0.request.UnescapedPropertyMapOfResource; import org.simantics.db.layer0.scl.CompileResourceValueRequest; import org.simantics.db.layer0.scl.CompileValueRequest; @@ -56,6 +60,7 @@ import org.simantics.db.layer0.variable.AbstractVariable; import org.simantics.db.layer0.variable.ChildVariableMapRequest; import org.simantics.db.layer0.variable.ExternalSetValue; import org.simantics.db.layer0.variable.PropertyVariableMapRequest; +import org.simantics.db.layer0.variable.StandardAssertedGraphPropertyVariable; import org.simantics.db.layer0.variable.StandardComposedProperty; import org.simantics.db.layer0.variable.StandardGraphChildVariable; import org.simantics.db.layer0.variable.StandardGraphPropertyVariable; @@ -76,8 +81,10 @@ import org.simantics.db.service.UndoRedoSupport; import org.simantics.issues.ontology.IssueResource; import org.simantics.layer0.Layer0; import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function4; import org.simantics.scl.runtime.function.FunctionImpl1; +import org.simantics.scl.runtime.function.FunctionImpl2; import org.simantics.simulator.variable.exceptions.NodeManagerException; import org.simantics.utils.Development; import org.simantics.utils.datastructures.Pair; @@ -118,10 +125,20 @@ public class All { if (variable.isAsserted()) { if (variable.parentResource != null) { - Layer0 L0 = Layer0.getInstance(graph); - for(Resource assertion : graph.syncRequest(new ObjectsWithType(variable.parentResource, L0.Asserts, L0.Assertion))) { - if(variable.property.predicate.equals(graph.getSingleObject(assertion, L0.HasPredicate))) { - return graph.getRelatedValue2(assertion, L0.HasObject, variable); + Map> assertions = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(variable.parentResource), + TransientCacheAsyncListener.instance()); + + // NOTE: This optimization assumes the property + // variable's representation is the asserted object. + Resource object = variable.getPossibleRepresents(graph); + if (object != null) { + return graph.getValue2(object, variable); + } else { + for (Pair assertion : assertions.values()) { + if (assertion.first.predicate.equals(variable.property.predicate)) { + return graph.getValue2(assertion.second, variable); + } } } } @@ -156,13 +173,12 @@ public class All { try { - Layer0 L0 = Layer0.getInstance(graph); - if(variable.property.hasEnumerationRange) { Resource object = variable.getRepresents(graph); if(graph.sync(new IsEnumeratedValue(object))) { + Layer0 L0 = Layer0.getInstance(graph); if(graph.isInstanceOf(object, L0.Literal)) { - return graph.getValue(object); + return graph.getValue(object, binding); } else { return graph.getRelatedValue2(variable.getRepresents(graph), L0.HasLabel, binding); } @@ -171,11 +187,22 @@ public class All { if (variable.isAsserted()) { if (variable.parentResource != null) { - for(Resource assertion : graph.syncRequest(new ObjectsWithType(variable.parentResource, L0.Asserts, L0.Assertion))) { - if(variable.property.predicate.equals(graph.getSingleObject(assertion, L0.HasPredicate))) { - return graph.getRelatedValue2(assertion, L0.HasObject, context); - } - } + Map> assertions = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(variable.parentResource), + TransientCacheAsyncListener.instance()); + + // NOTE: This optimization assumes the property + // variable's representation is the asserted object. + Resource object = variable.getPossibleRepresents(graph); + if (object != null) { + return graph.getValue2(object, variable, binding); + } else { + for (Pair assertion : assertions.values()) { + if (assertion.first.predicate.equals(variable.property.predicate)) { + return graph.getValue2(assertion.second, variable, binding); + } + } + } } } @@ -450,6 +477,33 @@ public class All { // Fallback: try to ask property resource uri from NodeManager return createStandardGraphPropertyVariable(graph, variable, propertyNode); } + // Final fallback: check types corresponding to + // node classification(s) and look for asserted + // properties from the URIs specified. + if (variable.node != null) { + try { + @SuppressWarnings("unchecked") + Set classifications = variable.node.support.manager.getClassifications(variable.node.node); + if (!classifications.isEmpty()) { + for (String uri : classifications) { + Resource type = graph.syncRequest( + new PossibleResource(uri), + TransientCacheAsyncListener.instance()); + if (type == null) + continue; + Map> pm = graph.syncRequest( + new UnescapedAssertedPropertyMapOfResource(type), + TransientCacheAsyncListener.instance()); + Pair pi = pm.get(name); + if (pi != null) { + return new StandardAssertedGraphPropertyVariable(graph, context, null, type, pi.first.predicate, pi.second); + } + } + } + } catch(NodeManagerException e) { + throw new DatabaseException(e); + } + } return null; } @@ -547,6 +601,45 @@ public class All { }; + @SCLValue(type = "VariableMap") + public static VariableMap methodsPropertyDomainProperties = new VariableMapImpl() { + + @Override + public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException { + Variable parent = context.getParent(graph); + Resource container = parent.getPossibleRepresents(graph); + if(container == null) + return null; + Map methods = graph.syncRequest(new UnescapedMethodMapOfResource(container)); + Resource predicate = methods.get(name); + if(predicate != null) { + Layer0 L0 = Layer0.getInstance(graph); + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(L0.Entity_method)); + Resource value = graph.getSingleObject(container, predicate); + return new StandardGraphPropertyVariable(context, null, container, info, value); + } + return null; + } + + @Override + public Map getVariables(ReadGraph graph, Variable context, Map map) throws DatabaseException { + Variable parent = context.getParent(graph); + Resource container = parent.getPossibleRepresents(graph); + Map methods = graph.syncRequest(new UnescapedMethodMapOfResource(container)); + for(Map.Entry entry : methods.entrySet()) { + String name = entry.getKey(); + Resource predicate = entry.getValue(); + Layer0 L0 = Layer0.getInstance(graph); + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(L0.Entity_method)); + Resource value = graph.getSingleObject(container, predicate); + if(map == null) map = new HashMap<>(); + map.put(name, new StandardGraphPropertyVariable(context, null, container, info, value)); + } + return map; + } + + }; + public static Variable getStandardPropertyDomainPropertyVariableFromValue(ReadGraph graph, Variable context, String name) throws DatabaseException { if(context instanceof StandardGraphPropertyVariable) { @@ -1532,4 +1625,28 @@ public class All { return parent.node.support.manager.getPropertyURI(parent.node.node, node); } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") + public static Object defaultInstantiateUnder(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { + return new FunctionImpl2() { + public Resource apply(Resource container, Resource type) { + try { + WriteGraph graph = (WriteGraph)SCLContext.getCurrent().get("graph"); + + Layer0 L0 = Layer0.getInstance(graph); + CommonDBUtils.selectClusterSet(graph, container); + Resource result = graph.newResource(); + String name = NameUtils.findFreshInstanceName(graph, type, container); + graph.claim(result, L0.InstanceOf, type); + graph.addLiteral(result, L0.HasName, L0.NameOf, name, Bindings.STRING); + graph.claim(container, L0.ConsistsOf, L0.PartOf, result); + + return result; + } catch (DatabaseException e) { + throw new RuntimeDatabaseException(e); + } + } + }; + } + } \ No newline at end of file