From bec133708e5694bc602c571a4d5ceddb7f43160a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 28 Apr 2023 05:38:06 +0200 Subject: [PATCH] Improve JCR ACR search --- ...BasicSearch.java => BasicSearchToQom.java} | 23 ++++++++++++++----- .../argeo/cms/jcr/acr/JcrContentProvider.java | 3 +-- 2 files changed, 18 insertions(+), 8 deletions(-) rename org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/{search/JcrBasicSearch.java => BasicSearchToQom.java} (82%) diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/search/JcrBasicSearch.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java similarity index 82% rename from org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/search/JcrBasicSearch.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java index 14bb584..99b8392 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/search/JcrBasicSearch.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java @@ -1,19 +1,20 @@ -package org.argeo.cms.jcr.acr.search; +package org.argeo.cms.jcr.acr; import java.util.ArrayList; import java.util.List; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.qom.DynamicOperand; +import javax.jcr.query.qom.QueryObjectModel; import javax.jcr.query.qom.QueryObjectModelConstants; import javax.jcr.query.qom.QueryObjectModelFactory; import javax.jcr.query.qom.Selector; import javax.jcr.query.qom.StaticOperand; import javax.xml.namespace.QName; +import org.apache.jackrabbit.commons.query.sql2.QOMFormatter; import org.argeo.api.acr.NamespaceUtils; import org.argeo.api.acr.search.BasicSearch; import org.argeo.api.acr.search.Constraint; @@ -21,8 +22,12 @@ import org.argeo.api.acr.search.ContentFilter; import org.argeo.api.acr.search.ContentFilter.Eq; import org.argeo.api.acr.search.ContentFilter.IsContentClass; import org.argeo.api.acr.search.ContentFilter.Not; +import org.argeo.api.cms.CmsLog; + +/** Convert an ACR basic search to a JCR query. */ +class BasicSearchToQom { + private final static CmsLog log = CmsLog.getLog(BasicSearchToQom.class); -public class JcrBasicSearch { private Session session; private QueryManager queryManager; private BasicSearch basicSearch; @@ -32,13 +37,14 @@ public class JcrBasicSearch { String selectorName = "content"; - public JcrBasicSearch(Session session, BasicSearch basicSearch, String relPath) throws RepositoryException { + public BasicSearchToQom(Session session, BasicSearch basicSearch, String relPath) throws RepositoryException { + this.session = session; this.queryManager = session.getWorkspace().getQueryManager(); this.basicSearch = basicSearch; factory = queryManager.getQOMFactory(); } - public Query createQuery() throws RepositoryException { + public QueryObjectModel createQuery() throws RepositoryException { ContentFilter where = basicSearch.getWhere(); // scan for content classes // TODO deal with complex cases of multiple types @@ -49,7 +55,12 @@ public class JcrBasicSearch { Selector source = factory.selector(NamespaceUtils.toPrefixedName(contentClass), selectorName); - return factory.createQuery(source, qomConstraint, null, null); + QueryObjectModel qom = factory.createQuery(source, qomConstraint, null, null); + if (log.isDebugEnabled()) { + String sql2 = QOMFormatter.format(qom); + log.debug("JCR query:\n" + sql2 + "\n"); + } + return qom; } private javax.jcr.query.qom.Constraint toQomConstraint(Constraint constraint) throws RepositoryException { diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java index 3622399..bc4aa5b 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentProvider.java @@ -27,7 +27,6 @@ import org.argeo.api.acr.spi.ProvidedSession; import org.argeo.api.cms.CmsConstants; import org.argeo.cms.acr.ContentUtils; import org.argeo.cms.jcr.CmsJcrUtils; -import org.argeo.cms.jcr.acr.search.JcrBasicSearch; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; @@ -149,7 +148,7 @@ public class JcrContentProvider implements ContentProvider, NamespaceContext { public Spliterator search(ProvidedSession session, BasicSearch search, String relPath) { try { Session jcrSession = getJcrSession(session, jcrWorkspace); - JcrBasicSearch jcrBasicSearch = new JcrBasicSearch(jcrSession, search, relPath); + BasicSearchToQom jcrBasicSearch = new BasicSearchToQom(jcrSession, search, relPath); Query query = jcrBasicSearch.createQuery(); QueryResult queryResult = query.execute(); return new QueryResultSpliterator(session, queryResult.getNodes()); -- 2.30.2