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) {