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;
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;
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;
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;
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;
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<String, Pair<PropertyInfo, Resource>> 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<PropertyInfo, Resource> assertion : assertions.values()) {
+ if (assertion.first.predicate.equals(variable.property.predicate)) {
+ return graph.getValue2(assertion.second, variable);
+ }
}
}
}
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);
}
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<String, Pair<PropertyInfo, Resource>> 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<PropertyInfo, Resource> assertion : assertions.values()) {
+ if (assertion.first.predicate.equals(variable.property.predicate)) {
+ return graph.getValue2(assertion.second, variable, binding);
+ }
+ }
+ }
}
}
// 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<String> 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<String, Pair<PropertyInfo, Resource>> pm = graph.syncRequest(
+ new UnescapedAssertedPropertyMapOfResource(type),
+ TransientCacheAsyncListener.instance());
+ Pair<PropertyInfo, Resource> 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;
}
};
+ @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<String,Resource> 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<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {
+ Variable parent = context.getParent(graph);
+ Resource container = parent.getPossibleRepresents(graph);
+ if(container == null)
+ return Collections.emptyMap();
+ Map<String,Resource> methods = graph.syncRequest(new UnescapedMethodMapOfResource(container));
+ for(Map.Entry<String, Resource> 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) {
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<Resource, Resource, Resource>() {
+ 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