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 2011/03/10 15:39:38 UTC

svn commit: r1080235 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/c...

Author: jukka
Date: Thu Mar 10 14:39:37 2011
New Revision: 1080235

URL: http://svn.apache.org/viewvc?rev=1080235&view=rev
Log:
JCR-2853: QOM utility classes in jcr-commons

Move OperandEvaluator to jcr-commons.

Add a simple value factory class to simplify testing.

Added:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/SimpleValueFactory.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/query/qom/OperandEvaluator.java
      - copied, changed from r1080186, jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/OperandEvaluator.java
Removed:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/OperandEvaluator.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/EquiJoinMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/QueryEngine.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/LuceneQueryFactory.java Thu Mar 10 14:39:37 2011
@@ -90,10 +90,10 @@ import javax.jcr.query.qom.UpperCase;
 import org.apache.jackrabbit.commons.predicate.Predicate;
 import org.apache.jackrabbit.commons.predicate.Predicates;
 import org.apache.jackrabbit.commons.predicate.RowPredicate;
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.id.NodeId;
-import org.apache.jackrabbit.core.query.lucene.join.OperandEvaluator;
 import org.apache.jackrabbit.core.query.lucene.join.SelectorRow;
 import org.apache.jackrabbit.core.query.lucene.join.ValueComparator;
 import org.apache.jackrabbit.spi.Name;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/AbstractRow.java Thu Mar 10 14:39:37 2011
