You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2012/10/11 16:58:30 UTC

svn commit: r1397098 [2/2] - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/identifier/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ oak...

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java Thu Oct 11 14:58:28 2012
@@ -19,23 +19,25 @@
 package org.apache.jackrabbit.oak.query.ast;
 
 import java.util.Locale;
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.query.SQL2Parser;
 
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.query.SQL2Parser;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+
 /**
  * A literal of a certain data type, possibly "cast(..)" of a literal.
  */
 public class LiteralImpl extends StaticOperandImpl {
 
-    private final CoreValue value;
+    private final PropertyValue value;
 
-    public LiteralImpl(CoreValue value) {
+    public LiteralImpl(PropertyValue value) {
         this.value = value;
     }
 
-    public CoreValue getLiteralValue() {
+    public PropertyValue getLiteralValue() {
         return value;
     }
 
@@ -46,16 +48,16 @@ public class LiteralImpl extends StaticO
 
     @Override
     public String toString() {
-        String type = PropertyType.nameFromValue(value.getType());
+        String type = PropertyType.nameFromValue(value.getType().tag());
         return "cast(" + escape() + " as " + type.toLowerCase(Locale.ENGLISH) + ')';
     }
 
     private String escape() {
-        return SQL2Parser.escapeStringLiteral(value.getString());
+        return SQL2Parser.escapeStringLiteral(value.getValue(Type.STRING));
     }
 
     @Override
-    CoreValue currentValue() {
+    PropertyValue currentValue() {
         return value;
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LowerCaseImpl.java Thu Oct 11 14:58:28 2012
@@ -18,12 +18,12 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
+import static org.apache.jackrabbit.oak.api.Type.STRING;
+
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
-
-import static org.apache.jackrabbit.oak.api.Type.STRING;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 
 /**
  * The function "lower(..)".
@@ -51,7 +51,7 @@ public class LowerCaseImpl extends Dynam
     }
 
     @Override
-    public PropertyState currentProperty() {
+    public PropertyValue currentProperty() {
         PropertyState p = operand.currentProperty();
         if (p == null) {
             return null;
@@ -59,13 +59,13 @@ public class LowerCaseImpl extends Dynam
         // TODO what is the expected result of LOWER(x) for an array property?
         // currently throws an exception
         String value = p.getValue(STRING);
-        return PropertyStates.stringProperty(p.getName(), value.toLowerCase());
+        return PropertyValues.newString(value.toLowerCase());
     }
 
     @Override
-    public void restrict(FilterImpl f, Operator operator, CoreValue v) {
+    public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
         // LOWER(x) implies x is not null
-        operand.restrict(f, Operator.NOT_EQUAL, null);        
+        operand.restrict(f, Operator.NOT_EQUAL, null);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java Thu Oct 11 14:58:28 2012
@@ -18,11 +18,10 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.util.ISO9075;
 
 /**
@@ -52,18 +51,18 @@ public class NodeLocalNameImpl extends D
     }
 
     @Override
-    public PropertyState currentProperty() {
+    public PropertyValue currentProperty() {
         String name = PathUtils.getName(selector.currentPath());
         // Name escaping (convert space to _x0020_)
         name = ISO9075.encode(name);
         int colon = name.indexOf(':');
         // TODO LOCALNAME: evaluation of local name might not be correct
         String localName = colon < 0 ? name : name.substring(colon + 1);
-        return PropertyStates.stringProperty("LOCALNAME", localName);
+        return PropertyValues.newString(localName);
     }
 
     @Override
-    public void restrict(FilterImpl f, Operator operator, CoreValue v) {
+    public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
         // TODO support LOCALNAME index conditions
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java Thu Oct 11 14:58:28 2012
@@ -20,11 +20,11 @@ package org.apache.jackrabbit.oak.query.
 
 import javax.jcr.PropertyType;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.util.ISO9075;
 
 /**
@@ -59,22 +59,22 @@ public class NodeNameImpl extends Dynami
     }
 
     @Override
-    public PropertyState currentProperty() {
+    public PropertyValue currentProperty() {
         String path = selector.currentPath();
         // Name escaping (convert space to _x0020_)
         String name = ISO9075.encode(PathUtils.getName(path));
-        return PropertyStates.nameProperty("NAME", name);
+        return PropertyValues.newName(name);
     }
 
     @Override
-    public void restrict(FilterImpl f, Operator operator, CoreValue v) {
+    public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
         if (v == null) {
             return;
         }
         if (!isName(v)) {
             throw new IllegalArgumentException("Invalid name value: " + v.toString());
         }
-        String path = v.getString();
+        String path = v.getValue(Type.STRING);
         // Name escaping (convert _x0020_ to space)
         path = decodeName(path);
         if (PathUtils.isAbsolute(path)) {
@@ -95,7 +95,7 @@ public class NodeNameImpl extends Dynami
         // Name escaping (convert _x0020_ to space)
         path = ISO9075.decode(path);
         // normalize paths (./name > name)
-        path = query.getOakPath(path);
+        path = PropertyValues.getOakPath(path, query.getNamePathMapper());
         return path;
     }
 
@@ -105,9 +105,9 @@ public class NodeNameImpl extends Dynami
      * @param v the value
      * @return true if it can be converted
      */
-    private static boolean isName(CoreValue v) {
+    private static boolean isName(PropertyValue v) {
         // TODO correctly validate JCR names - see JCR 2.0 spec 3.2.4 Naming Restrictions
-        switch (v.getType()) {
+        switch (v.getType().tag()) {
         case PropertyType.DATE:
         case PropertyType.DECIMAL:
         case PropertyType.DOUBLE:
@@ -115,7 +115,7 @@ public class NodeNameImpl extends Dynami
         case PropertyType.BOOLEAN:
             return false;
         }
-        String n = v.getString();
+        String n = v.getValue(Type.STRING);
         if (n.startsWith("[") && !n.endsWith("]")) {
             return false;
         }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java Thu Oct 11 14:58:28 2012
@@ -18,8 +18,6 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 
 /**
@@ -38,8 +36,7 @@ public class PropertyExistenceImpl exten
 
     @Override
     public boolean evaluate() {
-        PropertyState p = selector.currentProperty(propertyName);
-        return p != null;
+        return selector.currentProperty(propertyName) != null;
     }
 
     @Override
@@ -59,7 +56,7 @@ public class PropertyExistenceImpl exten
     @Override
     public void restrict(FilterImpl f) {
         if (f.getSelector() == selector) {
-            f.restrictProperty(propertyName, Operator.NOT_EQUAL, (CoreValue) null);
+            f.restrictProperty(propertyName, Operator.NOT_EQUAL, null);
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java Thu Oct 11 14:58:28 2012
@@ -24,15 +24,16 @@ import java.util.Locale;
 
 import javax.jcr.PropertyType;
 
-import com.google.common.collect.Iterables;
-import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.query.SQL2Parser;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
+
+import com.google.common.collect.Iterables;
 
 /**
  * A property expression.
@@ -81,11 +82,11 @@ public class PropertyValueImpl extends D
     }
 
     @Override
-    public PropertyState currentProperty() {
+    public PropertyValue currentProperty() {
         boolean relative = propertyName.indexOf('/') >= 0;
         boolean asterisk = propertyName.equals("*");
         if (!relative && !asterisk) {
-            PropertyState p = selector.currentProperty(propertyName);
+            PropertyValue p = selector.currentProperty(propertyName);
             return matchesPropertyType(p) ? p : null;
         }
         Tree tree = getTree(selector.currentPath());
@@ -112,7 +113,7 @@ public class PropertyValueImpl extends D
                 return null;
             }
             PropertyState p = tree.getProperty(name);
-            return matchesPropertyType(p) ? p : null;
+            return matchesPropertyType(p) ? PropertyValues.create(p) : null;
         }
         // asterisk - create a multi-value property
         // warning: the returned property state may have a mixed type
@@ -125,7 +126,8 @@ public class PropertyValueImpl extends D
                 Iterables.addAll(values, p.getValue(Type.STRINGS));
             }
         }
-        return PropertyStates.stringProperty("*", values);
+        // "*"
+        return PropertyValues.newString(values);
     }
 
     private boolean matchesPropertyType(PropertyState state) {
@@ -143,7 +145,7 @@ public class PropertyValueImpl extends D
     }
 
     @Override
-    public void restrict(FilterImpl f, Operator operator, CoreValue v) {
+    public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
         if (f.getSelector() == selector) {
             if (operator == Operator.NOT_EQUAL && v != null) {
                 // not supported

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java Thu Oct 11 14:58:28 2012
@@ -18,6 +18,8 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
+import static org.apache.jackrabbit.oak.api.Type.STRINGS;
+
 import java.util.Set;
 
 import javax.annotation.CheckForNull;
@@ -26,10 +28,8 @@ import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.NodeTypeIterator;
 import javax.jcr.nodetype.NodeTypeManager;
 
-import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.query.Query;
@@ -37,10 +37,12 @@ import org.apache.jackrabbit.oak.query.i
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Filter;
 import org.apache.jackrabbit.oak.spi.query.IndexRow;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
-import static org.apache.jackrabbit.oak.api.Type.STRINGS;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * A selector within a query.
@@ -216,7 +218,7 @@ public class SelectorImpl extends Source
         return cursor == null ? null : cursor.currentRow().getPath();
     }
 
-    public PropertyState currentProperty(String propertyName) {
+    public PropertyValue currentProperty(String propertyName) {
         if (propertyName.equals(Query.JCR_PATH)) {
             String p = currentPath();
             if (p == null) {
@@ -227,7 +229,7 @@ public class SelectorImpl extends Source
                 // not a local path
                 return null;
             }
-            return PropertyStates.stringProperty(Query.JCR_PATH, local);
+            return PropertyValues.newString(local);
         }
         if (cursor == null) {
             return null;
@@ -243,7 +245,7 @@ public class SelectorImpl extends Source
             return null;
         }
         Tree t = getTree(path);
-        return t == null ? null : t.getProperty(propertyName);
+        return t == null ? null : PropertyValues.create(t.getProperty(propertyName));
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/StaticOperandImpl.java Thu Oct 11 14:58:28 2012
@@ -18,13 +18,13 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
 
 /**
  * The base class for static operands (literal, bind variables).
  */
 public abstract class StaticOperandImpl extends AstElement {
 
-    abstract CoreValue currentValue();
+    abstract PropertyValue currentValue();
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/UpperCaseImpl.java Thu Oct 11 14:58:28 2012
@@ -18,12 +18,12 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
+import static org.apache.jackrabbit.oak.api.Type.STRING;
+
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
-
-import static org.apache.jackrabbit.oak.api.Type.STRING;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 
 /**
  * The function "upper(..)".
@@ -51,7 +51,7 @@ public class UpperCaseImpl extends Dynam
     }
 
     @Override
-    public PropertyState currentProperty() {
+    public PropertyValue currentProperty() {
         PropertyState p = operand.currentProperty();
         if (p == null) {
             return null;
@@ -59,11 +59,11 @@ public class UpperCaseImpl extends Dynam
         // TODO what is the expected result of UPPER(x) for an array property?
         // currently throws an exception
         String value = p.getValue(STRING);
-        return PropertyStates.stringProperty(p.getName(), value.toUpperCase());
+        return PropertyValues.newString(value.toUpperCase());
     }
 
     @Override
-    public void restrict(FilterImpl f, Operator operator, CoreValue v) {
+    public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
         // UPPER(x) implies x is not null
         operand.restrict(f, Operator.NOT_EQUAL, null);
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java Thu Oct 11 14:58:28 2012
@@ -18,19 +18,20 @@
  */
 package org.apache.jackrabbit.oak.query.index;
 
-import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.query.ast.Operator;
-import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
-import org.apache.jackrabbit.oak.spi.query.Filter;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map.Entry;
+
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.query.ast.Operator;
+import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
+import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+
 /**
  * A filter or lookup condition.
  */
@@ -182,46 +183,47 @@ public class FilterImpl implements Filte
         x.propertyType = propertyType;
     }
 
-    public void restrictProperty(String propertyName, Operator op, CoreValue value) {
+    public void restrictProperty(String propertyName, Operator op, PropertyValue v) {
         PropertyRestriction x = propertyRestrictions.get(propertyName);
         if (x == null) {
             x = new PropertyRestriction();
             x.propertyName = propertyName;
             propertyRestrictions.put(propertyName, x);
         }
-        CoreValue oldFirst = x.first, oldLast = x.last;
+        PropertyValue oldFirst = x.first;
+        PropertyValue oldLast = x.last;
         switch (op) {
         case EQUAL:
-            x.first = maxValue(oldFirst, value);
+            x.first = maxValue(oldFirst, v);
             x.firstIncluding = x.first == oldFirst ? x.firstIncluding : true;
-            x.last = minValue(oldLast, value);
+            x.last = minValue(oldLast, v);
             x.lastIncluding = x.last == oldLast ? x.lastIncluding : true;
             break;
         case NOT_EQUAL:
-            if (value != null) {
+            if (v != null) {
                 throw new IllegalArgumentException("NOT_EQUAL only supported for NOT_EQUAL NULL");
             }
             break;
         case GREATER_THAN:
-            x.first = maxValue(oldFirst, value);
+            x.first = maxValue(oldFirst, v);
             x.firstIncluding = false;
             break;
         case GREATER_OR_EQUAL:
-            x.first = maxValue(oldFirst, value);
+            x.first = maxValue(oldFirst, v);
             x.firstIncluding = x.first == oldFirst ? x.firstIncluding : true;
             break;
         case LESS_THAN:
-            x.last = minValue(oldLast, value);
+            x.last = minValue(oldLast, v);
             x.lastIncluding = false;
             break;
         case LESS_OR_EQUAL:
-            x.last = minValue(oldLast, value);
+            x.last = minValue(oldLast, v);
             x.lastIncluding = x.last == oldLast ? x.lastIncluding : true;
             break;
         case LIKE:
             // LIKE is handled in the fulltext index
             x.isLike = true;
-            x.first = value;
+            x.first = v;
             break;
         }
         if (x.first != null && x.last != null) {
@@ -233,18 +235,18 @@ public class FilterImpl implements Filte
         }
     }
 
-    static CoreValue maxValue(CoreValue a, CoreValue b) {
+    static PropertyValue maxValue(PropertyValue a, PropertyValue b) {
         if (a == null) {
             return b;
         }
         return a.compareTo(b) < 0 ? b : a;
     }
 
-    static CoreValue minValue(CoreValue a, CoreValue b) {
+    static PropertyValue minValue(PropertyValue a, PropertyValue b) {
         if (a == null) {
             return b;
         }
-        return a.compareTo(b) < 0 ? a : b;
+        return a.compareTo(b) <= 0 ? a : b;
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/IndexRowImpl.java Thu Oct 11 14:58:28 2012
@@ -18,8 +18,8 @@
  */
 package org.apache.jackrabbit.oak.query.index;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.spi.query.IndexRow;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
 
 /**
  * A simple index row implementation.
@@ -38,7 +38,7 @@ public class IndexRowImpl implements Ind
     }
 
     @Override
-    public CoreValue getValue(String columnName) {
+    public PropertyValue getValue(String columnName) {
         return null;
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProviderImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProviderImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProviderImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/MembershipProviderImpl.java Thu Oct 11 14:58:28 2012
@@ -36,6 +36,8 @@ import org.apache.jackrabbit.oak.api.Roo
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.memory.CoreValues;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryPropertyBuilder;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.security.user.AuthorizableType;
 import org.apache.jackrabbit.oak.spi.security.user.MembershipProvider;
 import org.apache.jackrabbit.oak.spi.security.user.UserConfig;
@@ -151,7 +153,7 @@ public class MembershipProviderImpl exte
                 memberPaths = Iterables.transform(vs, new Function<CoreValue,String>() {
                     @Override
                     public String apply(@Nullable CoreValue value) {
-                        return identifierManager.getPath(value);
+                        return identifierManager.getPath(PropertyStates.createProperty("", value.getString(), value.getType()));
                     }
                 });
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java Thu Oct 11 14:58:28 2012
@@ -30,7 +30,6 @@ import javax.jcr.query.Query;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.user.Impersonation;
-import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.ResultRow;
@@ -38,6 +37,7 @@ import org.apache.jackrabbit.oak.api.Roo
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider;
 import org.apache.jackrabbit.oak.spi.security.principal.TreeBasedPrincipal;
 import org.apache.jackrabbit.oak.spi.security.user.AuthorizableType;
@@ -206,14 +206,13 @@ class UserProviderImpl extends Authoriza
         // can be omitted as principals names are stored in user defined
         // index as well.
         try {
-            CoreValue bindValue = valueFactory.createValue(principal.getName());
             StringBuilder stmt = new StringBuilder();
             stmt.append("SELECT * FROM [").append(UserConstants.NT_REP_AUTHORIZABLE).append(']');
             stmt.append("WHERE [").append(UserConstants.REP_PRINCIPAL_NAME).append("] = $principalName");
 
             Result result = root.getQueryEngine().executeQuery(stmt.toString(),
                     Query.JCR_SQL2, 1, 0,
-                    Collections.singletonMap("principalName", bindValue),
+                    Collections.singletonMap("principalName", PropertyValues.newString(principal.getName())),
                     root, new NamePathMapper.Default());
 
             Iterator<? extends ResultRow> rows = result.getRows().iterator();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java Thu Oct 11 14:58:28 2012
@@ -21,8 +21,6 @@ package org.apache.jackrabbit.oak.spi.qu
 import java.util.Collection;
 import javax.jcr.PropertyType;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
-
 /**
  * The filter for an index lookup.
  */
@@ -79,7 +77,7 @@ public interface Filter {
         /**
          * The first value to read, or null to read from the beginning.
          */
-        public CoreValue first;
+        public PropertyValue first;
 
         /**
          * Whether values that match the first should be returned.
@@ -89,7 +87,7 @@ public interface Filter {
         /**
          * The last value to read, or null to read until the end.
          */
-        public CoreValue last;
+        public PropertyValue last;
 
         /**
          * Whether values that match the last should be returned.

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/IndexRow.java Thu Oct 11 14:58:28 2012
@@ -18,7 +18,6 @@
  */
 package org.apache.jackrabbit.oak.spi.query;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
 
 /**
  * A row returned by the index.
@@ -40,6 +39,6 @@ public interface IndexRow {
      * @param columnName the column name
      * @return the value, or null if not available
      */
-    CoreValue getValue(String columnName);
+    PropertyValue getValue(String columnName);
 
 }

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java?rev=1397098&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java Thu Oct 11 14:58:28 2012
@@ -0,0 +1,173 @@
+/*
+ * 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.oak.spi.query;
+
+import java.util.Calendar;
+import java.util.Iterator;
+
+import javax.jcr.PropertyType;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.util.ISO8601;
+
+public class PropertyValue implements PropertyState, Comparable<PropertyValue> {
+
+    private final PropertyState ps;
+
+    protected PropertyValue(PropertyState ps) {
+        this.ps = ps;
+    }
+
+    public String getName() {
+        return ps.getName();
+    }
+
+    public boolean isArray() {
+        return ps.isArray();
+    }
+
+    public Type<?> getType() {
+        return ps.getType();
+    }
+
+    public <T> T getValue(Type<T> type) {
+        return ps.getValue(type);
+    }
+
+    public <T> T getValue(Type<T> type, int index) {
+        return ps.getValue(type, index);
+    }
+
+    public long size() {
+        return ps.size();
+    }
+
+    public long size(int index) {
+        return ps.size(index);
+    }
+
+    public int count() {
+        return ps.count();
+    }
+
+    public PropertyState unwrap() {
+        return ps;
+    }
+
+    public int compareTo(PropertyValue p2) {
+        if (getType().tag() != p2.getType().tag()) {
+            return Integer.signum(getType().tag() - p2.getType().tag());
+        }
+        switch (getType().tag()) {
+        case PropertyType.BINARY:
+            return compare(getValue(Type.BINARIES), p2.getValue(Type.BINARIES));
+        case PropertyType.DOUBLE:
+            return compare(getValue(Type.DOUBLES), p2.getValue(Type.DOUBLES));
+        case PropertyType.DATE:
+            return compareAsDate(getValue(Type.STRINGS),
+                    p2.getValue(Type.STRINGS));
+        default:
+            return compare(getValue(Type.STRINGS), p2.getValue(Type.STRINGS));
+        }
+    }
+
+    private static <T extends Comparable<T>> int compare(Iterable<T> p1,
+            Iterable<T> p2) {
+        Iterator<T> i1 = p1.iterator();
+        Iterator<T> i2 = p2.iterator();
+        while (i1.hasNext() || i2.hasNext()) {
+            if (!i1.hasNext()) {
+                return 1;
+            }
+            if (!i2.hasNext()) {
+                return -1;
+            }
+            int compare = i1.next().compareTo(i2.next());
+            if (compare != 0) {
+                return compare;
+            }
+        }
+        return 0;
+    }
+
+    private static int compareAsDate(Iterable<String> p1, Iterable<String> p2) {
+        Iterator<String> i1 = p1.iterator();
+        Iterator<String> i2 = p2.iterator();
+        while (i1.hasNext() || i2.hasNext()) {
+            if (!i1.hasNext()) {
+                return 1;
+            }
+            if (!i2.hasNext()) {
+                return -1;
+            }
+            String v1 = i1.next();
+            String v2 = i2.next();
+
+            Calendar c1 = ISO8601.parse(v1);
+            Calendar c2 = ISO8601.parse(v2);
+            int compare = -1;
+            if (c1 != null && c2 != null) {
+                compare = c1.compareTo(c2);
+            } else {
+                compare = v1.compareTo(v2);
+            }
+            if (compare != 0) {
+                return compare;
+            }
+        }
+        return 0;
+    }
+
+    // --------------------------------------------------------------< Object >
+
+    private String getInternalString() {
+        StringBuilder sb = new StringBuilder();
+        Iterator<String> iterator = getValue(Type.STRINGS).iterator();
+        while (iterator.hasNext()) {
+            sb.append(iterator.next());
+            if (iterator.hasNext()) {
+                sb.append(",");
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return getType().tag() ^ getInternalString().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        } else if (o instanceof PropertyValue) {
+            return compareTo((PropertyValue) o) == 0;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return getInternalString();
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValue.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java?rev=1397098&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java Thu Oct 11 14:58:28 2012
@@ -0,0 +1,246 @@
+/*
+ * 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.oak.spi.query;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Iterator;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.jcr.PropertyType;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+
+public class PropertyValues {
+
+    private PropertyValues() {
+    }
+
+    // TODO consistent naming
+
+    @CheckForNull
+    public static PropertyValue create(PropertyState property) {
+        if (property == null) {
+            return null;
+        }
+        return new PropertyValue(property);
+    }
+
+    @Nonnull
+    public static PropertyValue newString(String value) {
+        return new PropertyValue(PropertyStates.stringProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newString(Iterable<String> value) {
+        return new PropertyValue(PropertyStates.stringProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newLong(Long value) {
+        return new PropertyValue(PropertyStates.longProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newDouble(Double value) {
+        return new PropertyValue(PropertyStates.doubleProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newDecimal(BigDecimal value) {
+        return new PropertyValue(PropertyStates.decimalProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newBoolean(boolean value) {
+        return new PropertyValue(PropertyStates.booleanProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newDate(String value) {
+        return new PropertyValue(PropertyStates.dateProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newName(String value) {
+        return new PropertyValue(PropertyStates.nameProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newPath(String value) {
+        return new PropertyValue(PropertyStates.pathProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newReference(String value) {
+        return new PropertyValue(PropertyStates.referenceProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newWeakReference(String value) {
+        return new PropertyValue(
+                PropertyStates.weakreferenceProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newUri(String value) {
+        return new PropertyValue(PropertyStates.uriProperty("", value));
+    }
+
+    @Nonnull
+    public static PropertyValue newBinary(byte[] value) {
+        return new PropertyValue(PropertyStates.binaryProperty("", value));
+    }
+
+    // --
+
+    public static boolean match(PropertyValue p1, PropertyState p2) {
+        return match(p1, create(p2));
+    }
+
+    public static boolean match(PropertyState p1, PropertyValue p2) {
+        return match(create(p1), p2);
+    }
+
+    public static boolean match(PropertyValue p1, PropertyValue p2) {
+        if (p1.getType().tag() != p2.getType().tag()) {
+            return false;
+        }
+
+        switch (p1.getType().tag()) {
+        case PropertyType.BINARY:
+            if (p1.isArray() && !p2.isArray()) {
+                return contains(p1.getValue(Type.BINARIES),
+                        p2.getValue(Type.BINARY));
+            }
+            if (!p1.isArray() && p2.isArray()) {
+                return contains(p2.getValue(Type.BINARIES),
+                        p2.getValue(Type.BINARY));
+            }
+        default:
+            if (p1.isArray() && !p2.isArray()) {
+                return contains(p1.getValue(Type.STRINGS),
+                        p2.getValue(Type.STRING));
+            }
+            if (!p1.isArray() && p2.isArray()) {
+                return contains(p2.getValue(Type.STRINGS),
+                        p2.getValue(Type.STRING));
+            }
+        }
+        // both arrays or both single values
+        return p1.compareTo(p2) == 0;
+
+    }
+
+    private static <T extends Comparable<T>> boolean contains(Iterable<T> p1,
+            T p2) {
+        Iterator<T> i1 = p1.iterator();
+        while (i1.hasNext()) {
+            int compare = i1.next().compareTo(p2);
+            if (compare == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // --
+    /**
+     * Convert a value to the given target type, if possible.
+     * 
+     * @param v
+     *            the value to convert
+     * @param targetType
+     *            the target property type
+     * @return the converted value, or null if converting is not possible
+     */
+    public static PropertyValue convert(PropertyState value, int targetType,
+            NamePathMapper mapper) {
+        // TODO support full set of conversion features defined in the JCR spec
+        // at 3.6.4 Property Type Conversion
+        // re-use existing code if possible
+        try {
+            switch (targetType) {
+            case PropertyType.STRING:
+                return newString(value.getValue(Type.STRING));
+            case PropertyType.DATE:
+                return newDate(value.getValue(Type.STRING));
+            case PropertyType.LONG:
+                return newLong(value.getValue(Type.LONG));
+            case PropertyType.DOUBLE:
+                return newDouble(value.getValue(Type.DOUBLE));
+            case PropertyType.DECIMAL:
+                return newDecimal(value.getValue(Type.DECIMAL));
+            case PropertyType.BOOLEAN:
+                return newBoolean(value.getValue(Type.BOOLEAN));
+            case PropertyType.NAME:
+                return newName(getOakPath(value.getValue(Type.STRING), mapper));
+            case PropertyType.PATH:
+                return newPath(value.getValue(Type.STRING));
+            case PropertyType.REFERENCE:
+                return newReference(value.getValue(Type.STRING));
+            case PropertyType.WEAKREFERENCE:
+                return newWeakReference(value.getValue(Type.STRING));
+            case PropertyType.URI:
+                return newUri(value.getValue(Type.STRING));
+            case PropertyType.BINARY:
+                try {
+                    byte[] data = value.getValue(Type.STRING).getBytes("UTF-8");
+                    return newBinary(data);
+                } catch (IOException e) {
+                    // I don't know in what case that could really occur
+                    // except if UTF-8 isn't supported
+                    throw new IllegalArgumentException(
+                            value.getValue(Type.STRING), e);
+                }
+            }
+            return null;
+            // throw new IllegalArgumentException("Unknown property type: " +
+            // targetType);
+        } catch (UnsupportedOperationException e) {
+            // TODO detect unsupported conversions, so that no exception is
+            // thrown
+            // because exceptions are slow
+            return null;
+            // throw new IllegalArgumentException("<unsupported conversion of "
+            // +
+            // v + " (" + PropertyType.nameFromValue(v.getType()) + ") to type "
+            // +
+            // PropertyType.nameFromValue(targetType) + ">");
+        }
+    }
+
+    public static String getOakPath(String jcrPath, NamePathMapper mapper) {
+        if (mapper == null) {
+            // to simplify testing, a getNamePathMapper isn't required
+            return jcrPath;
+        }
+        String p = mapper.getOakPath(jcrPath);
+        if (p == null) {
+            throw new IllegalArgumentException("Not a valid JCR path: "
+                    + jcrPath);
+        }
+        return p;
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/PropertyValues.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Thu Oct 11 14:58:28 2012
@@ -16,6 +16,10 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.lucene;
 
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
 import javax.security.auth.Subject;
 
 import org.apache.jackrabbit.mk.core.MicroKernelImpl;
@@ -25,20 +29,16 @@ import org.apache.jackrabbit.oak.core.Ro
 import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
 import org.apache.jackrabbit.oak.plugins.index.IndexDefinition;
 import org.apache.jackrabbit.oak.plugins.index.IndexDefinitionImpl;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryValueFactory;
 import org.apache.jackrabbit.oak.query.ast.Operator;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.security.authorization.AccessControlProviderImpl;
 import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.query.Cursor;
 import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.query.QueryIndex;
 import org.junit.Test;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
 public class LuceneIndexTest implements LuceneIndexConstants {
 
     @Test
@@ -62,7 +62,7 @@ public class LuceneIndexTest implements 
         FilterImpl filter = new FilterImpl(null);
         filter.restrictPath("/", Filter.PathRestriction.EXACT);
         filter.restrictProperty("foo", Operator.EQUAL,
-                MemoryValueFactory.INSTANCE.createValue("bar"));
+                PropertyValues.newString("bar"));
         Cursor cursor = index.query(filter, store.getRoot());
         assertTrue(cursor.next());
         assertEquals("/", cursor.currentRow().getPath());

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/AbstractQueryTest.java Thu Oct 11 14:58:28 2012
@@ -33,19 +33,22 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.AbstractOakTest;
 import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.ResultRow;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.SessionQueryEngine;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -107,7 +110,7 @@ public abstract class AbstractQueryTest 
     }
 
     protected Result executeQuery(String statement, String language,
-            HashMap<String, CoreValue> sv) throws ParseException {
+            Map<String, PropertyValue> sv) throws ParseException {
         return qe.executeQuery(statement, language, Long.MAX_VALUE, 0, sv,
                 session.getLatestRoot(), null);
     }
@@ -141,15 +144,15 @@ public abstract class AbstractQueryTest 
                 vf);
         root.commit();
 
-        HashMap<String, CoreValue> sv = new HashMap<String, CoreValue>();
-        sv.put("id", vf.createValue("1"));
+        Map<String, PropertyValue> sv = new HashMap<String, PropertyValue>();
+        sv.put("id", PropertyValues.newString("1"));
         Iterator<? extends ResultRow> result;
         result = executeQuery("select * from [nt:base] where id = $id",
                 QueryEngineImpl.SQL2, sv).getRows().iterator();
         assertTrue(result.hasNext());
         assertEquals("/test/hello", result.next().getPath());
 
-        sv.put("id", vf.createValue("2"));
+        sv.put("id", PropertyValues.newString("2"));
         result = executeQuery("select * from [nt:base] where id = $id",
                 QueryEngineImpl.SQL2, sv).getRows().iterator();
         assertTrue(result.hasNext());
@@ -288,13 +291,13 @@ public abstract class AbstractQueryTest 
 
     protected static String readRow(ResultRow row) {
         StringBuilder buff = new StringBuilder();
-        CoreValue[] values = row.getValues();
+        PropertyValue[] values = row.getValues();
         for (int i = 0; i < values.length; i++) {
             if (i > 0) {
                 buff.append(", ");
             }
-            CoreValue v = values[i];
-            buff.append(v == null ? "null" : v.getString());
+            PropertyValue v = values[i];
+            buff.append(v == null ? "null" : v.getValue(Type.STRING));
         }
         return buff.toString();
     }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/FilterTest.java Thu Oct 11 14:58:28 2012
@@ -25,10 +25,10 @@ import static org.junit.Assert.fail;
 import java.util.ArrayList;
 import java.util.Random;
 
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.plugins.memory.StringValue;
 import org.apache.jackrabbit.oak.query.ast.Operator;
 import org.apache.jackrabbit.oak.spi.query.Filter;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.junit.Test;
 
 /**
@@ -39,8 +39,8 @@ public class FilterTest {
     @Test
     public void propertyRestriction() {
 
-        CoreValue one = new StringValue("1");
-        CoreValue two = new StringValue("2");
+        PropertyValue one = PropertyValues.newString("1");
+        PropertyValue two = PropertyValues.newString("2");
 
         FilterImpl f = new FilterImpl(null);
         assertTrue(null == f.getPropertyRestriction("x"));
@@ -104,8 +104,10 @@ public class FilterTest {
         for (int i = 0; i < 10000; i++) {
             String p1 = paths.get(r.nextInt(paths.size()));
             String p2 = paths.get(r.nextInt(paths.size()));
-            Filter.PathRestriction r1 = Filter.PathRestriction.values()[r.nextInt(Filter.PathRestriction.values().length)];
-            Filter.PathRestriction r2 = Filter.PathRestriction.values()[r.nextInt(Filter.PathRestriction.values().length)];
+            Filter.PathRestriction r1 = Filter.PathRestriction.values()[r
+                    .nextInt(Filter.PathRestriction.values().length)];
+            Filter.PathRestriction r2 = Filter.PathRestriction.values()[r
+                    .nextInt(Filter.PathRestriction.values().length)];
             FilterImpl f1 = new FilterImpl(null);
             f1.restrictPath(p1, r1);
             FilterImpl f2 = new FilterImpl(null);
@@ -123,14 +125,16 @@ public class FilterTest {
                     fc = new FilterImpl(null);
                     fc.restrictPath(p1, r1);
                     fc.restrictPath(p2, r2);
-                    fail("not matched: " + p1 + "/" + r1.name() + " && " + p2 + "/" + r2.name());
+                    fail("not matched: " + p1 + "/" + r1.name() + " && " + p2
+                            + "/" + r2.name());
                 } else {
                     // not great, but not a problem
                     tooMany++;
                 }
             }
             if (tooMany > 3) {
-                fail("too many matches: " + p1 + "/" + r1.name() + " && " + p2 + "/" + r2.name() + " superfluous: " + tooMany);
+                fail("too many matches: " + p1 + "/" + r1.name() + " && " + p2
+                        + "/" + r2.name() + " superfluous: " + tooMany);
             }
         }
     }
@@ -139,7 +143,8 @@ public class FilterTest {
     public void pathRestrictions() throws Exception {
         FilterImpl f = new FilterImpl(null);
         assertEquals("/", f.getPath());
-        assertEquals(Filter.PathRestriction.ALL_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.ALL_CHILDREN,
+                f.getPathRestriction());
 
         f.restrictPath("/test", Filter.PathRestriction.ALL_CHILDREN);
         f.restrictPath("/test2", Filter.PathRestriction.ALL_CHILDREN);
@@ -148,10 +153,12 @@ public class FilterTest {
         f = new FilterImpl(null);
         f.restrictPath("/test", Filter.PathRestriction.ALL_CHILDREN);
         assertEquals("/test", f.getPath());
-        assertEquals(Filter.PathRestriction.ALL_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.ALL_CHILDREN,
+                f.getPathRestriction());
         f.restrictPath("/test/x", Filter.PathRestriction.DIRECT_CHILDREN);
         assertEquals("/test/x", f.getPath());
-        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN,
+                f.getPathRestriction());
         f.restrictPath("/test/x/y", Filter.PathRestriction.PARENT);
         assertEquals("/test/x/y", f.getPath());
         assertEquals(Filter.PathRestriction.PARENT, f.getPathRestriction());
@@ -212,13 +219,16 @@ public class FilterTest {
         f = new FilterImpl(null);
         f.restrictPath("/test", Filter.PathRestriction.DIRECT_CHILDREN);
         assertEquals("/test", f.getPath());
-        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN,
+                f.getPathRestriction());
         f.restrictPath("/", Filter.PathRestriction.ALL_CHILDREN);
         assertEquals("/test", f.getPath());
-        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN,
+                f.getPathRestriction());
         f.restrictPath("/test", Filter.PathRestriction.ALL_CHILDREN);
         assertEquals("/test", f.getPath());
-        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN, f.getPathRestriction());
+        assertEquals(Filter.PathRestriction.DIRECT_CHILDREN,
+                f.getPathRestriction());
         f.restrictPath("/test/x/y", Filter.PathRestriction.PARENT);
         assertEquals("/test/x/y", f.getPath());
         assertEquals(Filter.PathRestriction.PARENT, f.getPathRestriction());

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryManagerImpl.java Thu Oct 11 14:58:28 2012
@@ -23,7 +23,9 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
@@ -33,12 +35,15 @@ import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.qom.QueryObjectModelFactory;
-import org.apache.jackrabbit.oak.api.CoreValue;
-import org.apache.jackrabbit.oak.api.SessionQueryEngine;
+
 import org.apache.jackrabbit.oak.api.Result;
+import org.apache.jackrabbit.oak.api.SessionQueryEngine;
 import org.apache.jackrabbit.oak.jcr.SessionDelegate;
 import org.apache.jackrabbit.oak.jcr.query.qom.QueryObjectModelFactoryImpl;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 
 /**
  * The implementation of the corresponding JCR interface.
@@ -110,7 +115,7 @@ public class QueryManagerImpl implements
     public QueryResult executeQuery(String statement, String language,
             long limit, long offset, HashMap<String, Value> bindVariableMap) throws RepositoryException {
         try {
-            HashMap<String, CoreValue> bindMap = convertMap(bindVariableMap);
+            Map<String, PropertyValue> bindMap = convertMap(bindVariableMap);
             NamePathMapper namePathMapper = sessionDelegate.getNamePathMapper();
             Result r = queryEngine.executeQuery(statement, language, limit, offset,
                     bindMap, sessionDelegate.getRoot(), namePathMapper);
@@ -122,10 +127,13 @@ public class QueryManagerImpl implements
         }
     }
 
-    private HashMap<String, CoreValue> convertMap(HashMap<String, Value> bindVariableMap) {
-        HashMap<String, CoreValue> map = new HashMap<String, CoreValue>();
+    private Map<String, PropertyValue> convertMap(
+            HashMap<String, Value> bindVariableMap) throws RepositoryException {
+        HashMap<String, PropertyValue> map = new HashMap<String, PropertyValue>();
         for (Entry<String, Value> e : bindVariableMap.entrySet()) {
-            map.put(e.getKey(), sessionDelegate.getValueFactory().getCoreValue(e.getValue()));
+            map.put(e.getKey(),
+                    PropertyValues.create(PropertyStates.createProperty("",
+                            e.getValue())));
         }
         return map;
     }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/QueryResultImpl.java Thu Oct 11 14:58:28 2012
@@ -30,13 +30,14 @@ import javax.jcr.query.RowIterator;
 
 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
 import org.apache.jackrabbit.commons.iterator.RowIteratorAdapter;
-import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.ResultRow;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.jcr.NodeDelegate;
 import org.apache.jackrabbit.oak.jcr.NodeImpl;
 import org.apache.jackrabbit.oak.jcr.SessionDelegate;
+import org.apache.jackrabbit.oak.plugins.memory.CoreValues;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
 
 /**
  * The implementation of the corresponding JCR interface.
@@ -227,8 +228,8 @@ public class QueryResultImpl implements 
         };
     }
 
-    Value createValue(CoreValue value) {
-        return value == null ? null : sessionDelegate.getValueFactory().createValue(value);
+    Value createValue(PropertyValue value) {
+        return value == null ? null : sessionDelegate.getValueFactory().createValue(CoreValues.getValue(value));
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/RowImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/RowImpl.java?rev=1397098&r1=1397097&r2=1397098&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/RowImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/query/RowImpl.java Thu Oct 11 14:58:28 2012
@@ -22,8 +22,9 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.query.Row;
-import org.apache.jackrabbit.oak.api.CoreValue;
+
 import org.apache.jackrabbit.oak.api.ResultRow;
+import org.apache.jackrabbit.oak.spi.query.PropertyValue;
 
 /**
  * The implementation of the corresponding JCR interface.
@@ -89,7 +90,7 @@ public class RowImpl implements Row {
 
     @Override
     public Value[] getValues() throws RepositoryException {
-        CoreValue[] values = row.getValues();
+        PropertyValue[] values = row.getValues();
         int len = values.length;
         Value[] v2 = new Value[values.length];
         for (int i = 0; i < len; i++) {