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 th...@apache.org on 2013/10/23 16:55:13 UTC

svn commit: r1535041 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query: ./ ast/

Author: thomasm
Date: Wed Oct 23 14:55:13 2013
New Revision: 1535041

URL: http://svn.apache.org/r1535041
Log:
OAK-1106 Query engine does not deal with remapped namespaces

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/InImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyValueImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java Wed Oct 23 14:55:13 2013
@@ -605,14 +605,23 @@ public class QueryImpl implements Query 
     }
 
     /**
-     * Validate a path is syntactically correct.
+     * Validate the path is syntactically correct, and convert it to an Oak
+     * internal path (including namespace remapping if needed).
      * 
-     * @param path the path to validate
+     * @param path the path
+     * @return the the converted path
      */
-    public void validatePath(String path) {
+    public String getOakPath(String path) {
+        if (path == null) {
+            return null;
+        }
         if (!JcrPathParser.validate(path)) {
             throw new IllegalArgumentException("Invalid path: " + path);
         }
+        if (namePathMapper == null) {
+            return path;
+        }
+        return namePathMapper.getOakPath(path);
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AstElement.java Wed Oct 23 14:55:13 2013
@@ -18,8 +18,11 @@
  */
 package org.apache.jackrabbit.oak.query.ast;
 
+import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.query.QueryImpl;
+import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 
 /**
  * The base class for all abstract syntax tree nodes.
@@ -47,6 +50,40 @@ abstract class AstElement {
     public void setQuery(QueryImpl query) {
         this.query = query;
     }
+    
+    /**
+     * Normalize the property name (including namespace remapping).
+     *
+     * @param propertyName the property name to normalize
+     * @return the normalized property name
+     */
+    protected String normalizePropertyName(String propertyName) {
+        // TODO normalize the path (remove superfluous ".." and "." 
+        // where possible)
+        if (query == null) {
+            return propertyName;
+        }
+        if (propertyName == null) {
+            return null;
+        }
+        int slash = propertyName.indexOf('/');
+        if (slash < 0) {
+            return normalizeNonRelativePropertyName(propertyName);
+        }
+        // relative properties
+        String relativePath = PathUtils.getParentPath(propertyName);
+        relativePath = query.getOakPath(relativePath);
+        propertyName = PathUtils.getName(propertyName);
+        propertyName = normalizeNonRelativePropertyName(propertyName);
+        return PathUtils.concat(relativePath, propertyName);
+    }
+    
+    private String normalizeNonRelativePropertyName(String propertyName) {
+        if (propertyName.equals("*")) {
+            return propertyName;
+        }
+        return query.getOakPath(propertyName);
+    }
 
     /**
      * Validate and normalize the path.
@@ -54,12 +91,24 @@ abstract class AstElement {
      * @param path the path to validate
      * @return the validated and normalized path
      */
-    protected String validateAndNormalizePath(String path) {
-        // TODO normalize the path (remove superfluous ".." and "." where possible)
-        // possibly using
-        //  PropertyValues.getOakPath(name, query.getNamePathMapper());
-        query.validatePath(path);
-        return path;
+    protected String normalizePath(String path) {
+        // TODO normalize the path (remove superfluous ".." and "." 
+        // where possible)
+        if (query == null) {
+            return path;
+        }
+        return query.getOakPath(path);
+    }
+    
+    protected PropertyValue convertValueToType(PropertyValue v, PropertyValue targetType) {
+        if (targetType.count() == 0) {
+            return v;
+        }
+        int type = targetType.getType().tag();
+        if (v.getType().tag() == type) {
+            return v;
+        }
+        return PropertyValues.convert(v, type, query.getNamePathMapper());
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ChildNodeImpl.java Wed Oct 23 14:55:13 2013
@@ -79,13 +79,17 @@ public class ChildNodeImpl extends Const
         }
         // the parent of the root is the root,
         // so we need to special case this
-        return !PathUtils.denotesRoot(local) && PathUtils.getParentPath(local).equals(parentPath);
+        if (PathUtils.denotesRoot(local)) {
+            return false;
+        }
+        String path = normalizePath(parentPath);
+        return PathUtils.getParentPath(local).equals(path);
     }
 
     @Override
     public void restrict(FilterImpl f) {
         if (selector == f.getSelector()) {
-            String path = validateAndNormalizePath(parentPath);
+            String path = normalizePath(parentPath);
             f.restrictPath(path, Filter.PathRestriction.DIRECT_CHILDREN);
         }
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java Wed Oct 23 14:55:13 2013
@@ -56,13 +56,6 @@ public class ComparisonImpl extends Cons
     public StaticOperandImpl getOperand2() {
         return operand2;
     }
-
-    public static int getType(PropertyValue p, int ifUnknown) {
-        if (p.count() > 0) {
-            return p.getType().tag();
-        }
-        return ifUnknown;
-    }
     
     @Override
     public Set<PropertyExistenceImpl> getPropertyExistenceConditions() {
@@ -100,12 +93,9 @@ public class ComparisonImpl extends Cons
             // even for "null <> 'x'" (same as in SQL) 
             return false;
         }
-        int v1Type = getType(p1, p2.getType().tag());
-        if (v1Type != p2.getType().tag()) {
-            // "the value of operand2 is converted to the
-            // property type of the value of operand1"
-            p2 = PropertyValues.convert(p2, v1Type, query.getNamePathMapper());
-        }
+        // "the value of operand2 is converted to the
+        // property type of the value of operand1"
+        p2 = convertValueToType(p2, p1);
         return evaluate(p1, p2);
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DescendantNodeImpl.java Wed Oct 23 14:55:13 2013
@@ -61,7 +61,7 @@ public class DescendantNodeImpl extends 
         if (p == null) {
             return false;
         }
-        String path = validateAndNormalizePath(ancestorPath);
+        String path = normalizePath(ancestorPath);
         if (path == null) {
             return false;
         }
@@ -86,7 +86,7 @@ public class DescendantNodeImpl extends 
     @Override
     public void restrict(FilterImpl f) {
         if (f.getSelector() == selector) {
-            String path = validateAndNormalizePath(ancestorPath);
+            String path = normalizePath(ancestorPath);
             f.restrictPath(path, Filter.PathRestriction.ALL_CHILDREN);
         }
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl.java Wed Oct 23 14:55:13 2013
@@ -80,7 +80,7 @@ public abstract class DynamicOperandImpl
     public int hashCode() {
         return toString().hashCode();
     }
-
+    
     public abstract DynamicOperandImpl createCopy();
 
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java Wed Oct 23 14:55:13 2013
@@ -74,17 +74,13 @@ public class EquiJoinConditionImpl exten
         }
         // TODO what is the expected result of an equi join for multi-valued properties?
         if (!p1.isArray() && p2.isArray()) {
-            if (p1.getType().tag() != p2.getType().tag()) {
-                p1 = PropertyValues.convert(p1, p2.getType().tag(), query.getNamePathMapper());
-            }
+            p1 = convertValueToType(p1, p2);
             if (p1 != null && PropertyValues.match(p1, p2)) {
                 return true;
             }
             return false;
         } else if (p1.isArray() && !p2.isArray()) {
-            if (p1.getType().tag() != p2.getType().tag()) {
-                p2 = PropertyValues.convert(p2, p1.getType().tag(), query.getNamePathMapper());
-            }
+            p2 = convertValueToType(p2, p1);
             if (p2 != null && PropertyValues.match(p1, p2)) {
                 return true;
             }
@@ -109,7 +105,8 @@ public class EquiJoinConditionImpl exten
                 }
             }
             // always set the condition, even if unkown ( -> is not null)
-            f.restrictProperty(property1Name, Operator.EQUAL, p2);
+            String p1n = normalizePropertyName(property1Name);
+            f.restrictProperty(p1n, Operator.EQUAL, p2);
         }
         if (f.getSelector() == selector2) {
             PropertyValue p1 = selector1.currentProperty(property1Name);
@@ -125,7 +122,8 @@ public class EquiJoinConditionImpl exten
                 }
             }
             // always set the condition, even if unkown ( -> is not null)
