CQ 5查询构建器:获取没有jcr:content节点的页面列表

时间:2014-07-29 15:56:03

标签: cq5

使用查询构建器(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

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