0

以下代码段用于使用 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);

谢谢!

4

1 回答 1

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节点包含每个标签的属性,其中属性的名称是标签字符串,属性的值是对该标签应用的版本的 REFERENCE。

为了找到可版本化节点的标记版本,您实际上必须使用适当的类型和连接约束来查询这个“/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. 使用查询来查找jcr:uuid具有特定标签的版本
  2. 对于这些标识符中的每一个,找到可版本化节点的 UUID 并使用 VersionManager 查找该节点的版本历史记录并找到标记的版本。
于 2014-08-05T17:17:35.867 回答