使用查询构建器(http://localhost:4502/libs/cq/search/content/querydebug.html
),我希望得到一个没有jcr:content
子节点的页面列表。
我尝试了节点,项目名称等,但找不到正确的查询。感谢您的帮助。
path=/content/products
type=cq:Page
node=jcr:content
node.operation=exists
node.operation=not
p.limit=-1
答案 0 :(得分:2)
CQ5 Query Builder将提供的查询转换为Jackrabbit XPath查询。后者并不支持测试孩子的存在。遵循XPath理论上应该有效:
/jcr:root/content//element(*, cq:Page)[not(jcr:content)]
但结果是空的。有一个JIRA improvement来添加这样的功能,但看起来已经放弃了。
所以,我们必须手动检查。由于CQ谓词不提供此类功能(您在查询中没有使用node
谓词),因此我们需要编写一个新谓词:
@Component(metatype = false, factory = "com.day.cq.search.eval.PredicateEvaluator/child")
public class ChildrenPredicateEvaluator extends AbstractPredicateEvaluator {
public boolean includes(Predicate p, Row row, EvaluationContext context) {
final Resource resource = context.getResource(row);
final String name = p.get("name", "");
final boolean childExists;
if (name.isEmpty()) {
childExists = resource.hasChildren();
} else {
childExists = resource.getChild(name) != null;
}
final String operator = p.get("operator", "exists");
if ("not_exists".equals(operator)) {
return !childExists;
} else {
return childExists;
}
}
public boolean canXpath(Predicate predicate, EvaluationContext context) {
return false;
}
public boolean canFilter(Predicate predicate, EvaluationContext context) {
return true;
}
}
我们可以按如下方式使用它:
child.name=wantedChild
child.operator=exists
// or
child.name=unwantedChild
child.operator=not_exists
您也可以跳过child.name
行,检查是否有儿童存在/不存在。
因此,使用此谓词的查询将如下所示:
path=/content/products
type=cq:Page
child.name=jcr:content
child.operator=not_exists
p.limit=-1