You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2012/02/29 17:53:00 UTC
svn commit: r1295186 - in /jackrabbit/sandbox/jackrabbit-microkernel/src:
main/java/org/apache/jackrabbit/query/qom/
main/java/org/apache/jackrabbit/query/qom/tree/ test/resources/
Author: thomasm
Date: Wed Feb 29 16:52:59 2012
New Revision: 1295186
URL: http://svn.apache.org/viewvc?rev=1295186&view=rev
Log:
Query implementation (WIP)
Modified:
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/QueryObjectModelImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/BindVariableValueImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/ChildNodeJoinConditionImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/DescendantNodeJoinConditionImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/EquiJoinConditionImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinConditionImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/SameNodeJoinConditionImpl.java
jackrabbit/sandbox/jackrabbit-microkernel/src/test/resources/queryTest.txt
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/QueryObjectModelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/QueryObjectModelImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/QueryObjectModelImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/QueryObjectModelImpl.java Wed Feb 29 16:52:59 2012
@@ -96,6 +96,7 @@ public class QueryObjectModelImpl implem
@Override
public boolean visit(ChildNodeJoinConditionImpl node) {
node.setQuery(query);
+ node.bindSelector(source);
return true;
}
@@ -115,12 +116,14 @@ public class QueryObjectModelImpl implem
@Override
public boolean visit(DescendantNodeJoinConditionImpl node) {
node.setQuery(query);
+ node.bindSelector(source);
return true;
}
@Override
public boolean visit(EquiJoinConditionImpl node) {
node.setQuery(query);
+ node.bindSelector(source);
return true;
}
@@ -172,6 +175,7 @@ public class QueryObjectModelImpl implem
@Override
public boolean visit(SameNodeJoinConditionImpl node) {
node.setQuery(query);
+ node.bindSelector(source);
return true;
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/BindVariableValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/BindVariableValueImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/BindVariableValueImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/BindVariableValueImpl.java Wed Feb 29 16:52:59 2012
@@ -20,7 +20,6 @@ package org.apache.jackrabbit.query.qom.
import javax.jcr.Value;
import javax.jcr.query.qom.BindVariableValue;
-import org.apache.jackrabbit.query.qom.QueryObjectModelImpl;
/**
* The implementation of the corresponding JCR interface.
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/ChildNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/ChildNodeJoinConditionImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/ChildNodeJoinConditionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/ChildNodeJoinConditionImpl.java Wed Feb 29 16:52:59 2012
@@ -27,6 +27,8 @@ public class ChildNodeJoinConditionImpl
private final String childSelectorName;
private final String parentSelectorName;
+ private SelectorImpl childSelector;
+ private SelectorImpl parentSelector;
public ChildNodeJoinConditionImpl(String childSelectorName, String parentSelectorName) {
this.childSelectorName = childSelectorName;
@@ -52,4 +54,20 @@ public class ChildNodeJoinConditionImpl
return "ISCHILDNODE(" + child + ", " + parent + ')';
}
+ public void bindSelector(SourceImpl source) {
+ parentSelector = source.getSelector(parentSelectorName);
+ if (parentSelector == null) {
+ throw new RuntimeException("Unknown selector: " + parentSelector);
+ }
+ childSelector = source.getSelector(childSelectorName);
+ if (childSelector == null) {
+ throw new RuntimeException("Unknown selector: " + childSelectorName);
+ }
+ }
+
+ @Override
+ public boolean evaluate() {
+ return parentSelector.currentPath().equals(childSelector.currentPath());
+ }
+
}
\ No newline at end of file
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/DescendantNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/DescendantNodeJoinConditionImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/DescendantNodeJoinConditionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/DescendantNodeJoinConditionImpl.java Wed Feb 29 16:52:59 2012
@@ -19,6 +19,7 @@
package org.apache.jackrabbit.query.qom.tree;
import javax.jcr.query.qom.DescendantNodeJoinCondition;
+import org.apache.jackrabbit.mk.util.PathUtils;
/**
* The implementation of the corresponding JCR interface.
@@ -28,6 +29,8 @@ public class DescendantNodeJoinCondition
private final String descendantSelectorName;
private final String ancestorSelectorName;
+ private SelectorImpl descendantSelector;
+ private SelectorImpl ancestorSelector;
public DescendantNodeJoinConditionImpl(String descendantSelectorName,
String ancestorSelectorName) {
@@ -54,4 +57,22 @@ public class DescendantNodeJoinCondition
return "ISDESCENDANTNODE(" + descendant + ", " + ancestor + ')';
}
+ public void bindSelector(SourceImpl source) {
+ descendantSelector = source.getSelector(descendantSelectorName);
+ if (descendantSelector == null) {
+ throw new RuntimeException("Unknown selector: " + descendantSelectorName);
+ }
+ ancestorSelector = source.getSelector(ancestorSelectorName);
+ if (ancestorSelector == null) {
+ throw new RuntimeException("Unknown selector: " + ancestorSelectorName);
+ }
+ }
+
+ @Override
+ public boolean evaluate() {
+ String a = ancestorSelector.currentPath();
+ String d = descendantSelector.currentPath();
+ return PathUtils.isAncestor(a, d);
+ }
+
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/EquiJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/EquiJoinConditionImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/EquiJoinConditionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/EquiJoinConditionImpl.java Wed Feb 29 16:52:59 2012
@@ -19,6 +19,7 @@
package org.apache.jackrabbit.query.qom.tree;
import javax.jcr.query.qom.EquiJoinCondition;
+import org.apache.jackrabbit.mk.simple.NodeImpl;
/**
* The implementation of the corresponding JCR interface.
@@ -29,6 +30,8 @@ public class EquiJoinConditionImpl exten
private final String property2Name;
private final String selector1Name;
private final String selector2Name;
+ private SelectorImpl selector1;
+ private SelectorImpl selector2;
public EquiJoinConditionImpl(String selector1Name, String property1Name, String selector2Name,
String property2Name) {
@@ -65,4 +68,31 @@ public class EquiJoinConditionImpl exten
+ " = " + getSelector2Name() + '.' + getProperty2Name();
}
+ public void bindSelector(SourceImpl source) {
+ selector1 = source.getSelector(selector1Name);
+ if (selector1 == null) {
+ throw new RuntimeException("Unknown selector: " + selector1Name);
+ }
+ selector2 = source.getSelector(selector2Name);
+ if (selector2 == null) {
+ throw new RuntimeException("Unknown selector: " + selector2Name);
+ }
+ }
+
+ @Override
+ public boolean evaluate() {
+ NodeImpl n1 = selector1.currentNode();
+ String v1 = n1.getProperty(property1Name);
+ if (v1 == null) {
+ return false;
+ }
+ // TODO data type mapping
+ NodeImpl n2 = selector2.currentNode();
+ String v2 = n2.getProperty(property1Name);
+ if (v2 == null) {
+ return false;
+ }
+ return v1.equals(v2);
+ }
+
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinConditionImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinConditionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinConditionImpl.java Wed Feb 29 16:52:59 2012
@@ -17,6 +17,6 @@ import javax.jcr.query.qom.JoinCondition
public abstract class JoinConditionImpl extends QOMNode implements JoinCondition {
- // marker class
+ public abstract boolean evaluate();
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/JoinImpl.java Wed Feb 29 16:52:59 2012
@@ -14,6 +14,8 @@
package org.apache.jackrabbit.query.qom.tree;
import javax.jcr.query.qom.Join;
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.simple.NodeImpl;
import org.apache.jackrabbit.query.qom.QueryObjectModelImpl;
/**
@@ -25,6 +27,10 @@ public class JoinImpl extends SourceImpl
private final SourceImpl right;
private final JoinType joinType;
private final JoinConditionImpl joinCondition;
+ private boolean leftNeedExecute, rightNeedExecute;
+ private boolean leftNeedNext;
+ private boolean end;
+ private String revisionId;
public JoinImpl(SourceImpl left, SourceImpl right, JoinType joinType,
JoinConditionImpl joinCondition) {
@@ -89,6 +95,12 @@ public class JoinImpl extends SourceImpl
}
@Override
+ public void prepare(MicroKernel mk) {
+ left.prepare(mk);
+ right.prepare(mk);
+ }
+
+ @Override
public SelectorImpl getSelector(String selectorName) {
SelectorImpl s = left.getSelector(selectorName);
if (s == null) {
@@ -97,4 +109,53 @@ public class JoinImpl extends SourceImpl
return s;
}
+ @Override
+ public void execute(String revisionId) {
+ this.revisionId = revisionId;
+ leftNeedExecute = true;
+ end = false;
+ }
+
+ public boolean next() {
+ // TODO implement outer joins
+ if (end) {
+ return false;
+ }
+ if (leftNeedExecute) {
+ left.execute(revisionId);
+ leftNeedExecute = false;
+ leftNeedNext = true;
+ }
+ while (true) {
+ if (leftNeedNext) {
+ if (!left.next()) {
+ end = true;
+ return false;
+ }
+ leftNeedNext = false;
+ rightNeedExecute = true;
+ }
+ if (rightNeedExecute) {
+ right.execute(revisionId);
+ rightNeedExecute = false;
+ }
+ if (!right.next()) {
+ leftNeedNext = true;
+ } else {
+ if (joinCondition.evaluate()) {
+ return true;
+ }
+ }
+ }
+ }
+
+ public String currentPath() {
+ // TODO
+ return left.currentPath();
+ }
+
+ public NodeImpl currentNode() {
+ return null;
+ }
+
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/SameNodeJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/SameNodeJoinConditionImpl.java?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/SameNodeJoinConditionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/query/qom/tree/SameNodeJoinConditionImpl.java Wed Feb 29 16:52:59 2012
@@ -28,6 +28,8 @@ public class SameNodeJoinConditionImpl e
private final String selector1Name;
private final String selector2Name;
private final String selector2Path;
+ private SelectorImpl selector1;
+ private SelectorImpl selector2;
public SameNodeJoinConditionImpl(String selector1Name, String selector2Name,
String selector2Path) {
@@ -67,4 +69,21 @@ public class SameNodeJoinConditionImpl e
return builder.toString();
}
+ public void bindSelector(SourceImpl source) {
+ selector1 = source.getSelector(selector1Name);
+ if (selector1 == null) {
+ throw new RuntimeException("Unknown selector: " + selector1Name);
+ }
+ selector2 = source.getSelector(selector2Name);
+ if (selector2 == null) {
+ throw new RuntimeException("Unknown selector: " + selector2Name);
+ }
+ }
+
+ @Override
+ public boolean evaluate() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/test/resources/queryTest.txt
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/test/resources/queryTest.txt?rev=1295186&r1=1295185&r2=1295186&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/test/resources/queryTest.txt (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/test/resources/queryTest.txt Wed Feb 29 16:52:59 2012
@@ -5,6 +5,17 @@
# * new tests are typically be added on top, after the syntax docs
# * use ascii character only
++ "parents": { "p0": {"id": "0"}, "p1": {"id": "1"}, "p2": {"id": "2"}}
++ "children": { "c1": {"p": "1"}, "c2": {"p": "1"}, "c3": {"p": "2"}, "c4": {"p": "3"}}
+
+select * from [nt:base] as p inner join [nt:base] as c on p.id = c.id
+/parents/p0
+/parents/p1
+/parents/p2
+
+- "parents"
+- "children"
+
+ "test": { "hello": { "x": "1" }, "world": { "x": "2" } }
+ "test2": { "id":"1", "x": "2" }