-            f.restrictProperty(property2Name, Operator.EQUAL, p1);
+            String p2n = normalizePropertyName(property2Name);
+            f.restrictProperty(p2n, Operator.EQUAL, p1);
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchImpl.java Wed Oct 23 14:55:13 2013
@@ -96,16 +96,14 @@ public class FullTextSearchImpl extends 
         builder.append("contains(");
         builder.append(quote(selectorName));
         builder.append('.');
-        String propertyName = this.propertyName;
-        if (propertyName == null) {
-            propertyName = "*";
+        String pn = propertyName;
+        if (pn == null) {
+            pn = "*";
         }
-        
         if (relativePath != null) {
-            propertyName = relativePath + "/" + propertyName;
+            pn = relativePath + "/" + pn;
         }
-        
-        builder.append(quote(propertyName));
+        builder.append(quote(pn));
         builder.append(", ");
         builder.append(getFullTextSearchExpression());
         builder.append(')');
@@ -140,7 +138,8 @@ public class FullTextSearchImpl extends 
                 }
                 p = PathUtils.concat(relativePath, p);
             }
-            return FullTextParser.parse(p, v.getValue(Type.STRING));
+            String p2 = normalizePropertyName(p);
+            return FullTextParser.parse(p2, v.getValue(Type.STRING));
         } catch (ParseException e) {
             throw new IllegalArgumentException("Invalid expression: " + fullTextSearchExpression, e);
         }