@@ -26,6 +26,8 @@ import javax.jcr.query.Row;
 import javax.jcr.query.qom.Operand;
 import javax.jcr.query.qom.PropertyValue;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 abstract class AbstractRow implements Row {
 
     private final Map<String, PropertyValue> columns;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/ChildNodeJoinMerger.java Thu Mar 10 14:39:37 2011
@@ -33,6 +33,8 @@ import javax.jcr.query.qom.Join;
 import javax.jcr.query.qom.PropertyValue;
 import javax.jcr.query.qom.QueryObjectModelFactory;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 class ChildNodeJoinMerger extends JoinMerger {
 
     private final String childSelector;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/DescendantNodeJoinMerger.java Thu Mar 10 14:39:37 2011
@@ -33,6 +33,8 @@ import javax.jcr.query.qom.Join;
 import javax.jcr.query.qom.PropertyValue;
 import javax.jcr.query.qom.QueryObjectModelFactory;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 class DescendantNodeJoinMerger extends JoinMerger {
 
     private final String descendantSelector;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/EquiJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/EquiJoinMerger.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/EquiJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/EquiJoinMerger.java Thu Mar 10 14:39:37 2011
@@ -36,6 +36,8 @@ import javax.jcr.query.qom.Literal;
 import javax.jcr.query.qom.PropertyValue;
 import javax.jcr.query.qom.QueryObjectModelFactory;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 class EquiJoinMerger extends JoinMerger {
 
     private final PropertyValue leftProperty;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinMerger.java Thu Mar 10 14:39:37 2011
@@ -46,6 +46,7 @@ import javax.jcr.query.qom.Source;
 
 import org.apache.jackrabbit.commons.iterator.RowIterable;
 import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
 
 /**
  * A join merger is used by the {@link QueryEngine} class to efficiently

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/JoinRow.java Thu Mar 10 14:39:37 2011
@@ -24,6 +24,8 @@ import javax.jcr.RepositoryException;
 import javax.jcr.query.Row;
 import javax.jcr.query.qom.PropertyValue;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 public class JoinRow extends AbstractRow {
 
     private final Row leftRow;

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=1080235&r1=1080234&r2=1080235&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 Thu Mar 10 14:39:37 2011
@@ -57,6 +57,7 @@ import javax.jcr.query.qom.Source;
 
 import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
 import org.apache.jackrabbit.core.query.lucene.LuceneQueryFactory;
 
 public class QueryEngine {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SameNodeJoinMerger.java Thu Mar 10 14:39:37 2011
@@ -34,6 +34,8 @@ import javax.jcr.query.qom.PropertyValue
 import javax.jcr.query.qom.QueryObjectModelFactory;
 import javax.jcr.query.qom.SameNodeJoinCondition;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 class SameNodeJoinMerger extends JoinMerger {
 
     private final String selector1;

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java?rev=1080235&r1=1080234&r2=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/SelectorRow.java Thu Mar 10 14:39:37 2011
@@ -22,6 +22,8 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.query.qom.PropertyValue;
 
+import org.apache.jackrabbit.commons.query.qom.OperandEvaluator;
+
 /**
  * A row implementation for a query with just a single selector.
  */

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/SimpleValueFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/SimpleValueFactory.java?rev=1080235&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/SimpleValueFactory.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/SimpleValueFactory.java Thu Mar 10 14:39:37 2011
@@ -0,0 +1,43 @@
+/*
+ * 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.commons;
+
+import javax.jcr.ValueFormatException;
+
+import org.apache.jackrabbit.value.AbstractValueFactory;
+
+/**
+ * Simple value factory implementation for use mainly in testing.
+ * Complex value types such as names, paths and references are kept
+ * just as strings, and no format checks nor any namespace prefix
+ * updates are made.
+ *
+ * @since Apache Jackrabbit 2.3
+ */
+public class SimpleValueFactory extends AbstractValueFactory {
+
+    @Override
+    protected void checkPathFormat(String pathValue)
+            throws ValueFormatException {
+    }
+
+    @Override
+    protected void checkNameFormat(String nameValue)
+            throws ValueFormatException {
+    }
+
+}

Copied: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/query/qom/OperandEvaluator.java (from r1080186, jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/OperandEvaluator.java)
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/query/qom/OperandEvaluator.java?p2=jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/query/qom/OperandEvaluator.java&p1=jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/OperandEvaluator.java&r1=1080186&r2=1080235&rev=1080235&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/join/OperandEvaluator.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/query/qom/OperandEvaluator.java Thu Mar 10 14:39:37 2011
@@ -14,11 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.core.query.lucene.join;
-
-import static java.util.Locale.ENGLISH;
-import static javax.jcr.PropertyType.NAME;
+package org.apache.jackrabbit.commons.query.qom;
 
+import java.util.Locale;
 import java.util.Map;
 
 import javax.jcr.Node;
@@ -55,20 +53,53 @@ public class OperandEvaluator {
     /** Bind variables */
     private final Map<String, Value> variables;
 
+    /** The locale to use in upper- and lower-case conversion. */
+    private final Locale locale;
+
     /**
      * Creates an operand evaluator for the given value factory and set of
-     * bind variables.
+     * bind variables. Upper- and lower-case conversions are performed using
+     * the given locale.
      *
      * @param factory value factory
      * @param variables bind variables
+     * @param locale locale to use in upper- and lower-case conversions
      */
     public OperandEvaluator(
-            ValueFactory factory, Map<String, Value> variables) {
+            ValueFactory factory, Map<String, Value> variables, Locale locale) {
         this.factory = factory;
         this.variables = variables;
+        this.locale = locale;
     }
 
-    public Value getValue(StaticOperand operand, int type) throws RepositoryException {
+    /**
+     * Creates an operand evaluator for the given value factory and set of
+     * bind variables. Upper- and lower-case conversions are performed using
+     * the {@link Locale#ENGLISH}.
+     *
+     * @param factory value factory
+     * @param variables bind variables
+     * @param locale locale to use in upper- and lower-case conversions
+     */
+    public OperandEvaluator(
+            ValueFactory factory, Map<String, Value> variables) {
+        this(factory, variables, Locale.ENGLISH);
+    }
+
+    /**
+     * Returns the value of the given static operand
+     * ({@link Literal literal} or {@link BindVariableValue bind variable})
+     * casted to the given type.
+     *
+     * @param operand static operand to be evaluated
+     * @param type expected value type
+     * @return evaluated value, casted to the given type
+     * @throws RepositoryException if a named bind variable is not found,
+     *                             if the operand type is unknown, or
+     *                             if the type conversion fails
+     */
+    public Value getValue(StaticOperand operand, int type)
+            throws RepositoryException {
         Value value = getValue(operand);
         if (type == PropertyType.UNDEFINED || type == value.getType()) {
             return value;
@@ -120,7 +151,7 @@ public class OperandEvaluator {
      * @param operand operand to be evaluated
      * @param row query result row
      * @return evaluated value
-     * @throws RepositoryException
+     * @throws RepositoryException if the operand can't be evaluated
      */
     public Value getValue(Operand operand, Row row) throws RepositoryException {
         Value[] values = getValues(operand, row);
@@ -157,8 +188,10 @@ public class OperandEvaluator {
             return new Value[] { factory.createValue(score) };
         } else if (operand instanceof NodeName) {
             NodeName nn = (NodeName) operand;
-            Node node = row.getNode(nn.getSelectorName());
-            return new Value[] { factory.createValue(node.getName(), NAME) };
+            Value value = factory.createValue(
+                    row.getNode(nn.getSelectorName()).getName(),
+                    PropertyType.NAME);
+            return new Value[] { value };
         } else if (operand instanceof Length) {
             return getLengthValues((Length) operand, row);
         } else if (operand instanceof LowerCase) {
@@ -215,7 +248,7 @@ public class OperandEvaluator {
         Value[] values = getValues(operand.getOperand(), row);
         for (int i = 0; i < values.length; i++) {
             String value = values[i].getString();
-            String lower = value.toLowerCase(ENGLISH);
+            String lower = value.toLowerCase(locale);
             if (!value.equals(lower)) {
                 values[i] = factory.createValue(lower);
             }
@@ -236,7 +269,7 @@ public class OperandEvaluator {
         Value[] values = getValues(operand.getOperand(), row);
         for (int i = 0; i < values.length; i++) {
             String value = values[i].getString();
-            String upper = value.toUpperCase(ENGLISH);
+            String upper = value.toUpperCase(locale);
             if (!value.equals(upper)) {
                 values[i] = factory.createValue(upper);
             }
@@ -259,7 +292,7 @@ public class OperandEvaluator {
         if (colon != -1) {
             name = name.substring(colon + 1);
         }
-        return new Value[] { factory.createValue(name, NAME) };
+        return new Value[] { factory.createValue(name, PropertyType.NAME) };
     }
 
     /**