]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/adapter/impl/EntityInstances.java
Fixed index query regression in L0.Entity instance queries
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / adapter / impl / EntityInstances.java
index 488545c5fec781c80876b9cf7035f8b0eed31c06..07ddce7bd176e1fe2d8eca40819a0183ca3b64bf 100644 (file)
@@ -70,58 +70,65 @@ public class EntityInstances implements Instances {
         public List<Resource> perform(ReadGraph graph)
                 throws DatabaseException {
             Resource type = parameter2;
-
-            Layer0 L0 = Layer0.getInstance(graph);
-            Layer0X L0X = Layer0X.getInstance(graph);
-            String typeName = graph.getRelatedValue(type, L0.HasName);
-            if (typeName.isEmpty())
+            String filter = constructLuceneQuery(graph, type, parameter3);
+            if (filter == null)
                 return Collections.emptyList();
 
             @SuppressWarnings({ "unchecked", "rawtypes" })
-            Function dependencyResources = graph.syncRequest(new Adapter(L0X.DependencyResources, Function.class), TransientCacheListener.<Function>instance());
-
-            StringBuilder filtersb = new StringBuilder();
-            filtersb.append("Types:*").append( IndexQueries.escape( typeName, true ) );
-            if (parameter3.length() > 0)
-                filtersb.append(" AND ").append( parameter3 );
-            String filter = filtersb.toString();
+            Function dependencyResources = graph.syncRequest(new Adapter(Layer0X.getInstance(graph).DependencyResources, Function.class), TransientCacheListener.<Function>instance());
 
             if (TRACE_QUERIES) {
                 System.out.println("EntityInstances.QueryIndex: finding " + filter + " from index " + graph.getPossibleURI(parameter));
                 //new Exception("EntityInstances: finding " + filter + " from index " + graph.getPossibleURI(parameter)).printStackTrace();
             }
-            
+
             @SuppressWarnings("unchecked")
-                       List<Resource> results = (List<Resource>)dependencyResources.apply(graph, parameter, filter);
+            List<Resource> results = (List<Resource>)dependencyResources.apply(graph, parameter, filter);
             if (results == null || results.isEmpty())
                 return Collections.emptyList();
 
             if (TRACE_QUERIES)
                 System.out.println("  EntityInstances.QueryIndex: got " + results.size() + " results");
 
-//            // TreeSet to keep the results in deterministic order.
-//            Set<Resource> resultSet = new TreeSet<Resource>();
-//            for (Map<String, Object> entry : results) {
-//                Resource res = (Resource)entry.get("Resource");
-//                if (res != null && !resultSet.contains(res))
-//                    resultSet.add(res);
-//            }
+            // Optimize single result case.
+            if (results.size() == 1) {
+                Resource singleResult = results.get(0);
+                List<Resource> result = graph.isInstanceOf(singleResult, type) ? results : Collections.emptyList();
+                if (TRACE_QUERIES)
+                    System.out.println("  EntityInstances.QueryIndex: got " + results.size() + " unique type-matching results");
+                return result;
+            }
 
             CollectionSupport coll = graph.getService(CollectionSupport.class);
-            List<Resource> result = coll.createList();
-            
-            for (Resource res : Layer0Utils.sortByCluster(graph, results)) {
+            List<Resource> result = coll.createList(results.size());
+            for (Resource res : Layer0Utils.sortByCluster(graph, results))
                 if (graph.isInstanceOf(res, type))
                     result.add(res);
-            }
 
             if (TRACE_QUERIES)
                 System.out.println("  EntityInstances.QueryIndex: got " + results.size() + " unique type-matching results");
-            
+
             return result;
+        }
 
+        private String constructLuceneQuery(ReadGraph graph, Resource type, String filter) throws DatabaseException {
+            Layer0 L0 = Layer0.getInstance(graph);
+            StringBuilder sb = new StringBuilder();
+            boolean emptyFilter = filter.isEmpty();
+            if (emptyFilter || !type.equals(L0.Entity)) {
+                String typeName = graph.getPossibleRelatedValue(type, L0.HasName, Bindings.STRING);
+                if (typeName == null || typeName.isEmpty())
+                    return null;
+                sb.append("Types:").append( IndexQueries.escape( typeName, true ) );
+            }
+            if (!emptyFilter) {
+                if (sb.length() > 0)
+                    sb.append(" AND ");
+                sb.append(filter);
+            }
+            return sb.toString();
         }
-        
+
         @Override
         public String toString() {
                return "QueryIndex " + parameter + " " + parameter2 + " " + parameter3;