From 76f9b3a30b19aa1f5de8947095d094d5a079bb19 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Tue, 18 Dec 2018 16:37:39 +0200 Subject: [PATCH] Optimized Layer0Utils.getPossibleDefaultBinding Removed badly named datatype_binging public static field from Layer0Utils in favor of Bindings.DATATYPE. If you were using the previous Layer0Utils constant in some place, just replace it. The problem in the optimized code was that it was constantly converting SCL types like "Double", "Boolean" etc. to databoard datatypes using the databoard type parser even though those basic primitive types should have been already premapped somewhere to prevent the need for any kind of parsing. gitlab #242 Change-Id: I336d5ebb6b5dbe080372d5b7304d5608f0472297 (cherry picked from commit 5cd3522960b220eaba2be316076d6275054dffa2) --- .../layer0/request/PropertyInfoRequest.java | 4 +- .../simantics/db/layer0/util/Layer0Utils.java | 65 +++++++++---------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/PropertyInfoRequest.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/PropertyInfoRequest.java index 3b819cbab..2a181674c 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/PropertyInfoRequest.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/PropertyInfoRequest.java @@ -42,9 +42,9 @@ final public class PropertyInfoRequest extends ResourceRead { if(name != null) name = name.intern(); Set classifications = graph.sync(new ClassificationsRequest(graph.getPrincipalTypes(resource))); - VariableBuilder variableBuilder = graph.getPossibleAdapter(resource, VariableBuilder.class); + VariableBuilder variableBuilder = graph.getPossibleAdapter(resource, VariableBuilder.class); - Datatype requiredDataType = graph.getPossibleRelatedValue(resource, L0X.RequiresDataType, Layer0Utils.datatype_binging); + Datatype requiredDataType = graph.getPossibleRelatedValue(resource, L0X.RequiresDataType, Bindings.DATATYPE); String definedUnit = graph.getPossibleRelatedValue(resource, L0X.HasUnit, Bindings.STRING); diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java index 8ac919984..bf712388d 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java @@ -129,8 +129,6 @@ public class Layer0Utils { @SuppressWarnings("rawtypes") public static final ThreadLocal SCL_GRAPH = new ThreadLocal(); - final public static Binding datatype_binging = Bindings.getBindingUnchecked(Datatype.class); - public static Resource literal(WriteGraph g, String value) throws DatabaseException { Layer0 L0 = Layer0.getInstance(g); Resource r = g.newResource(); @@ -272,7 +270,7 @@ public class Layer0Utils { Resource range = graph.getPossibleObject(property, L0.HasRange); if(range != null && !L0.Value.equals(range)) return range; - Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging); + Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, Bindings.DATATYPE); if(requiredDataType != null) return getLiteralType(graph, requiredDataType); String requiredValueType = graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING); @@ -388,7 +386,7 @@ public class Layer0Utils { Layer0 L0 = Layer0.getInstance(graph); Layer0X L0X = Layer0X.getInstance(graph); - Datatype literalDatatype = graph.getPossibleRelatedValue(value, L0.HasDataType, datatype_binging); + Datatype literalDatatype = graph.getPossibleRelatedValue(value, L0.HasDataType, Bindings.DATATYPE); if(literalDatatype != null) return getSCLType(literalDatatype); String literalValueType = graph.getPossibleRelatedValue(value, L0.HasValueType, Bindings.STRING); @@ -396,7 +394,7 @@ public class Layer0Utils { if(predicate != null) { - Datatype requiredDataType = graph.getPossibleRelatedValue(predicate, L0X.RequiresDataType, datatype_binging); + Datatype requiredDataType = graph.getPossibleRelatedValue(predicate, L0X.RequiresDataType, Bindings.DATATYPE); if(requiredDataType != null) return getSCLType(requiredDataType); throw new DatabaseException("Unidentified literal data type for property " + NameUtils.getURIOrSafeNameInternal(graph, predicate)); @@ -414,26 +412,30 @@ public class Layer0Utils { } public static Datatype getPossibleDatatype(ReadGraph graph, Variable variable) throws DatabaseException { + return getPossibleDatatype(graph, variable, null, true); + } + private static Datatype getPossibleDatatype(ReadGraph graph, Variable variable, PropertyInfo info, boolean checkPropertyDatatype) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); Layer0X L0X = Layer0X.getInstance(graph); Resource property = variable.getPossiblePredicateResource(graph); - if(property != null) { -// Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging); - Datatype requiredDataType = graph.syncRequest(new PossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging)); + if(checkPropertyDatatype && property != null) { + Datatype requiredDataType = graph.syncRequest(new PossibleRelatedValue(property, L0X.RequiresDataType, Bindings.DATATYPE)); if(requiredDataType != null) return requiredDataType; } Resource literal = variable.getPossibleRepresents(graph); if(literal != null) { - Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), datatype_binging); - if(literalDatatype != null) return literalDatatype; + Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), Bindings.DATATYPE); + if(literalDatatype != null) return literalDatatype; } if(property != null) { - String requiredValueType = graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING); + String requiredValueType = info != null + ? info.requiredValueType + : graph.getPossibleRelatedValue(property, L0.RequiresValueType, Bindings.STRING); if(requiredValueType != null) { Datatype datatype = getPossibleDatatypeForValueType(requiredValueType); if(datatype != null) return datatype; @@ -455,7 +457,6 @@ public class Layer0Utils { } return null; - } private static Datatype getPossibleDatatypeForValueType(String requiredValueType) throws DatabaseException { @@ -468,11 +469,9 @@ public class Layer0Utils { arrayType = requiredValueType.substring(1, requiredValueType.length()-1); } - if(arrayType != null) { - Datatype arrayDataType = getArrayDataTypeForType(arrayType); - if(arrayDataType != null) - return arrayDataType; - } + Datatype arrayDataType = getDatatypeForType(arrayType != null ? arrayType : requiredValueType, arrayType != null); + if(arrayDataType != null) + return arrayDataType; Datatype dt = Datatypes.getDatatype(requiredValueType); if(dt != null) return dt; @@ -483,18 +482,19 @@ public class Layer0Utils { return null; } - } - private static Datatype getArrayDataTypeForType(String type) { - if("Double".equals(type)) return Datatypes.DOUBLE_ARRAY; - else if("String".equals(type)) return Datatypes.STRING_ARRAY; - else if("Integer".equals(type)) return Datatypes.INTEGER_ARRAY; - else if("Long".equals(type)) return Datatypes.LONG_ARRAY; - else if("Float".equals(type)) return Datatypes.FLOAT_ARRAY; - else if("Byte".equals(type)) return Datatypes.BYTE_ARRAY; - else if("Boolean".equals(type)) return Datatypes.BOOLEAN_ARRAY; - else if("Variant".equals(type)) return Datatypes.VARIANT_ARRAY; + private static Datatype getDatatypeForType(String type, boolean isArray) { + switch (type) { + case "Double": return isArray ? Datatypes.DOUBLE_ARRAY : Datatypes.DOUBLE; + case "String": return isArray ? Datatypes.STRING_ARRAY : Datatypes.STRING; + case "Integer": return isArray ? Datatypes.INTEGER_ARRAY : Datatypes.INTEGER; + case "Long": return isArray ? Datatypes.LONG_ARRAY : Datatypes.LONG; + case "Float": return isArray ? Datatypes.FLOAT_ARRAY : Datatypes.FLOAT; + case "Byte": return isArray ? Datatypes.BYTE_ARRAY : Datatypes.BYTE; + case "Boolean": return isArray ? Datatypes.BOOLEAN_ARRAY : Datatypes.BOOLEAN; + case "Variant": return isArray ? Datatypes.VARIANT_ARRAY : Datatypes.VARIANT; + } return null; } @@ -507,8 +507,6 @@ public class Layer0Utils { } Datatype type = getDatatype(graph, variable); - if (type == null) - throw new DatabaseException("No datatype available for variable " + variable.getURI(graph)); return Bindings.getBinding(type); } @@ -516,12 +514,13 @@ public class Layer0Utils { public static Binding getPossibleDefaultBinding(ReadGraph graph, Variable variable) throws DatabaseException { Resource property = variable.getPossiblePredicateResource(graph); + PropertyInfo info = null; if(property != null) { - PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(property), TransientCacheAsyncListener.instance()); + info = graph.syncRequest(new PropertyInfoRequest(property), TransientCacheAsyncListener.instance()); if(info.defaultBinding != null) return info.defaultBinding; } - Datatype type = getPossibleDatatype(graph, variable); + Datatype type = getPossibleDatatype(graph, variable, info, false); if (type == null) return null; return Bindings.getBinding(type); @@ -553,7 +552,7 @@ public class Layer0Utils { if(literal == null) return ""; - Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), datatype_binging); + Datatype literalDatatype = graph.getPossibleRelatedValue2(literal, L0.HasDataType, new StandardGraphPropertyVariable(graph, variable, null, literal, L0.HasDataType), Bindings.DATATYPE); if(literalDatatype != null) { String unit = getPossibleUnit(literalDatatype); if(unit != null) return unit; @@ -562,7 +561,7 @@ public class Layer0Utils { Resource property = variable.getPossiblePredicateResource(graph); if(property != null) { - Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, datatype_binging); + Datatype requiredDataType = graph.getPossibleRelatedValue(property, L0X.RequiresDataType, Bindings.DATATYPE); if(requiredDataType != null) { String unit = getPossibleUnit(requiredDataType); if(unit != null) return unit; -- 2.47.1