]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/All.java
Fixed ComponentTypeCommands.setUnit to support unit == null
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / All.java
index 8c56e71ac705e8500991a29eed80bae9a4b1bcc1..1823b04b2e68b9b6d95d02b2bf26eb81d380c06f 100644 (file)
-package org.simantics.modeling;\r
-\r
-import gnu.trove.map.hash.THashMap;\r
-\r
-import java.text.SimpleDateFormat;\r
-import java.util.Date;\r
-import java.util.Map;\r
-\r
-import org.simantics.common.color.Color;\r
-import org.simantics.common.format.Formatter;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.Databoard;\r
-import org.simantics.databoard.adapter.AdaptException;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.binding.error.BindingException;\r
-import org.simantics.databoard.type.Datatype;\r
-import org.simantics.databoard.util.URIStringUtils;\r
-import org.simantics.datatypes.literal.DecimalFormatFormatter;\r
-import org.simantics.datatypes.literal.RGB;\r
-import org.simantics.datatypes.literal.Vec2d;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.RelationContext;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.adapter.impl.EntityNameModifier;\r
-import org.simantics.db.layer0.request.PossibleActiveExperiment;\r
-import org.simantics.db.layer0.request.PossibleVariableModel;\r
-import org.simantics.db.layer0.util.Layer0Utils;\r
-import org.simantics.db.layer0.variable.ProxyChildVariable;\r
-import org.simantics.db.layer0.variable.RVI;\r
-import org.simantics.db.layer0.variable.ValueAccessor;\r
-import org.simantics.db.layer0.variable.Variable;\r
-import org.simantics.db.layer0.variable.VariableMap;\r
-import org.simantics.db.layer0.variable.VariableMapImpl;\r
-import org.simantics.db.layer0.variable.Variables;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.modeling.query.QueryProxyChildVariable;\r
-import org.simantics.modeling.scl.CompileProceduralSCLMonitorRequest;\r
-import org.simantics.modeling.scl.CompileSCLMonitorRequest;\r
-import org.simantics.modeling.scl.CompileSCLQueryRequest;\r
-import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;\r
-import org.simantics.scl.reflection.annotations.SCLValue;\r
-import org.simantics.scl.runtime.function.FunctionImpl1;\r
-import org.simantics.structural.stubs.StructuralResource2;\r
-import org.simantics.structural2.scl.CompileStructuralValueRequest;\r
-\r
-public class All {\r
-\r
-    private static String formatted(String text, String color, int size) {\r
-       return "<font style=\"font-size:" + size + ";color:" + color + ";\">" + text +  "</font>";\r
-    }\r
-       \r
-    @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
-    public static String issueDocumentHeader(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
-       \r
-       Variable selection = ScenegraphLoaderUtils.getVariableSelection(graph, context);\r
-       String label = selection.getLabel(graph);\r
-       String severity = selection.getPropertyValue(graph, "severity", Bindings.STRING);\r
-       \r
-       String result = "== " + label + " ==\r\n" +\r
-                       formatted("An issue with severity ", "#000000", 12) +\r
-                       formatted(severity, "#5050aa", 15) + "\r\n\r\n<hr/>";\r
-\r
-       return result;\r
-       \r
-    }\r
-       \r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
-    public static Object sclValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
-           return CompileStructuralValueRequest.compileAndEvaluate(graph, context);\r
-    }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
-    public static Object queryValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {\r
-           return CompileSCLQueryRequest.compileAndEvaluate(graph, context);\r
-    }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> Boolean")\r
-    public static Boolean monitorReadOnly(ReadGraph graph, Resource converter, Variable ro) throws DatabaseException {\r
-               Variable context = ro.getParent(graph);\r
-        Layer0 L0 = Layer0.getInstance(graph);\r
-        String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);\r
-        if(expression == null) return true;\r
-        return !InvertBasicExpressionVisitor.isInvertible(graph, context.getParent(graph), expression);\r
-       }\r
-\r
-    @SCLValue(type = "ValueAccessor")\r
-       public static ValueAccessor monitorValueAccessor = new ValueAccessor() {\r
-        \r
-        @Override\r
-        public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {\r
-            setValue(graph, context, value);\r
-        }\r
-        \r
-        @Override\r
-        public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException {\r
-            Layer0 L0 = Layer0.getInstance(graph);\r
-            String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);\r
-            if(expression == null) return;\r
-            InvertBasicExpressionVisitor.invert(graph, context.getParent(graph), expression, value);\r
-        }\r
-        \r
-        @Override\r
-        public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {\r
-            try {\r
-               Object value = getValue(graph, context);\r
-               Binding srcBinding = Bindings.OBJECT.getContentBinding(value);\r
-                               return Bindings.adapt(value, srcBinding, binding);\r
-                       } catch (AdaptException e) {\r
-                               throw new DatabaseException(e);\r
-                       } catch (BindingException e) {\r
-                               throw new DatabaseException(e);\r
-                       }\r
-        }\r
-        \r
-        private boolean isProcedural(ReadGraph graph, Variable context) throws DatabaseException {\r
-               StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
-               Resource type = context.getParent(graph).getPossibleType(graph);\r
-               return graph.isInstanceOf(type, STR.ProceduralComponentType);\r
-        }\r
-        \r
-        @Override\r
-        public Object getValue(ReadGraph graph, Variable context) throws DatabaseException {\r
-            if(isProcedural(graph, context))\r
-                return CompileProceduralSCLMonitorRequest.compileAndEvaluate(graph, context);\r
-            else\r
-                return CompileSCLMonitorRequest.compileAndEvaluate(graph, context);\r
-        }\r
-\r
-               @Override\r
-               public Datatype getDatatype(ReadGraph graph, Variable context)\r
-                               throws DatabaseException {\r
-                       return org.simantics.db.layer0.function.All.getDatatypeFromValue(graph, context);\r
-               }\r
-        \r
-    };\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> String")\r
-    public static String obtainedString(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.STRING);\r
-       }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Double")\r
-    public static Double obtainedDouble(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.DOUBLE);\r
-       }\r
-       \r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Boolean")\r
-    public static Boolean obtainedBoolean(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.BOOLEAN);\r
-       }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Color")\r
-    public static Color obtainedColor(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, RGB.Integer.BINDING);\r
-       }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Vec2d")\r
-    public static Vec2d obtainedVec2d(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, Vec2d.BINDING);\r
-       }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Formatter")\r
-    public static Formatter obtainedFormatter(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {\r
-               return Layer0Utils.possibleObtainedValue(graph, context, DecimalFormatFormatter.BINDING);\r
-       }\r
-       \r
-       public static final SimpleDateFormat sdfShort = new SimpleDateFormat("d.M.yyyy");\r
-       public static final SimpleDateFormat sdfLong = new SimpleDateFormat("d.M.yyyy H:mm:ss");\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
-       public static String modificationTimeTextShort(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
-               Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);\r
-               return sdfShort.format(new Date(millis));\r
-       }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
-       public static String modificationTimeTextLong(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
-               Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);\r
-               return sdfLong.format(new Date(millis));\r
-       }\r
-\r
-    @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")\r
-    public static String variableIdDisplayValue(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
-        Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );\r
-        RVI rvi = variable.getParent(graph).getPossibleValue(graph, rviBinding);\r
-        if (rvi == null)\r
-            return "Undefined, invalid subscription item";\r
-\r
-        Resource model = graph.sync( new PossibleVariableModel(variable) );\r
-        Resource run = model != null ? graph.sync( new PossibleActiveExperiment(model) ) : null;\r
-        Variable base = run != null ? Variables.getPossibleVariable(graph, run) : null;\r
-        Variable var = base != null ? rvi.resolvePossible(graph, base) : null;\r
-        String rvistr = base != null ? rvi.toPossibleString(graph, base) : null;\r
-        String result = rvistr != null ? URIStringUtils.unescape( rvistr ) : "";\r
-        return var != null ? result : result + " (INVALID)";\r
-    }\r
-\r
-       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")\r
-       public static Object nameInputValidator(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {\r
-               Layer0 L0 = Layer0.getInstance(graph);\r
-               Resource container = variable.getParent(graph).getParent(graph).getParent(graph).getPossibleRepresents(graph);\r
-               if(container == null) return null;\r
-               Resource name = graph.getSingleObject(container, L0.HasName);\r
-               final EntityNameModifier modifier = new EntityNameModifier(graph, container, name);\r
-               return new FunctionImpl1<String, String>() {\r
-\r
-                       @Override\r
-                       public String apply(String proposition) {\r
-                               return modifier.isValid(proposition);\r
-                       }\r
-                       \r
-               };\r
-       }\r
-       \r
-    @SCLValue(type = "VariableMap")\r
-    public static VariableMap queryChildMap = new VariableMapImpl() {\r
-\r
-        private Variable getProxy(ReadGraph graph, Variable context) throws DatabaseException {\r
-            Variable root = Variables.getRootVariable(graph);\r
-            return new QueryProxyChildVariable(context, context, root, ProxyChildVariable.CONTEXT_BEGIN);\r
-        }\r
-        \r
-        @Override\r
-        public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException {\r
-\r
-            if(ProxyChildVariable.CONTEXT_BEGIN.equals(name)) return getProxy(graph, context);\r
-            return org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariable(graph, context, name);\r
-            \r
-        }\r
-\r
-        @Override\r
-        public Map<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {\r
-\r
-            map = org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariables(graph, context, map);\r
-            if(map == null) map = new THashMap<String,Variable>();\r
-            map.put(ProxyChildVariable.CONTEXT_BEGIN, getProxy(graph, context));\r
-            return map;\r
-            \r
-        }\r
-        \r
-    };\r
-       \r
-}\r
+package org.simantics.modeling;
+
+import gnu.trove.map.hash.THashMap;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+import org.simantics.common.color.Color;
+import org.simantics.common.format.Formatter;
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.Databoard;
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.error.BindingException;
+import org.simantics.databoard.type.Datatype;
+import org.simantics.databoard.util.URIStringUtils;
+import org.simantics.datatypes.literal.DecimalFormatFormatter;
+import org.simantics.datatypes.literal.RGB;
+import org.simantics.datatypes.literal.Vec2d;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.RelationContext;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.adapter.impl.EntityNameModifier;
+import org.simantics.db.layer0.request.PossibleActiveExperiment;
+import org.simantics.db.layer0.request.PossibleVariableModel;
+import org.simantics.db.layer0.util.Layer0Utils;
+import org.simantics.db.layer0.variable.ProxyChildVariable;
+import org.simantics.db.layer0.variable.RVI;
+import org.simantics.db.layer0.variable.ValueAccessor;
+import org.simantics.db.layer0.variable.Variable;
+import org.simantics.db.layer0.variable.VariableMap;
+import org.simantics.db.layer0.variable.VariableMapImpl;
+import org.simantics.db.layer0.variable.Variables;
+import org.simantics.layer0.Layer0;
+import org.simantics.modeling.query.QueryProxyChildVariable;
+import org.simantics.modeling.scl.CompileProceduralSCLMonitorRequest;
+import org.simantics.modeling.scl.CompileSCLMonitorRequest;
+import org.simantics.modeling.scl.CompileSCLQueryRequest;
+import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;
+import org.simantics.scl.reflection.annotations.SCLValue;
+import org.simantics.scl.runtime.function.FunctionImpl1;
+import org.simantics.structural.stubs.StructuralResource2;
+import org.simantics.structural2.scl.CompileStructuralValueRequest;
+
+public class All {
+
+    private static String formatted(String text, String color, int size) {
+       return "<font style=\"font-size:" + size + ";color:" + color + ";\">" + text +  "</font>";
+    }
+       
+    @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
+    public static String issueDocumentHeader(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
+       
+       Variable selection = ScenegraphLoaderUtils.getVariableSelection(graph, context);
+       String label = selection.getLabel(graph);
+       String severity = selection.getPropertyValue(graph, "severity", Bindings.STRING);
+       
+       String result = "== " + label + " ==\r\n" +
+                       formatted("An issue with severity ", "#000000", 12) +
+                       formatted(severity, "#5050aa", 15) + "\r\n\r\n<hr/>";
+
+       return result;
+       
+    }
+       
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
+    public static Object sclValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
+           return CompileStructuralValueRequest.compileAndEvaluate(graph, context);
+    }
+
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
+    public static Object queryValue(ReadGraph graph, Resource converter, Variable context) throws DatabaseException {
+           return CompileSCLQueryRequest.compileAndEvaluate(graph, context);
+    }
+
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> Boolean")
+    public static Boolean monitorReadOnly(ReadGraph graph, Resource converter, Variable ro) throws DatabaseException {
+               Variable context = ro.getParent(graph);
+        Layer0 L0 = Layer0.getInstance(graph);
+        String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);
+        if(expression == null) return true;
+        return !InvertBasicExpressionVisitor.isInvertible(graph, context.getParent(graph), expression);
+       }
+
+    @SCLValue(type = "ValueAccessor")
+       public static ValueAccessor monitorValueAccessor = new ValueAccessor() {
+        
+        @Override
+        public void setValue(WriteGraph graph, Variable context, Object value, Binding binding) throws DatabaseException {
+            setValue(graph, context, value);
+        }
+        
+        @Override
+        public void setValue(WriteGraph graph, Variable context, Object value) throws DatabaseException {
+            Layer0 L0 = Layer0.getInstance(graph);
+            String expression = graph.getPossibleRelatedValue(context.getRepresents(graph), L0.SCLValue_expression, Bindings.STRING);
+            if(expression == null) return;
+            InvertBasicExpressionVisitor.invert(graph, context.getParent(graph), expression, value);
+        }
+        
+        @Override
+        public Object getValue(ReadGraph graph, Variable context, Binding binding) throws DatabaseException {
+            try {
+               Object value = getValue(graph, context);
+               Binding srcBinding = Bindings.OBJECT.getContentBinding(value);
+                               return Bindings.adapt(value, srcBinding, binding);
+                       } catch (AdaptException e) {
+                               throw new DatabaseException(e);
+                       } catch (BindingException e) {
+                               throw new DatabaseException(e);
+                       }
+        }
+        
+        private boolean isProcedural(ReadGraph graph, Variable context) throws DatabaseException {
+               StructuralResource2 STR = StructuralResource2.getInstance(graph);
+               Resource type = context.getParent(graph).getPossibleType(graph);
+               return graph.isInstanceOf(type, STR.ProceduralComponentType);
+        }
+        
+        @Override
+        public Object getValue(ReadGraph graph, Variable context) throws DatabaseException {
+            if(isProcedural(graph, context))
+                return CompileProceduralSCLMonitorRequest.compileAndEvaluate(graph, context);
+            else
+                return CompileSCLMonitorRequest.compileAndEvaluate(graph, context);
+        }
+
+               @Override
+               public Datatype getDatatype(ReadGraph graph, Variable context)
+                               throws DatabaseException {
+                       return org.simantics.db.layer0.function.All.getDatatypeFromValue(graph, context);
+               }
+        
+    };
+
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> String")
+    public static String obtainedString(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.STRING);
+       }
+
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Double")
+    public static Double obtainedDouble(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.DOUBLE);
+       }
+       
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Boolean")
+    public static Boolean obtainedBoolean(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, Bindings.BOOLEAN);
+       }
+
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Color")
+    public static Color obtainedColor(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, RGB.Integer.BINDING);
+       }
+
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Vec2d")
+    public static Vec2d obtainedVec2d(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, Vec2d.BINDING);
+       }
+
+       @SCLValue(type = "ReadGraph -> Resource -> RelationContext -> Formatter")
+    public static Formatter obtainedFormatter(ReadGraph graph, Resource converter, RelationContext context) throws DatabaseException {
+               return Layer0Utils.possibleObtainedValue(graph, context, DecimalFormatFormatter.BINDING);
+       }
+       
+       public static final SimpleDateFormat sdfShort = new SimpleDateFormat("d.M.yyyy");
+       public static final SimpleDateFormat sdfLong = new SimpleDateFormat("d.M.yyyy H:mm:ss");
+
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
+       public static String modificationTimeTextShort(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
+               Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);
+               return sdfShort.format(new Date(millis));
+       }
+
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
+       public static String modificationTimeTextLong(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
+               Long millis = variable.getParent(graph).getValue(graph, Bindings.LONG);
+               return sdfLong.format(new Date(millis));
+       }
+
+    @SCLValue(type = "ReadGraph -> Resource -> Variable -> String")
+    public static String variableIdDisplayValue(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
+        Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class );
+        RVI rvi = variable.getParent(graph).getPossibleValue(graph, rviBinding);
+        if (rvi == null)
+            return "Undefined, invalid subscription item";
+
+        Resource model = graph.sync( new PossibleVariableModel(variable) );
+        Resource run = model != null ? graph.sync( new PossibleActiveExperiment(model) ) : null;
+        Variable base = run != null ? Variables.getPossibleVariable(graph, run) : null;
+        Variable var = base != null ? rvi.resolvePossible(graph, base) : null;
+        String rvistr = base != null ? rvi.toPossibleString(graph, base) : null;
+        String result = rvistr != null ? URIStringUtils.unescape( rvistr ) : "";
+        return var != null ? result : result + " (INVALID)";
+    }
+
+       @SCLValue(type = "ReadGraph -> Resource -> Variable -> a")
+       public static Object nameInputValidator(ReadGraph graph, Resource r, Variable variable) throws DatabaseException {
+               Layer0 L0 = Layer0.getInstance(graph);
+               Resource container = variable.getParent(graph).getParent(graph).getParent(graph).getPossibleRepresents(graph);
+               if(container == null) return null;
+               Resource name = graph.getSingleObject(container, L0.HasName);
+               final EntityNameModifier modifier = new EntityNameModifier(graph, container, name);
+               return new FunctionImpl1<String, String>() {
+
+                       @Override
+                       public String apply(String proposition) {
+                               return modifier.isValid(proposition);
+                       }
+                       
+               };
+       }
+       
+    @SCLValue(type = "VariableMap")
+    public static VariableMap queryChildMap = new VariableMapImpl() {
+
+        private Variable getProxy(ReadGraph graph, Variable context) throws DatabaseException {
+            Variable root = Variables.getRootVariable(graph);
+            return new QueryProxyChildVariable(context, context, root, ProxyChildVariable.CONTEXT_BEGIN);
+        }
+        
+        @Override
+        public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException {
+
+            if(ProxyChildVariable.CONTEXT_BEGIN.equals(name)) return getProxy(graph, context);
+            return org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariable(graph, context, name);
+            
+        }
+
+        @Override
+        public Map<String, Variable> getVariables(ReadGraph graph, Variable context, Map<String, Variable> map) throws DatabaseException {
+
+            map = org.simantics.db.layer0.function.All.standardChildDomainChildren.getVariables(graph, context, map);
+            if(map == null) map = new THashMap<String,Variable>();
+            map.put(ProxyChildVariable.CONTEXT_BEGIN, getProxy(graph, context));
+            return map;
+            
+        }
+        
+    };
+       
+}