]> git.argeo.org Git - gpl/argeo-jcr.git/blobdiff - org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java
Improve logging
[gpl/argeo-jcr.git] / org.argeo.cms.jcr / src / org / argeo / cms / jcr / acr / BasicSearchToQom.java
index 99b8392161e34758740b467fc9068a81812b25fa..40005d692a7dec987e09aa0b22bab8181530d232 100644 (file)
@@ -1,8 +1,11 @@
 package org.argeo.cms.jcr.acr;
 
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO;
+
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.query.QueryManager;
@@ -15,13 +18,21 @@ import javax.jcr.query.qom.StaticOperand;
 import javax.xml.namespace.QName;
 
 import org.apache.jackrabbit.commons.query.sql2.QOMFormatter;
+import org.argeo.api.acr.DName;
 import org.argeo.api.acr.NamespaceUtils;
 import org.argeo.api.acr.search.BasicSearch;
 import org.argeo.api.acr.search.Constraint;
 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.acr.search.Eq;
+import org.argeo.api.acr.search.Gt;
+import org.argeo.api.acr.search.Gte;
+import org.argeo.api.acr.search.IsContentClass;
+import org.argeo.api.acr.search.IsDefined;
+import org.argeo.api.acr.search.Like;
+import org.argeo.api.acr.search.Lt;
+import org.argeo.api.acr.search.Lte;
+import org.argeo.api.acr.search.Not;
+import org.argeo.api.acr.search.PropertyValueContraint;
 import org.argeo.api.cms.CmsLog;
 
 /** Convert an ACR basic search to a JCR query. */
