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 13:37:06 UTC

svn commit: r643367 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.java test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java

Author: mreutegg
Date: Tue Apr  1 04:36:38 2008
New Revision: 643367

URL: http://svn.apache.org/viewvc?rev=643367&view=rev
Log:
JCR-1104: JSR 283 support
- query (work in progress)

Added:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/JQOM2LuceneQueryBuilder.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=643367&r1=643366&r2=643367&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 04:36:38 2008
@@ -404,16 +404,7 @@
 
     public Object visit(LowerCaseImpl node, Object data) throws Exception {
         Object obj = ((DynamicOperandImpl) node.getOperand()).accept(this, data);
-        if (obj instanceof Transformable) {
-            ((Transformable) obj).setTransformation(TransformConstants.TRANSFORM_LOWER_CASE);
-            return obj;
-        } else if (obj instanceof TermQuery) {
-            return transformTermQuery((TermQuery) obj, false);
-        } else {
-            throw new InvalidQueryException(
-                    "lower-case not supported on operand "
-                    + node.getOperand().getClass().getName());
-        }
+        return transformCase(obj, data, false);
     }
 
     public Object visit(NodeLocalNameImpl node, Object data) {
@@ -679,16 +670,7 @@
 
     public Object visit(UpperCaseImpl node, Object data) throws Exception {
         Object obj = ((DynamicOperandImpl) node.getOperand()).accept(this, data);
-        if (obj instanceof Transformable) {
-            ((Transformable) obj).setTransformation(TransformConstants.TRANSFORM_UPPER_CASE);
-            return obj;
-        } else if (obj instanceof TermQuery) {
-            return transformTermQuery((TermQuery) obj, true);
-        } else {
-            throw new InvalidQueryException(
-                    "upper-case not supported on operand "
-                    + node.getOperand().getClass().getName());
-        }
+        return transformCase(obj, data, true);
     }
 
     //------------------------------< internal >--------------------------------
@@ -734,6 +716,43 @@
             throw new InvalidQueryException(
                     "Upper/LowerCase not supported on field "
                     + query.getTerm().field());
+        }
+    }
+
+    private Object transformCase(Object operand, Object data, boolean toUpperCase)
+            throws InvalidQueryException, Exception {
+        if (operand instanceof Transformable) {
+            ((Transformable) operand).setTransformation(toUpperCase ?
+                    TransformConstants.TRANSFORM_UPPER_CASE :
+                    TransformConstants.TRANSFORM_LOWER_CASE);
+            return operand;
+        } else if (operand instanceof TermQuery) {
+            return transformTermQuery((TermQuery) operand, toUpperCase);
+        } else if (operand instanceof LowerCaseImpl) {
+            LowerCaseImpl lc = (LowerCaseImpl) operand;
+            if (toUpperCase) {
+                // upper-case operand, ignore lower-case
+                return transformCase(lc.getOperand(), data, true);
+            } else {
+                // lower-cased twice
+                return ((DynamicOperandImpl) lc.getOperand()).accept(this, data);
+            }
+        } else if (operand instanceof UpperCaseImpl) {
+            UpperCaseImpl oc = (UpperCaseImpl) operand;
+            if (toUpperCase) {
+                // upper-cased twice
+                return ((DynamicOperandImpl) oc.getOperand()).accept(this, data);
+            } else {
+                // lower-case operand, ignore upper-case
+                return transformCase(oc.getOperand(), data, false);
+            }
+        } else if (operand instanceof CaseTermQuery) {
+            CaseTermQuery ctq = (CaseTermQuery) operand;
+            return transformTermQuery(new TermQuery(ctq.getTerm()), toUpperCase);
+        } else {
+            throw new InvalidQueryException(
+                    "lower/upper-case not supported on operand "
+                    + operand.getClass().getName());
         }
     }
 }

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java?rev=643367&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java Tue Apr  1 04:36:38 2008
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.qom;
+
+import org.apache.jackrabbit.spi.commons.query.jsr283.qom.DynamicOperand;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.Node;
+import javax.jcr.ValueFactory;
+import javax.jcr.PropertyType;
+import javax.jcr.query.Query;
+
+/**
+ * <code>UpperLowerCaseTest</code> performs tests with upper- and lower-case
+ * operands.
+ */
+public class UpperLowerCaseTest extends AbstractQOMTest {
+
+    private ValueFactory vf;
+
+    private Node node;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        vf = superuser.getValueFactory();
+        node = testRootNode.addNode(nodeName1);
+        node.setProperty(propertyName1, "abc");
+        node.setProperty(propertyName2, "ABC");
+        testRootNode.save();
+    }
+
+    protected void tearDown() throws Exception {
+        vf = null;
+        node = null;
+        super.tearDown();
+    }
+
+    public void testFullTextSearchScore() throws RepositoryException {
+        // TODO
+    }
+
+    public void testLength() throws RepositoryException {
+        // TODO
+    }
+
+    public void testNodeLocalName() throws RepositoryException {
+        // TODO
+    }
+
+    public void testNodeName() throws RepositoryException {
+        node.setProperty(propertyName1, "abc", PropertyType.NAME);
+        node.setProperty(propertyName2, "ABC", PropertyType.NAME);
+        node.save();
+
+        // upper case
+        checkQueries(qomFactory.propertyValue("s", propertyName1),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.NAME,
+                new boolean[]{false, false, false, false, true});
+
+        checkQueries(qomFactory.propertyValue("s", propertyName2),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.NAME,
+                new boolean[]{false, false, false, false, true});
+
+        // lower case
+        checkQueries(qomFactory.propertyValue("s", propertyName1),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.NAME,
+                new boolean[]{true, false, false, false, false});
+
+        checkQueries(qomFactory.propertyValue("s", propertyName2),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.NAME,
+                new boolean[]{true, false, false, false, false});
+    }
+
+    public void testPropertyValue() throws RepositoryException {
+        // upper case
+        checkQueries(qomFactory.propertyValue("s", propertyName1),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{false, false, false, false, true});
+
+        checkQueries(qomFactory.propertyValue("s", propertyName2),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{false, false, false, false, true});
+
+        // lower case
+        checkQueries(qomFactory.propertyValue("s", propertyName1),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{true, false, false, false, false});
+
+        checkQueries(qomFactory.propertyValue("s", propertyName2),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{true, false, false, false, false});
+    }
+
+    public void testUpperLowerCase() throws RepositoryException {
+        // first upper case, then lower case again
+        checkQueries(qomFactory.upperCase(qomFactory.propertyValue("s", propertyName1)),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{true, false, false, false, false});
+    }
+
+    public void testUpperCaseTwice() throws RepositoryException {
+        // upper case twice
+        checkQueries(qomFactory.upperCase(qomFactory.propertyValue("s", propertyName1)),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{false, false, false, false, true});
+    }
+
+    public void testLowerUpperCase() throws RepositoryException {
+        // first lower case, then upper case again
+        checkQueries(qomFactory.lowerCase(qomFactory.propertyValue("s", propertyName1)),
+                true, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{false, false, false, false, true});
+    }
+
+    public void testLowerCaseTwice() throws RepositoryException {
+        // lower case twice
+        checkQueries(qomFactory.lowerCase(qomFactory.propertyValue("s", propertyName1)),
+                false, OPERATOR_EQUAL_TO,
+                new String[]{"abc", "Abc", "aBc", "abC", "ABC"},
+                PropertyType.STRING,
+                new boolean[]{true, false, false, false, false});
+    }
+
+    //-------------------------------< internal >-------------------------------
+
+    private void checkQueries(DynamicOperand operand,
+                              boolean toUpper,
+                              int operator,
+                              String[] literals,
+                              int type,
+                              boolean[] matches) throws RepositoryException {
+        for (int i = 0; i < literals.length; i++) {
+            Query query = createQuery(operand, toUpper, operator, vf.createValue(literals[i], type));
+            checkResult(query.execute(), matches[i] ? new Node[]{node} : new Node[0]);
+        }
+    }
+    
+    private Query createQuery(DynamicOperand operand,
+                              boolean toUpper,
+                              int operator,
+                              Value literal) throws RepositoryException {
+        if (toUpper) {
+            operand = qomFactory.upperCase(operand);
+        } else {
+            operand = qomFactory.lowerCase(operand);
+        }
+        return qomFactory.createQuery(
+                qomFactory.selector(testNodeType, "s"),
+                qomFactory.and(
+                        qomFactory.childNode("s", testRoot),
+                        qomFactory.comparison(
+                                operand,
+                                operator,
+                                qomFactory.literal(literal)
+                        )
+                ), null, null);
+    }
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/qom/UpperLowerCaseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native