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;
@Override
public int getType() {
- return RequestFlags.IMMEDIATE_UPDATE;
+ // This query should not be immediate update since it takes a long time!
+ return RequestFlags.INVALIDATE;
}
}
@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));
}
}