You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/10/18 17:34:13 UTC
svn commit: r1023853 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
Author: jukka
Date: Mon Oct 18 15:34:13 2010
New Revision: 1023853
URL: http://svn.apache.org/viewvc?rev=1023853&view=rev
Log:
JCR-2715: Improved join query performance
Minor fixes and improvements
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java?rev=1023853&r1=1023852&r2=1023853&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java Mon Oct 18 15:34:13 2010
@@ -17,7 +17,12 @@
package org.apache.jackrabbit.core.query.lucene.join;
import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN;
import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_LIKE;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_NOT_EQUAL_TO;
import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_ORDER_DESCENDING;
import java.util.ArrayList;
@@ -49,20 +54,26 @@ import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
import javax.jcr.query.qom.And;
+import javax.jcr.query.qom.BindVariableValue;
import javax.jcr.query.qom.ChildNode;
import javax.jcr.query.qom.Column;
import javax.jcr.query.qom.Comparison;
import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.DescendantNode;
+import javax.jcr.query.qom.FullTextSearch;
import javax.jcr.query.qom.Join;
import javax.jcr.query.qom.Literal;
+import javax.jcr.query.qom.LowerCase;
import javax.jcr.query.qom.Not;
import javax.jcr.query.qom.Operand;
import javax.jcr.query.qom.Or;
import javax.jcr.query.qom.Ordering;
+import javax.jcr.query.qom.PropertyExistence;
import javax.jcr.query.qom.PropertyValue;
import javax.jcr.query.qom.QueryObjectModelFactory;
import javax.jcr.query.qom.Selector;
import javax.jcr.query.qom.Source;
+import javax.jcr.query.qom.UpperCase;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
@@ -231,14 +242,34 @@ public class QueryEngine {
String right = toSqlOperand(c.getOperand2());
if (c.getOperator().equals(JCR_OPERATOR_EQUAL_TO)) {
return left + " = " + right;
+ } else if (c.getOperator().equals(JCR_OPERATOR_GREATER_THAN)) {
+ return left + " > " + right;
} else if (c.getOperator().equals(JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO)) {
return left + " >= " + right;
+ } else if (c.getOperator().equals(JCR_OPERATOR_LESS_THAN)) {
+ return left + " < " + right;
+ } else if (c.getOperator().equals(JCR_OPERATOR_LESS_THAN_OR_EQUAL_TO)) {
+ return left + " <= " + right;
+ } else if (c.getOperator().equals(JCR_OPERATOR_LIKE)) {
+ return left + " LIKE " + right;
+ } else if (c.getOperator().equals(JCR_OPERATOR_NOT_EQUAL_TO)) {
+ return left + " <> " + right;
} else {
throw new RepositoryException("Unsupported comparison: " + c);
}
} else if (constraint instanceof ChildNode) {
ChildNode cn = (ChildNode) constraint;
return "jcr:path LIKE '" + cn.getParentPath() + "/%'";
+ } else if (constraint instanceof DescendantNode) {
+ DescendantNode dn = (DescendantNode) constraint;
+ return "jcr:path LIKE '" + dn.getAncestorPath() + "/%'";
+ } else if (constraint instanceof PropertyExistence) {
+ PropertyExistence pe = (PropertyExistence) constraint;
+ return pe.getPropertyName() + " IS NOT NULL";
+ } else if (constraint instanceof FullTextSearch) {
+ FullTextSearch fts = (FullTextSearch) constraint;
+ String expr = toSqlOperand(fts.getFullTextSearchExpression());
+ return "CONTAINS(" + fts.getPropertyName() + ", " + expr + ")";
} else {
throw new RepositoryException("Unsupported constraint: " + constraint);
}
@@ -248,9 +279,15 @@ public class QueryEngine {
if (operand instanceof PropertyValue) {
PropertyValue pv = (PropertyValue) operand;
return pv.getPropertyName();
- } else if (operand instanceof Literal) {
- Literal literal = (Literal) operand;
- Value value = literal.getLiteralValue();
+ } else if (operand instanceof LowerCase) {
+ LowerCase lc = (LowerCase) operand;
+ return "LOWER(" + toSqlOperand(lc.getOperand()) + ")";
+ } else if (operand instanceof UpperCase) {
+ UpperCase uc = (UpperCase) operand;
+ return "UPPER(" + toSqlOperand(uc.getOperand()) + ")";
+ } else if ((operand instanceof Literal)
+ || (operand instanceof BindVariableValue)) {
+ Value value = evaluator.getValue(operand, null);
int type = value.getType();
if (type == PropertyType.LONG || type == PropertyType.DOUBLE) {
return value.getString();
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java?rev=1023853&r1=1023852&r2=1023853&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java Mon Oct 18 15:34:13 2010
@@ -34,6 +34,7 @@ import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
import javax.jcr.query.qom.QueryObjectModelFactory;
+import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
import org.apache.jackrabbit.core.query.lucene.SearchIndex;
import org.apache.jackrabbit.test.AbstractJCRTest;
@@ -70,10 +71,10 @@ public class AbstractQueryTest extends A
protected void checkResult(QueryResult result, int hits)
throws RepositoryException {
int count = 0;
- log.println("Nodes:");
- for (NodeIterator nodes = result.getNodes(); nodes.hasNext(); count++) {
- Node n = nodes.nextNode();
- log.println(" " + n.getPath());
+ log.println("Rows:");
+ for (Row row : JcrUtils.getRows(result)) {
+ log.println(" " + row);
+ count++;
}
if (count == 0) {
log.println(" NONE");