2015-02-11 5 views
1

У меня есть репозиторий контента JCR, реализованный в ModeShape (4.0.0.Final). Структура хранилища довольно проста и выглядит следующим образом:Запрос для общих узлов в JCR (ModeShape)

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

    Tags/ 
     Foo/ 
     Bar/ 
     .../ 

содержание изначально создается и хранится в /Content как [nt:unstructured] узлов с [mix:shareable] Mixin. Когда элемент контента помечен, узел тега сначала создается под /Tags, если он еще не существует, а узел контента разделяется/клонируется на узел тега, используя Workspace.clone(...), как описано 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 Content Explorer или программно session.getRootNode().getNode("Tags/Foo").getNodes()). Но я не могу найти какие-либо общие узлы, используя запрос!

Моя первая попытка (с использованием 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) 

... что запрос иначе работает, и возвращает ожидаемый результат (все содержание). Он просто не работает при поиске общих узлов.

Как правильно найти общие узлы в JCR с помощью режима ModeShape?

Обновление: я обновил до 4.1.0. Финал, чтобы узнать, помогло ли это, но это не повлияло на описанное поведение.

+0

Я опубликовал тот же вопрос на форумах [JBoss/ModeShape] (https://developer.jboss.org/message/918745#918745) из-за отсутствия ответов здесь. – haraldK

ответ

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.

Возможно, я ошибаюсь, но я не совсем уверен, что any Реализация JCR возвращает несколько строк для одного общего узла, но я могу ошибаться.

 Смежные вопросы

  • Нет связанных вопросов^_^