public String getPlan(Filter filter, NodeState root) {
StringBuilder buff = new StringBuilder("property");
StringBuilder notIndexed = new StringBuilder();
PropertyIndexLookup lookup = getLookup(root);
Cheapest cheapest = findCheapestProperty(filter, lookup);
PropertyRestriction pr = cheapest.propertyRestriction;
if (pr != null) {
String propertyName = PathUtils.getName(pr.propertyName);
// TODO support indexes on a path
// currently, only indexes on the root node are supported
if (lookup.isIndexed(propertyName, "/", filter)) {
if (pr.firstIncluding && pr.lastIncluding
&& pr.first != null && pr.first.equals(pr.last)) {
buff.append(' ').append(propertyName).append('=').append(pr.first);
} else {
buff.append(' ').append(propertyName);
}
} else if (pr.list != null) {
buff.append(' ').append(propertyName).append(" IN(");
int i = 0;
for (PropertyValue pv : pr.list) {
if (i++ > 0) {
buff.append(", ");
}
buff.append(pv);
}
buff.append(')');
} else {
notIndexed.append(' ').append(propertyName);
if (!pr.toString().isEmpty()) {
notIndexed.append(':').append(pr);
}
}
}
if (notIndexed.length() > 0) {