]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/adapter/impl/EntityInstances.java
Improvements to Lucene indexing
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / adapter / impl / EntityInstances.java
index 488545c5fec781c80876b9cf7035f8b0eed31c06..93903fb9b2d4371e01f521eca67c55cc925d33bf 100644 (file)
@@ -70,58 +70,68 @@ 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.quoteTerm(typeName) );
+            }
+            if (!emptyFilter) {
+                if (sb.length() > 0)
+                    sb.append(" AND ");
+                sb.append(filter);
+            }
+            if (sb.length() == 0) {
+               sb.append("*:*");
+            }
+            return sb.toString();
         }
-        
+
         @Override
         public String toString() {
                return "QueryIndex " + parameter + " " + parameter2 + " " + parameter3;
@@ -134,7 +144,8 @@ public class EntityInstances implements Instances {
 
                @Override
                public int getType() {
-                       return RequestFlags.IMMEDIATE_UPDATE;
+                       // This query should not be immediate update since it takes a long time!
+                       return RequestFlags.INVALIDATE;
                }
 
     }
@@ -191,13 +202,7 @@ public class EntityInstances implements Instances {
     @Override
     public Collection<Resource> findByName(ReadGraph graph, Resource model,
             String name) throws DatabaseException {
-        Layer0 L0 = Layer0.getInstance(graph);
-       CollectionSupport coll = graph.getService(CollectionSupport.class);
-        List<Resource> results = coll.createList();
-        for(Resource match : find(graph, model, name)) {
-            if(name.equals(graph.getPossibleRelatedValue(match, L0.HasName, Bindings.STRING))) results.add(match);
-        }
-        return results;
+        return find(graph, model, IndexQueries.quoteTerm(name));
     }
 
 }