如何使用版本标签搜索JCR节点

时间:2014-08-05 14:49:03

标签: jcr modeshape jcr-sql2

以下代码段用于使用ModeShape向节点添加标签。我可以使用什么查询字符串来使用QueryManager查询此节点?似乎无法使用QueryManager查询versionHistory端的节点。

        VersionHistory history = session.getWorkspace().getVersionManager()
                .getVersionHistory(node.getPath());
        history.addVersionLabel(version.getName(), "label", true);

我找不到任何包含以下与版本历史记录相关的查询的节点。这个查询中有什么遗漏吗?

            Query query = queryManager
                    .createQuery("select * from [nt:base]", Query.JCR_SQL2);

谢谢!

1 个答案:

答案 0 :(得分:1)

所有版本信息都存储在工作区nt:versionHistory区域下的/jcr:system/jcr:versionStorage节点上(在存储库中的所有工作区之间共享)。这个区域的结构看起来像这样:

  + jcr:system
    + jcr:versionStorage   {jcr:primaryType = mode:versionStorage}
      + b4   {jcr:primaryType = mode:versionHistoryFolder}
        + 6d   {jcr:primaryType = mode:versionHistoryFolder}
          + de   {jcr:primaryType = mode:versionHistoryFolder}
            + 298905f76361779339fa3ccacc4f47664255   {jcr:primaryType = nt:versionHistory}
              + jcr:versionLabels  {jcr:primaryType = nt:versionLabels}
              + jcr:rootVersion  {jcr:primaryType = nt:version}
                - jcr:uuid = ...
                - jcr:created = ...
                + jcr:frozenNode  {jcr:primaryType = nt:frozenNode}
                  - jcr:frozenUuid
                  - jcr:frozenPrimaryType
                  - jcr:frozenMixinTypes

jcr:versionLabels节点包含每个标签的属性,其中属性的名称是标签字符串,属性的值是对该标签所适用的版本的引用。

为了找到可版本化节点的标签版本,您实际上必须查询此" / jcr:system / jcr:versionStorage"的内容。区域,使用适当的类型和连接约束。

例如,要查找具有特定标签" foo"的版本,您可以执行以下操作:

SELECT versioned.* FROM [nt:frozenNode] AS versioned JOIN [nt:version] AS version ON ISCHILDNODE(versioned,version) JOIN [nt:versionLabels] AS label ON label.myLabel = version.[jcr:uuid]

搜索所有nt:versionLabels个节点,寻找名为' myLabel' (这是您的标签的名称),然后找到它指向的nt:version节点,以及nt:frozenNode,它是该版本的可版本化节点的副本。

如您所见,JCR规范规定的版本历史表示很难查询。

或者,您可以分两步完成此操作:

  1. 使用查询查找具有特定标签
  2. 的版本的jcr:uuid
  3. 对于每个标识符,找到可版本化节点的UUID,并使用VersionManager查找该节点的版本历史记录并找到标记的版本。