X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Facr%2FBasicSearchToQom.java;h=ab01d7fd33d2e999b2d0f078142a5acdff595292;hb=4d8b4ecbe45cf21de41299bd8cd2b8ca24af85df;hp=99b8392161e34758740b467fc9068a81812b25fa;hpb=bec133708e5694bc602c571a4d5ceddb7f43160a;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java index 99b8392..ab01d7f 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java @@ -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,6 +67,10 @@ 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); @@ -64,7 +82,7 @@ class BasicSearchToQom { } 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 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; } }