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 2012/03/21 10:53:11 UTC
svn commit: r1303334 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/query/
main/java/org/apache/jackrabbit/oak/query/ast/
test/java/org/apache/jackrabbit/oak/query/
Author: thomasm
Date: Wed Mar 21 09:53:10 2012
New Revision: 1303334
URL: http://svn.apache.org/viewvc?rev=1303334&view=rev
Log:
OAK-28 Query implementation (bind variables)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LengthImpl.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1303334&r1=1303333&r2=1303334&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Mar 21 09:53:10 2012
@@ -182,6 +182,7 @@ public class Query {
@Override
public boolean visit(SelectorImpl node) {
+ selectors.add(node);
node.setQuery(query);
return true;
}
@@ -284,18 +285,15 @@ public class Query {
for (int i = 0, size = orderings.length; i < size; i++) {
Value a = orderValues[i];
Value b = orderValues2[i];
- // TODO order by: currently use string compare
- String as = a == null ? null : a.getString();
- String bs = b == null ? null : b.getString();
- if (as == null || bs == null) {
- if (as == bs) {
+ if (a == null || b == null) {
+ if (a == b) {
comp = 0;
- } else if (as == null) {
+ } else if (a == null) {
// TODO order by: nulls first, last, low or high?
comp = 1;
}
} else {
- comp = as.compareTo(bs);
+ comp = a.compareTo(b);
}
if (comp != 0) {
if (orderings[i].isDescending()) {
@@ -430,4 +428,12 @@ public class Query {
return offset;
}
+ public Value getBindVariableValue(String bindVariableName) {
+ Value v = bindVariableMap.get(bindVariableName);
+ if (v == null) {
+ throw new RuntimeException("Bind variable value not set: " + bindVariableName);
+ }
+ return v;
+ }
+
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java?rev=1303334&r1=1303333&r2=1303334&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngine.java Wed Mar 21 09:53:10 2012
@@ -40,7 +40,7 @@ public class QueryEngine {
return new QueryEngine(mk);
}
- public Iterator<Row> executeQuery(String language, String query, Map<String, String> bindings) throws ParseException {
+ public Iterator<Row> executeQuery(String language, String query, Map<String, Value> bindings) throws ParseException {
Query q;
if (SQL2.equals(language)) {
q = parserSQL2.parse(query);
@@ -53,8 +53,8 @@ public class QueryEngine {
}
q.setMicroKernel(mk);
if (bindings != null) {
- for (Entry<String, String> e : bindings.entrySet()) {
- q.bindValue(e.getKey(), vf.createValue(e.getValue()));
+ for (Entry<String, Value> e : bindings.entrySet()) {
+ q.bindValue(e.getKey(), e.getValue());
}
}
return q.executeQuery(mk.getHeadRevision());
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java?rev=1303334&r1=1303333&r2=1303334&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Row.java Wed Mar 21 09:53:10 2012
@@ -34,7 +34,7 @@ public class Row implements Comparable<R
}
public String getPath() {
- if (paths.length > 0) {
+ if (paths.length > 1) {
throw new IllegalArgumentException("More than one selector");
}
return paths[0];
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java?rev=1303334&r1=1303333&r2=1303334&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java Wed Mar 21 09:53:10 2012
@@ -23,7 +23,6 @@ import org.apache.jackrabbit.oak.query.V
public class BindVariableValueImpl extends StaticOperandImpl {
private final String bindVariableName;
- private Value value;
public BindVariableValueImpl(String bindVariableName) {
this.bindVariableName = bindVariableName;
@@ -45,7 +44,7 @@ public class BindVariableValueImpl exten
@Override
Value currentValue() {
- return value;
+ return query.getBindVariableValue(bindVariableName);
}
}
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=1303334&r1=1303333&r2=1303334&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 Mar 21 09:53:10 2012
@@ -49,6 +49,7 @@ public class LengthImpl extends DynamicO
if (v == null) {
return null;
}
+ // TODO LENGTH(..) is the length of the string representation?
String value = v.getString();
return query.getValueFactory().createValue(value.length());
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java?rev=1303334&r1=1303333&r2=1303334&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryTest.java Wed Mar 21 09:53:10 2012
@@ -13,6 +13,8 @@
*/
package org.apache.jackrabbit.oak.query;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -20,6 +22,7 @@ import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.ParseException;
+import java.util.HashMap;
import java.util.Iterator;
import org.apache.jackrabbit.mk.MicroKernelFactory;
import org.apache.jackrabbit.mk.api.MicroKernel;
@@ -58,6 +61,23 @@ public class QueryTest {
test("queryXpathTest.txt");
}
+ @Test
+ public void bindVariableTest() throws Exception {
+ head = mk.commit("/", "+ \"test\": { \"hello\": {\"id\": \"1\"}, \"world\": {\"id\": \"2\"}}", null, null);
+ HashMap<String, Value> sv = new HashMap<String, Value>();
+ ValueFactory vf = new ValueFactory();
+ sv.put("id", vf.createValue("1"));
+ Iterator<Row> result;
+ result = qe.executeQuery(QueryEngine.SQL2, "select * from [nt:base] where id = $id", sv);
+ assertTrue(result.hasNext());
+ assertEquals("/test/hello", result.next().getPath());
+
+ sv.put("id", vf.createValue("2"));
+ result = qe.executeQuery(QueryEngine.SQL2, "select * from [nt:base] where id = $id", sv);
+ assertTrue(result.hasNext());
+ assertEquals("/test/world", result.next().getPath());
+ }
+
private void test(String file) throws Exception {
InputStream in = getClass().getResourceAsStream(file);
LineNumberReader r = new LineNumberReader(new InputStreamReader(in));