查询JCR中的共享节点(ModeShape)

时间:2015-02-11 08:34:59

标签: jcr modeshape jcr-sql2

我有一个在ModeShape(4.0.0.Final)中实现的JCR内容存储库。存储库的结构非常简单,如下所示:

/ (root)
    Content/
        Item 1
        Item 2
        Item 3
        ...

    Tags/
        Foo/
        Bar/
        .../

最初创建内容并将其存储在/Content作为[nt:unstructured]节点的[mix:shareable] mixin下。标记内容项时,首先在/Tags下创建标记节点(如果它尚不存在),并使用Workspace.clone(...)使用session.getRootNode().getNode("Tags/Foo").getNodes()将内容节点共享/克隆到标记节点,如in the JCR 2.0 spec, section 14.1, Creation of Shared Nodes所述

(我发现这不是特别优雅,我刚刚读过this answer, about creating a tag based search system in JCR,所以我意识到这可能不是最好/最快/最可扩展的解决方案。但是我“继承”了我之前的开发人员的这个解决方案,所以我希望我不必重写所有内容......)

无论如何,共享本身似乎有效(我可以使用ModeShape内容浏览器Web应用程序验证节点是否存在,或JCR_SQL2以编程方式验证)。 但我无法使用查询找到任何共享节点!

我的初步尝试(使用SELECT * FROM [nt:unstructured] AS content WHERE PATH(content) LIKE '/Tags/Foo/%' // ISDECENDANTNODE(content, '/Tags/Foo') gives same result ORDER BY NAME(content) 语法)是:

[mix:shareable]

结果集让我惊讶不已。

我也尝试过这样的SELECT * FROM [mix:shareable] AS content WHERE PATH(content) LIKE '/Tags/Foo/%' // ISDECENDANTNODE(content, '/Tags/Foo') gives same result ORDER BY NAME(content) 搜索:

SELECT * FROM [nt:unstructured] AS content
    WHERE PATH(content) LIKE '/Content/%' // ISDECENDANTNODE(content, '/Content') works just as well
    ORDER BY NAME(content)

这也返回了一个空的结果集。

我可以从查询中看到:

{{1}}

...查询否则有效,并返回预期结果(所有内容)。它在搜索共享节点时不起作用。

如何使用ModeShape在JCR中正确搜索共享节点?

更新:我升级到4.1.0.Final以查看是否有帮助,但它对所描述的行为没有影响。

1 个答案:

答案 0 :(得分:2)

ModeShape forum

交叉发布

共享节点实际上只是出现在工作空间中多个位置的单个节点,因此它并不完全清楚它在语义上意味着为该一个可共享节点获取多个查询结果。每Section 14.16 of the JSR-283 (JCR 2.0) specification个实现可以在一个或多个/所有这些位置的查询结果中自由包含可共享节点。

ModeShape 2.x和3.x始终只在查询结果中返回共享节点的单个位置,因为这是参考实现的行为,这是我们从用户那里得到的反馈。当我们使用Modeshape 4.0时,我们试图使得返回多个结果成为可能,但我们遇到了TCK的问题以及这种新预期行为的不确定性。因此,我们放弃了目标并实现了查询以仅返回其中一个共享位置,就像我们使用2.x和3.x一样。

我可能错了,但我不确定任何 JCR实现是否为单个共享节点返回多行,但我可能错了。