]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/CodeGen.java
Multiple readers and variable optimization
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / CodeGen.java
index 857d93487235a0c43f83fd2a2de47c05aa9bb0b0..ed60398478b8a70933b1f28ef8e201147b975394 100644 (file)
@@ -7,6 +7,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLDecoder;
 
+import org.simantics.db.ObjectResourceIdMap;
 import org.simantics.utils.FileUtils;
 
 public class CodeGen {
@@ -23,6 +24,7 @@ public class CodeGen {
        String[] signatureR2TIP = { "int r1, int r2", "r1,r2", "keyR2", "long", "TripleIntProcedure", "entry.id" };
        String[] signatureID1 = { "String id", "id", "keyID", "String", "InternalProcedure<Integer>", "entry.id" };
        String[] signatureID2 = { "String id", "id", "keyID", "String", "InternalProcedure<TObjectIntHashMap<String>>", "entry.id" };
+       String[] signatureChildMap = { "int r", "r", "keyR", "long", "InternalProcedure<ObjectResourceIdMap<String>>", "entry.id" };
        String[] signatureRead = { "Read<?> r", "r", "id", "long", "AsyncProcedure", "entry.request" };
        String[] signatureAsyncRead = { "AsyncRead<?> r", "r", "id", "long", "AsyncProcedure", "entry.request" };
        String[] signatureMultiRead = { "MultiRead<?> r", "r", "id", "long", "AsyncMultiProcedure", "entry.request" };
@@ -45,13 +47,13 @@ public class CodeGen {
        public void generateRunner(StringBuilder content, String clazz, String[] signature, boolean shortcut) {
                
                line(content, "public static void runner" + clazz + "(ReadGraphImpl graph, " + signature[0] + ", CacheEntry parent, ListenerBase listener, " + signature[4] + " procedure) throws DatabaseException {");
+               line(content, "    QueryCache cache  = graph.processor.cache;");
                if(shortcut) {
-                       line(content, "    if(parent == null && listener == null) {");
+                       line(content, "    if(parent == null && listener == null && !cache.shouldCache(graph.processor, " + signature[1] + ")) {");
                        line(content, "        " + clazz + ".computeForEach(graph, " + signature[1] + ", null, procedure);");
                        line(content, "        return;");
                        line(content, "    }");
                }
-               line(content, "    QueryCache cache  = graph.processor.cache;");
                line(content, "    if(procedure == null) procedure = emptyProcedure" + clazz + ";");
                line(content, "    " + clazz + " entry = (" + clazz + ")cache.getOrCreate" + clazz + "(" + signature[1] + ");");
                line(content, "    ListenerEntry listenerEntry = cache.registerDependencies(graph, entry, parent, listener, procedure, false);");
@@ -92,6 +94,7 @@ public class CodeGen {
                line(content, "            existing.clearResult(querySupport);");
                line(content, "            existing.setPending();");
                line(content, "            " + lower + "Map.put(" + signature[2] + "(" + signature[1] + "), existing);");
+               line(content, "            size++;");
                line(content, "            return existing;");
                line(content, "        }");
                line(content, "        if(existing.requiresComputation()) {");
@@ -121,6 +124,8 @@ public class CodeGen {
                     StringBuilder content = new StringBuilder();
                     content.append("package org.simantics.db.impl.query;\n");
                     content.append("\n");
+                    
+                    content.append("import org.simantics.db.ObjectResourceIdMap;\n");
                     content.append("import org.simantics.db.RelationInfo;\n");
                     content.append("import org.simantics.db.exception.DatabaseException;\n");
                     content.append("import org.simantics.db.impl.graph.ReadGraphImpl;\n");
@@ -157,7 +162,8 @@ public class CodeGen {
                     generateQuery(content, "ReadEntry", signatureRead, true);
                     generateQuery(content, "AsyncReadEntry", signatureAsyncRead, true);
                     generateQuery(content, "Types", signatureR1IntSet, true);
-                    generateQuery(content, "NamespaceIndex", signatureID2, true);
+                    //generateQuery(content, "NamespaceIndex", signatureID2, true);
+                    generateQuery(content, "ChildMap", signatureChildMap, true);
 
                     generateQuery(content, "AssertedStatements", signatureR2TIP, false);
                     generateQuery(content, "AssertedPredicates", signatureR1IP, false);