]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Optimized Layer0Utils.getPossibleDefaultBinding 37/3737/1
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Tue, 18 Dec 2018 14:37:39 +0000 (16:37 +0200)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Fri, 10 Jan 2020 10:23:03 +0000 (10:23 +0000)
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)

bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/PropertyInfoRequest.java
bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/Layer0Utils.java

index 3b819cbabf5ab609188c21417ee8a19f8cf75e3a..2a181674c49a3cdf06f0317bcb382c5bbe002221 100644 (file)
@@ -42,9 +42,9 @@ final public class PropertyInfoRequest extends ResourceRead<PropertyInfo> {
                if(name != null) name = name.intern();
                
                Set<String> 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);
                
index 8ac91998423974428483c45de3ab93a2f76150c7..bf712388d842aff378236ce7d5c429fcca596ed8 100644 (file)
@@ -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<Datatype>(property, L0X.RequiresDataType, datatype_binging));
+               if(checkPropertyDatatype && property != null) {
+                       Datatype requiredDataType = graph.syncRequest(new PossibleRelatedValue<Datatype>(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.<PropertyInfo>instance());
+                       info = graph.syncRequest(new PropertyInfoRequest(property), TransientCacheAsyncListener.<PropertyInfo>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;