@@ -189,7 +188,8 @@ public class FullTextSearchImpl extends 
                         PropertyValues.newString(PathUtils.getName(path)));
             }
             if (relativePath != null) {
-                path = PathUtils.concat(path, relativePath);
+                String rp = normalizePath(relativePath);
+                path = PathUtils.concat(path, rp);
             }
 
             Tree tree = getTree(path);
@@ -198,7 +198,8 @@ public class FullTextSearchImpl extends 
             }
 
             if (propertyName != null) {
-                PropertyState p = tree.getProperty(propertyName);
+                String pn = normalizePropertyName(propertyName);
+                PropertyState p = tree.getProperty(pn);
                 if (p == null) {
                     return false;
                 }
@@ -230,7 +231,8 @@ public class FullTextSearchImpl extends 
     public void restrict(FilterImpl f) {
         if (propertyName != null) {
             if (f.getSelector() == selector) {
-                f.restrictProperty(propertyName, Operator.NOT_EQUAL, null);
+                String pn = normalizePropertyName(propertyName);
+                f.restrictProperty(pn, Operator.NOT_EQUAL, null);
             }
         }
         f.restrictFulltextCondition(fullTextSearchExpression.currentValue().getValue(Type.STRING));

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl.java Wed Oct 23 14:55:13 2013
@@ -63,7 +63,7 @@ public class FullTextSearchScoreImpl ext
 
     @Override
     public PropertyValue currentProperty() {
-        PropertyValue p = selector.currentProperty(QueryImpl.JCR_SCORE);
+        PropertyValue p = selector.currentOakProperty(QueryImpl.JCR_SCORE);
         if (p == null) {
             // TODO if score() is not supported by the index, use the value 0.0?
             return PropertyValues.newDouble(0.0);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/InImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/InImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/InImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/InImpl.java Wed Oct 23 14:55:13 2013
@@ -87,12 +87,9 @@ public class InImpl extends ConstraintIm
                 // if the property doesn't exist, the result is false
                 continue;
             }
-            int v1Type = ComparisonImpl.getType(p1, p2.getType().tag());
-            if (v1Type != p2.getType().tag()) {
-                // "the value of operand2 is converted to the
-                // property type of the value of operand1"
-                p2 = PropertyValues.convert(p2, v1Type, query.getNamePathMapper());
-            }
+            // "the value of operand2 is converted to the
+            // property type of the value of operand1"
+            p2 = convertValueToType(p2, p1);
             if (PropertyValues.match(p1, p2)) {
                 return true;
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java Wed Oct 23 14:55:13 2013
@@ -68,6 +68,7 @@ public class LengthImpl extends DynamicO
         if (p == null) {
             return null;
         }
+        // TODO namespace remapping?
         if (!p.isArray()) {
             long length = p.size();
             return PropertyValues.newLong(length);

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -58,6 +58,7 @@ public class LiteralImpl extends StaticO
 
     @Override
     PropertyValue currentValue() {
+        // TODO namespace remapping?
         return value;
     }
     

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -71,6 +71,7 @@ public class NodeLocalNameImpl extends D
         int colon = name.indexOf(':');
         // TODO LOCALNAME: evaluation of local name might not be correct
         String localName = colon < 0 ? name : name.substring(colon + 1);
+        // TODO reverse namespace remapping?
         return PropertyValues.newString(localName);
     }
 

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -77,6 +77,7 @@ public class NodeNameImpl extends Dynami
     public PropertyValue currentProperty() {
         String path = selector.currentPath();
         String name = PathUtils.getName(path);
+        // TODO reverse namespace remapping?
         return PropertyValues.newName(name);
     }
 

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -81,7 +81,8 @@ public class PropertyExistenceImpl exten
     @Override
     public void restrict(FilterImpl f) {
         if (f.getSelector() == selector) {
-            f.restrictProperty(propertyName, Operator.NOT_EQUAL, null);
+            String pn = normalizePropertyName(propertyName);
+            f.restrictProperty(pn, Operator.NOT_EQUAL, null);
         }
     }
 
@@ -94,8 +95,9 @@ public class PropertyExistenceImpl exten
     
     @Override
     public int hashCode() {
+        String pn = normalizePropertyName(propertyName);
         return ((selectorName == null) ? 0 : selectorName.hashCode()) * 31 +
-                ((propertyName == null) ? 0 : propertyName.hashCode());
+                ((pn == null) ? 0 : pn.hashCode());
     }
 
     @Override
@@ -106,8 +108,12 @@ public class PropertyExistenceImpl exten
             return false;
         }
         PropertyExistenceImpl other = (PropertyExistenceImpl) obj;
-        return equalsStrings(selectorName, other.selectorName) &&
-                equalsStrings(propertyName, other.propertyName);
+        if (!equalsStrings(selectorName, other.selectorName)) {
+            return false;
+        }
+        String pn = normalizePropertyName(propertyName);
+        String pn2 = normalizePropertyName(other.propertyName);
+        return equalsStrings(pn, pn2);
     }
     
     private static boolean equalsStrings(String a, String b) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl.java Wed Oct 23 14:55:13 2013
@@ -51,16 +51,17 @@ public class PropertyInexistenceImpl ext
 
     @Override
     public boolean evaluate() {
-        boolean relative = propertyName.indexOf('/') >= 0;
-        if (!relative) {
+        boolean isRelative = propertyName.indexOf('/') >= 0;
+        if (!isRelative) {
             return selector.currentProperty(propertyName) == null;
         }
         Tree t = selector.currentTree();
         if (t == null) {
             return true;
         }
-        String relativePath = PathUtils.getParentPath(propertyName);
-        String name = PathUtils.getName(propertyName);
+        String pn = normalizePath(propertyName);
+        String relativePath = PathUtils.getParentPath(pn);
+        String name = PathUtils.getName(pn);
         for (String p : PathUtils.elements(relativePath)) {
             if (t == null || !t.exists()) {
                 return false;
@@ -140,8 +141,9 @@ public class PropertyInexistenceImpl ext
     
     @Override
     public int hashCode() {
+        String pn = normalizePropertyName(propertyName);
         return ((selectorName == null) ? 0 : selectorName.hashCode()) * 31 +
-                ((propertyName == null) ? 0 : propertyName.hashCode());
+                ((pn == null) ? 0 : pn.hashCode());
     }
 
     @Override
@@ -152,8 +154,12 @@ public class PropertyInexistenceImpl ext
             return false;
         }
         PropertyInexistenceImpl other = (PropertyInexistenceImpl) obj;
-        return equalsStrings(selectorName, other.selectorName) &&
-                equalsStrings(propertyName, other.propertyName);
+        if (!equalsStrings(selectorName, other.selectorName)) {
+            return false;
+        }
+        String pn = normalizePropertyName(propertyName);
+        String pn2 = normalizePropertyName(other.propertyName);
+        return equalsStrings(pn, pn2);
     }
     
     private static boolean equalsStrings(String a, String b) {

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -118,10 +118,11 @@ public class PropertyValueImpl extends D
         }
         if (!asterisk) {
             String name = PathUtils.getName(propertyName);
-            if (!tree.hasProperty(name)) {
+            name = normalizePropertyName(name);
+            PropertyState p = tree.getProperty(name);
+            if (p == null) {
                 return null;
             }
-            PropertyState p = tree.getProperty(name);
             return matchesPropertyType(p) ? PropertyValues.create(p) : null;
         }
         // asterisk - create a multi-value property
@@ -171,9 +172,10 @@ public class PropertyValueImpl extends D
                 // not supported
                 return;
             }
-            f.restrictProperty(propertyName, operator, v);
+            String pn = normalizePropertyName(propertyName);            
+            f.restrictProperty(pn, operator, v);
             if (propertyType != PropertyType.UNDEFINED) {
-                f.restrictPropertyType(propertyName, operator, propertyType);
+                f.restrictPropertyType(pn, operator, propertyType);
             }
         }
     }
@@ -181,7 +183,8 @@ public class PropertyValueImpl extends D
     @Override
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
         if (f.getSelector() == selector) {
-            f.restrictPropertyAsList(propertyName, list);
+            String pn = normalizePropertyName(propertyName);            
+            f.restrictPropertyAsList(pn, list);
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeImpl.java Wed Oct 23 14:55:13 2013
@@ -41,8 +41,7 @@ public class SameNodeImpl extends Constr
 
     @Override
     public boolean evaluate() {
-        String p = validateAndNormalizePath(path);
-        // TODO normalize paths
+        String p = normalizePath(path);
         return selector.currentPath().equals(p);
     }
     
@@ -79,10 +78,9 @@ public class SameNodeImpl extends Constr
     @Override
     public void restrict(FilterImpl f) {
         if (f.getSelector() == selector) {
-            String p = validateAndNormalizePath(path);
+            String p = normalizePath(path);
             f.restrictPath(p, Filter.PathRestriction.EXACT);
         }
-        // TODO validate absolute path
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java?rev=1535041&r1=1535040&r2=1535041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl.java Wed Oct 23 14:55:13 2013
@@ -69,11 +69,11 @@ public class SameNodeJoinConditionImpl e
     public boolean evaluate() {
         String p1 = selector1.currentPath();
         String p2 = selector2.currentPath();
-        // TODO normalize paths; support more complex relative path (".." and so on)
         if (selector2Path.equals(".")) {
             return p1.equals(p2);
         }
-        String p = PathUtils.concat(p2, selector2Path);
+        String pn = normalizePath(selector2Path);
+        String p = PathUtils.concat(p2, pn);
         return p.equals(p1);
     }
 
@@ -90,8 +90,8 @@ public class SameNodeJoinConditionImpl e
                 if (selector2Path.equals(".")) {
                     f.restrictPath(p2, Filter.PathRestriction.EXACT);
                 } else {
-                    // TODO normalize paths; support more complex relative path (".." and so on)
-                    String p = PathUtils.concat(p2, selector2Path);
+                    String pn = normalizePath(selector2Path);
+                    String p = PathUtils.concat(p2, pn);
                     f.restrictPath(p, Filter.PathRestriction.EXACT);
                 }
             }
@@ -106,8 +106,6 @@ public class SameNodeJoinConditionImpl e
             if (p1 != null) {
                 if (selector2Path.equals(".")) {
                     f.restrictPath(p1, Filter.PathRestriction.EXACT);
-                } else {
-                    // TODO normalize paths; support relative path (".." and so on)
                 }
             }
         }

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=1535041&r1=1535040&r2=1535041&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 Wed Oct 23 14:55:13 2013
@@ -74,17 +74,19 @@ public class SelectorImpl extends Source
     private final boolean matchesAllTypes;
 
     /**
-     * all of the matching supertypes, or empty if the {@link #matchesAllTypes} flag is set
+     * All of the matching supertypes, or empty if the {@link #matchesAllTypes}
+     * flag is set
      */
     private final Set<String> supertypes;
 
     /**
-     * all of the matching primary subtypes, or empty if the {@link #matchesAllTypes} flag is set
+     * All of the matching primary subtypes, or empty if the
+     * {@link #matchesAllTypes} flag is set
      */
     private final Set<String> primaryTypes;
 
     /**
-     * all of the matching mixin types, or empty if the {@link #matchesAllTypes}
+     * All of the matching mixin types, or empty if the {@link #matchesAllTypes}
      * flag is set
      */
     private final Set<String> mixinTypes;
@@ -333,7 +335,7 @@ public class SelectorImpl extends Source
     }
 
     /**
-     * Get the current absolute path (including workspace name)
+     * Get the current absolute Oak path (normalized).
      *
      * @return the path
      */
@@ -349,7 +351,18 @@ public class SelectorImpl extends Source
         return getTree(path);
     }
 
+    /**
+     * The value for the given selector for the current node.
+     * 
+     * @param propertyName the JCR (not normalized) property name
+     * @return the property value
+     */
     public PropertyValue currentProperty(String propertyName) {
+        String pn = normalizePropertyName(propertyName);
+        return currentOakProperty(pn);
+    }
+    
+    public PropertyValue currentOakProperty(String propertyName) {
         boolean relative = propertyName.indexOf('/') >= 0;
         Tree t = currentTree();
         if (relative) {