in oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java [462:589]
public void restrictPath(String addedPath, PathRestriction addedPathRestriction) {
if (addedPath == null) {
// currently unknown (prepare time)
addedPath = "/";
}
if (addedPath.startsWith(JoinConditionImpl.SPECIAL_PATH_PREFIX)) {
// not a real path, that means we only adapt the plan
// and that's it
if (pathPlan == null) {
pathPlan = "";
} else {
pathPlan += " && ";
}
pathPlan += addedPath + addedPathRestriction;
return;
}
// calculating the intersection of path restrictions
// this is ugly code, but I don't currently see a radically simpler method
switch (addedPathRestriction) {
case NO_RESTRICTION:
break;
case PARENT:
switch (pathRestriction) {
case NO_RESTRICTION:
break;
case PARENT:
// ignore as it's fast anyway
// (would need to loop to find a common ancestor)
break;
case EXACT:
case ALL_CHILDREN:
case DIRECT_CHILDREN:
if (!PathUtils.isAncestor(path, addedPath)) {
setAlwaysFalse();
}
break;
}
pathRestriction = PathRestriction.PARENT;
path = addedPath;
break;
case EXACT:
switch (pathRestriction) {
case NO_RESTRICTION:
break;
case PARENT:
if (!PathUtils.isAncestor(addedPath, path)) {
setAlwaysFalse();
}
break;
case EXACT:
if (!addedPath.equals(path)) {
setAlwaysFalse();
}
break;
case ALL_CHILDREN:
if (!PathUtils.isAncestor(path, addedPath)) {
setAlwaysFalse();
}
break;
case DIRECT_CHILDREN:
if (!PathUtils.getParentPath(addedPath).equals(path)) {
setAlwaysFalse();
}
break;
}
path = addedPath;
pathRestriction = PathRestriction.EXACT;
break;
case ALL_CHILDREN:
switch (pathRestriction) {
case NO_RESTRICTION:
path = addedPath;
pathRestriction = PathRestriction.ALL_CHILDREN;
break;
case PARENT:
case EXACT:
if (!PathUtils.isAncestor(addedPath, path)) {
setAlwaysFalse();
}
break;
case ALL_CHILDREN:
if (PathUtils.isAncestor(path, addedPath)) {
path = addedPath;
} else if (!path.equals(addedPath) && !PathUtils.isAncestor(addedPath, path)) {
setAlwaysFalse();
}
break;
case DIRECT_CHILDREN:
if (!path.equals(addedPath) && !PathUtils.isAncestor(addedPath, path)) {
setAlwaysFalse();
}
break;
}
break;
case DIRECT_CHILDREN:
switch (pathRestriction) {
case NO_RESTRICTION:
path = addedPath;
pathRestriction = PathRestriction.DIRECT_CHILDREN;
break;
case PARENT:
if (!PathUtils.isAncestor(addedPath, path)) {
setAlwaysFalse();
}
break;
case EXACT:
if (!PathUtils.getParentPath(path).equals(addedPath)) {
setAlwaysFalse();
}
break;
case ALL_CHILDREN:
if (!path.equals(addedPath) && !PathUtils.isAncestor(path, addedPath)) {
setAlwaysFalse();
} else {
path = addedPath;
pathRestriction = PathRestriction.DIRECT_CHILDREN;
}
break;
case DIRECT_CHILDREN:
if (!path.equals(addedPath)) {
setAlwaysFalse();
}
break;
}
break;
}
}