You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/04/01 15:35:31 UTC
svn commit: r643391 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/query/lucene/
test/java/org/apache/jackrabbit/core/query/
Author: mreutegg
Date: Tue Apr 1 06:35:28 2008
New Revision: 643391
URL: http://svn.apache.org/viewvc?rev=643391&view=rev
Log:
JCR-1104: JSR 283 support
- query (work in progress)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/UpperLowerCaseQueryTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java?rev=643391&r1=643390&r2=643391&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java Tue Apr 1 06:35:28 2008
@@ -749,6 +749,18 @@
} else if (operand instanceof CaseTermQuery) {
CaseTermQuery ctq = (CaseTermQuery) operand;
return transformTermQuery(new TermQuery(ctq.getTerm()), toUpperCase);
+ } else if (operand instanceof MatchAllQuery) {
+ return operand;
+ } else if (operand instanceof BooleanQuery) {
+ BooleanQuery original = (BooleanQuery) operand;
+ BooleanQuery transformed = new BooleanQuery();
+ BooleanClause[] clauses = original.getClauses();
+ for (int i = 0; i < clauses.length; i++) {
+ Query q = (Query) transformCase(clauses[i].getQuery(),
+ data, toUpperCase);
+ transformed.add(q, clauses[i].getOccur());
+ }
+ return transformed;
} else {
throw new InvalidQueryException(
"lower/upper-case not supported on operand "
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=643391&r1=643390&r2=643391&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 Tue Apr 1 06:35:28 2008
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.core.query;
import org.apache.jackrabbit.test.AbstractJCRTest;
+import org.apache.jackrabbit.spi.commons.query.jsr283.qom.QueryObjectModelFactory;
import javax.jcr.query.QueryResult;
import javax.jcr.query.RowIterator;
@@ -39,13 +40,17 @@
protected QueryManager qm;
+ protected QueryObjectModelFactory qomFactory;
+
protected void setUp() throws Exception {
super.setUp();
qm = superuser.getWorkspace().getQueryManager();
+ qomFactory = ((QueryManagerImpl) qm).getQOMFactory();
}
protected void tearDown() throws Exception {
qm = null;
+ qomFactory = null;
super.tearDown();
}
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/UpperLowerCaseQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/UpperLowerCaseQueryTest.java?rev=643391&r1=643390&r2=643391&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/UpperLowerCaseQueryTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/UpperLowerCaseQueryTest.java Tue Apr 1 06:35:28 2008
@@ -16,19 +16,40 @@
*/
package org.apache.jackrabbit.core.query;
+import org.apache.jackrabbit.spi.commons.query.jsr283.qom.QueryObjectModelConstants;
+
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.QueryResult;
import java.util.HashSet;
import java.util.Set;
import java.util.Random;
+import java.util.Map;
+import java.util.HashMap;
/**
* <code>UpperLowerCaseQueryTest</code> tests the functions fn:lower-case() and
- * fn:upper-case() in XPath and LOWER() and UPPER() in SQL.
+ * fn:upper-case() in XPath, LOWER() and UPPER() in SQL and UpperCase and
+ * LowerCase in JQOM.
*/
-public class UpperLowerCaseQueryTest extends AbstractQueryTest {
+public class UpperLowerCaseQueryTest extends AbstractQueryTest implements QueryObjectModelConstants {
+
+ /**
+ * Maps operator strings to QueryObjectModelConstants.
+ */
+ private static final Map OPERATORS = new HashMap();
+
+ static {
+ OPERATORS.put("=", new Integer(OPERATOR_EQUAL_TO));
+ OPERATORS.put(">", new Integer(OPERATOR_GREATER_THAN));
+ OPERATORS.put(">=", new Integer(OPERATOR_GREATER_THAN_OR_EQUAL_TO));
+ OPERATORS.put("<", new Integer(OPERATOR_LESS_THAN));
+ OPERATORS.put("<=", new Integer(OPERATOR_LESS_THAN_OR_EQUAL_TO));
+ OPERATORS.put("like", new Integer(OPERATOR_LIKE));
+ OPERATORS.put("!=", new Integer(OPERATOR_NOT_EQUAL_TO));
+ }
public void testEqualsGeneralComparison() throws RepositoryException {
check(new String[]{"foo", "Foo", "fOO", "FOO", "fooBar", "fo", "fooo"},
@@ -272,6 +293,21 @@
sqlOperation + " '" + queryTerm.toLowerCase() + "'";
executeSQLQuery(sql, nodes);
+ QueryResult result = qomFactory.createQuery(
+ qomFactory.selector(testNodeType, "s"),
+ qomFactory.and(
+ qomFactory.childNode("s", testRoot),
+ qomFactory.comparison(
+ qomFactory.lowerCase(
+ qomFactory.propertyValue("s", propertyName1)),
+ getOperatorForString(operation),
+ qomFactory.literal(
+ superuser.getValueFactory().createValue(
+ queryTerm.toLowerCase()))
+ )
+ ), null, null).execute();
+ checkResult(result, nodes);
+
// run queries with upper-case
xpath = testPath;
if (operation.equals("like")) {
@@ -287,9 +323,32 @@
testRoot + "/%' and UPPER(" + propertyName1 + ") " +
sqlOperation + " '" + queryTerm.toUpperCase() + "'";
executeSQLQuery(sql, nodes);
+
+ result = qomFactory.createQuery(
+ qomFactory.selector(testNodeType, "s"),
+ qomFactory.and(
+ qomFactory.childNode("s", testRoot),
+ qomFactory.comparison(
+ qomFactory.upperCase(
+ qomFactory.propertyValue("s", propertyName1)),
+ getOperatorForString(operation),
+ qomFactory.literal(
+ superuser.getValueFactory().createValue(
+ queryTerm.toUpperCase()))
+ )
+ ), null, null).execute();
+ checkResult(result, nodes);
}
private char getRandomChar(String pool, Random random) {
return pool.charAt(random.nextInt(pool.length()));
+ }
+
+ protected static int getOperatorForString(String operator) {
+ Integer i = (Integer) OPERATORS.get(operator);
+ if (i == null) {
+ throw new IllegalArgumentException("unknown operator: " + operator);
+ }
+ return i.intValue();
}
}