@@ -31,16 +42,19 @@ class BasicSearchToQom {
        private Session session;
        private QueryManager queryManager;
        private BasicSearch basicSearch;
-       QueryObjectModelFactory factory;
+       private QueryObjectModelFactory factory;
+
+       private String relPath;
 
-       QName contentClass = null;
+       private QName contentClass = null;
 
-       String selectorName = "content";
+       private String selectorName = "content";
 
        public BasicSearchToQom(Session session, BasicSearch basicSearch, String relPath) throws RepositoryException {
                this.session = session;
                this.queryManager = session.getWorkspace().getQueryManager();
                this.basicSearch = basicSearch;
+               this.relPath = relPath;
                factory = queryManager.getQOMFactory();
        }
 
@@ -53,18 +67,22 @@ class BasicSearchToQom {
                if (contentClass == null)
                        throw new IllegalArgumentException("No content class specified");
 
+               if (relPath != null) {
+                       qomConstraint = factory.and(qomConstraint, factory.descendantNode(selectorName, "/" + relPath));
+               }
+
                Selector source = factory.selector(NamespaceUtils.toPrefixedName(contentClass), selectorName);
 
                QueryObjectModel qom = factory.createQuery(source, qomConstraint, null, null);
-               if (log.isDebugEnabled()) {
+               if (log.isTraceEnabled()) {
                        String sql2 = QOMFormatter.format(qom);
-                       log.debug("JCR query:\n" + sql2 + "\n");
+                       log.trace("JCR query:\n" + sql2 + "\n");
                }
                return qom;
        }
 
        private javax.jcr.query.qom.Constraint toQomConstraint(Constraint constraint) throws RepositoryException {
-               javax.jcr.query.qom.Constraint qomConstraint;
+//             javax.jcr.query.qom.Constraint qomConstraint;
                if (constraint instanceof ContentFilter<?> where) {
                        List<Constraint> constraints = new ArrayList<>();
                        for (Constraint c : where.getConstraints()) {
@@ -78,35 +96,81 @@ class BasicSearchToQom {
                        }
 
                        if (constraints.isEmpty()) {
-                               qomConstraint = null;
+                               return null;
                        } else if (constraints.size() == 1) {
-                               qomConstraint = toQomConstraint(constraints.get(0));
+                               return toQomConstraint(constraints.get(0));
                        } else {
                                javax.jcr.query.qom.Constraint currQomConstraint = toQomConstraint(constraints.get(0));
+                               // QOM constraint may be null because only content classes where specified
+                               while (currQomConstraint == null) {
+                                       constraints.remove(0);
+                                       if (constraints.isEmpty())
+                                               return null;
+                                       currQomConstraint = toQomConstraint(constraints.get(0));
+                               }
+                               assert currQomConstraint != null : "currQomConstraint is null : " + constraints.get(0);
                                for (int i = 1; i < constraints.size(); i++) {
                                        Constraint c = constraints.get(i);
-                                       if (where.isUnion()) {
-                                               currQomConstraint = factory.or(currQomConstraint, toQomConstraint(c));
-                                       } else {
-                                               currQomConstraint = factory.and(currQomConstraint, toQomConstraint(c));
+                                       javax.jcr.query.qom.Constraint subQomConstraint = toQomConstraint(c);
+                                       if (subQomConstraint != null) { // isContentClass leads to null QOM constraint
+                                               assert subQomConstraint != null : "subQomConstraint";
+                                               if (where.isUnion()) {
+                                                       currQomConstraint = factory.or(currQomConstraint, subQomConstraint);
+                                               } else {
+                                                       currQomConstraint = factory.and(currQomConstraint, subQomConstraint);
+                                               }
                                        }
                                }
-                               qomConstraint = currQomConstraint;
+                               return currQomConstraint;
                        }
 
-               } else if (constraint instanceof Eq comp) {
-                       DynamicOperand dynamicOperand = factory.propertyValue(selectorName,
-                                       NamespaceUtils.toPrefixedName(comp.getProp()));
+               } else if (constraint instanceof PropertyValueContraint comp) {
+                       QName prop = comp.getProp();
+                       if (DName.creationdate.equals(prop))
+                               prop = JcrName.created.qName();
+                       else if (DName.getlastmodified.equals(prop))
+                               prop = JcrName.lastModified.qName();
+
+                       DynamicOperand dynamicOperand = factory.propertyValue(selectorName, NamespaceUtils.toPrefixedName(prop));
                        // TODO better convert attribute value
                        StaticOperand staticOperand = factory
-                                       .literal(session.getValueFactory().createValue(comp.getValue().toString()));
-                       qomConstraint = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO,
-                                       staticOperand);
+                                       .literal(JcrContent.convertSingleObject(session.getValueFactory(), comp.getValue()));
+                       javax.jcr.query.qom.Constraint res;
+                       if (comp instanceof Eq)
+                               res = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO,
+                                               staticOperand);
+                       else if (comp instanceof Lt)
+                               res = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN,
+                                               staticOperand);
+                       else if (comp instanceof Lte)
+                               res = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO,
+                                               staticOperand);
+                       else if (comp instanceof Gt)
+                               res = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN,
+                                               staticOperand);
+                       else if (comp instanceof Gte)
+                               res = factory.comparison(dynamicOperand,
+                                               QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO, staticOperand);
+                       else if (comp instanceof Like)
+                               res = factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_LIKE, staticOperand);
+                       else
+                               throw new UnsupportedOperationException("Constraint of type " + comp.getClass() + " is not supported");
+                       return res;
                } else if (constraint instanceof Not not) {
-                       qomConstraint = factory.not(toQomConstraint(not.getNegated()));
+                       return factory.not(toQomConstraint(not.getNegated()));
+               } else if (constraint instanceof IsDefined comp) {
+                       QName prop = comp.getProp();
+                       if (DName.checkedIn.equals(prop) || DName.checkedOut.equals(prop)) {
+                               DynamicOperand dynamicOperand = factory.propertyValue(selectorName, Property.JCR_IS_CHECKED_OUT);
+                               StaticOperand staticOperand = factory
+                                               .literal(session.getValueFactory().createValue(DName.checkedOut.equals(prop)));
+                               return factory.comparison(dynamicOperand, JCR_OPERATOR_EQUAL_TO, staticOperand);
+                       } else {
+                               return factory.propertyExistence(selectorName, NamespaceUtils.toPrefixedName(prop));
+                       }
                } else {
                        throw new IllegalArgumentException("Constraint " + constraint.getClass() + " is not supported");
                }
-               return qomConstraint;
+//             return qomConstraint;
        }
 }