You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/07/30 16:06:03 UTC
svn commit: r681054 - in
/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core:
integration/GQLTest.java query/AbstractQueryTest.java
Author: mreutegg
Date: Wed Jul 30 07:06:00 2008
New Revision: 681054
URL: http://svn.apache.org/viewvc?rev=681054&view=rev
Log:
JCR-1697: Simple Google style query
- integration test for GQL
Added:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java?rev=681054&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java Wed Jul 30 07:06:00 2008
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.integration;
+
+import org.apache.jackrabbit.core.query.AbstractQueryTest;
+import org.apache.jackrabbit.commons.query.GQL;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.RowIterator;
+import java.util.Calendar;
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * <code>GQLTest</code> performs tests on {@link GQL}.
+ */
+public class GQLTest extends AbstractQueryTest {
+
+ private static final String SAMPLE_CONTENT = "the quick brown fox jumps over the lazy dog.";
+
+ public void testPath() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ Node n2 = testRootNode.addNode("node2");
+ Node n3 = testRootNode.addNode("node3");
+ superuser.save();
+ RowIterator rows = GQL.execute(createStatement(""), superuser);
+ checkResult(rows, new Node[]{n1, n2, n3});
+ }
+
+ public void testOrder() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("p", 1);
+ Node n2 = testRootNode.addNode("node2");
+ n2.setProperty("p", 2);
+ Node n3 = testRootNode.addNode("node3");
+ n3.setProperty("p", 3);
+ superuser.save();
+ // default: ascending
+ String stmt = createStatement("order:p");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n1, n2, n3});
+ // explicit ascending
+ stmt = createStatement("order:+p");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n1, n2, n3});
+ // explicit descending
+ stmt = createStatement("order:-p");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n3, n2, n1});
+ }
+
+ public void testLimit() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("p", 1);
+ Node n2 = testRootNode.addNode("node2");
+ n2.setProperty("p", 2);
+ Node n3 = testRootNode.addNode("node3");
+ n3.setProperty("p", 3);
+ superuser.save();
+ // only 2 results
+ String stmt = createStatement("order:p limit:2");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n1, n2});
+ // range with open start
+ stmt = createStatement("order:p limit:..2");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n1, n2});
+ // range with open end
+ stmt = createStatement("order:p limit:1..");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n2, n3});
+ // range
+ stmt = createStatement("order:p limit:1..2");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n2});
+ // range with end larger than max results
+ stmt = createStatement("order:p limit:1..7");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n2, n3});
+ // range start larger than end
+ // end is ignored in that case
+ stmt = createStatement("order:p limit:2..1");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n3});
+ // range with start larger than max results
+ stmt = createStatement("order:p limit:6..10");
+ rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{});
+ }
+
+ public void testPhrase() throws RepositoryException {
+ Node file1 = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ superuser.save();
+ String stmt = createStatement("\"quick brown\"");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ checkResult(rows, new Node[]{file1});
+ }
+
+ public void testExcludeTerm() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("text", "foo");
+ Node n2 = testRootNode.addNode("node2");
+ n2.setProperty("text", "bar");
+ Node n3 = testRootNode.addNode("node3");
+ n3.setProperty("text", "foo bar");
+ superuser.save();
+ String stmt = createStatement("foo -bar");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{n1});
+ }
+
+ public void testOptionalTerm() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("text", "apache jackrabbit");
+ Node n2 = testRootNode.addNode("node2");
+ n2.setProperty("text", "apache jcr");
+ Node n3 = testRootNode.addNode("node3");
+ n3.setProperty("text", "jackrabbit jcr");
+ superuser.save();
+ String stmt = createStatement("apache jackrabbit OR jcr");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{n1, n2});
+ }
+
+ public void testType() throws RepositoryException {
+ Node file = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ Node node = testRootNode.addNode("node1");
+ node.setProperty("text", SAMPLE_CONTENT);
+ superuser.save();
+ // only nt:resource
+ String stmt = createStatement("quick type:\"nt:resource\"");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{file.getNode("jcr:content")});
+ // only nt:unstructured
+ stmt = createStatement("quick type:\"nt:unstructured\"");
+ rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{node});
+ }
+
+ public void testMixinType() throws RepositoryException {
+ Node node = testRootNode.addNode("node1");
+ node.setProperty("text", SAMPLE_CONTENT);
+ node.addMixin(mixReferenceable);
+ superuser.save();
+ String stmt = createStatement("quick type:referenceable");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{node});
+ }
+
+ public void testTypeInheritance() throws RepositoryException {
+ Node file = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ superuser.save();
+ // nt:hierarchyNode and sub types
+ String stmt = createStatement("quick type:hierarchyNode");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ checkResult(rows, new Node[]{file});
+ }
+
+ public void testAutoPrefixType() throws RepositoryException {
+ Node file = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ Node node = testRootNode.addNode("node1");
+ node.setProperty("text", SAMPLE_CONTENT);
+ superuser.save();
+ // only nt:resource
+ String stmt = createStatement("quick type:resource");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{file.getNode("jcr:content")});
+ // only nt:unstructured
+ stmt = createStatement("quick type:unstructured");
+ rows = GQL.execute(stmt, superuser);
+ checkResult(rows, new Node[]{node});
+ }
+
+ public void testQuotedProperty() throws RepositoryException {
+ Node file1 = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ superuser.save();
+ String stmt = createStatement("\"jcr:mimeType\":text/plain");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ checkResult(rows, new Node[]{file1});
+ }
+
+ public void testAutoPrefix() throws RepositoryException {
+ Node file1 = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ superuser.save();
+ String stmt = createStatement("mimeType:text/plain");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ checkResult(rows, new Node[]{file1});
+ }
+
+ public void testCommonPathPrefix() throws RepositoryException {
+ Node file1 = addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ Node file2 = addFile(testRootNode, "file2.txt", SAMPLE_CONTENT);
+ Node file3 = addFile(testRootNode, "file3.txt", SAMPLE_CONTENT);
+ superuser.save();
+ String stmt = createStatement("quick");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ checkResult(rows, new Node[]{file1, file2, file3});
+ }
+
+ public void testExcerpt() throws RepositoryException {
+ addFile(testRootNode, "file1.txt", SAMPLE_CONTENT);
+ superuser.save();
+ String stmt = createStatement("quick");
+ RowIterator rows = GQL.execute(stmt, superuser, "jcr:content");
+ assertTrue("Expected result", rows.hasNext());
+ String excerpt = rows.nextRow().getValue("rep:excerpt()").getString();
+ assertTrue("No excerpt returned", excerpt.startsWith("<div><span>"));
+ stmt = createStatement("type:resource quick");
+ rows = GQL.execute(stmt, superuser);
+ assertTrue("Expected result", rows.hasNext());
+ excerpt = rows.nextRow().getValue("rep:excerpt()").getString();
+ assertTrue("No excerpt returned", excerpt.startsWith("<div><span>"));
+ }
+
+ public void testPrefixedValue() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("jcr:title", "a");
+ Node n2 = testRootNode.addNode("node2");
+ n2.setProperty("jcr:title", "b");
+ Node n3 = testRootNode.addNode("node3");
+ n3.setProperty("jcr:title", "c");
+ superuser.save();
+ String stmt = createStatement("order:jcr:title");
+ RowIterator rows = GQL.execute(stmt, superuser);
+ checkResultSequence(rows, new Node[]{n1, n2, n3});
+
+ }
+
+ public void XXXtestQueryDestruction() throws RepositoryException {
+ char[] stmt = createStatement("title:jackrabbit \"apache software\" type:file order:+title limit:10..20").toCharArray();
+ for (char c = 0; c < 255; c++) {
+ for (int i = 0; i < stmt.length; i++) {
+ char orig = stmt[i];
+ stmt[i] = c;
+ try {
+ GQL.execute(new String(stmt), superuser);
+ } finally {
+ stmt[i] = orig;
+ }
+ }
+ }
+ }
+
+ protected static Node addFile(Node folder, String name, String contents)
+ throws RepositoryException {
+ Node file = folder.addNode(name, "nt:file");
+ Node resource = file.addNode("jcr:content", "nt:resource");
+ resource.setProperty("jcr:lastModified", Calendar.getInstance());
+ resource.setProperty("jcr:mimeType", "text/plain");
+ resource.setProperty("jcr:encoding", "UTF-8");
+ try {
+ resource.setProperty("jcr:data", new ByteArrayInputStream(
+ contents.getBytes("UTF-8")));
+ } catch (UnsupportedEncodingException e) {
+ // will never happen
+ }
+ return file;
+ }
+
+ protected String createStatement(String stmt) {
+ return "path:" + testRoot + " " + stmt;
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/GQLTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java?rev=681054&r1=681053&r2=681054&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/query/AbstractQueryTest.java Wed Jul 30 07:06:00 2008
@@ -18,11 +18,13 @@
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.apache.jackrabbit.spi.commons.query.jsr283.qom.QueryObjectModelFactory;
+import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
import javax.jcr.query.QueryResult;
import javax.jcr.query.RowIterator;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
+import javax.jcr.query.Row;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Node;
@@ -32,6 +34,7 @@
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.NoSuchElementException;
/**
* Abstract base class for query test cases.
@@ -130,6 +133,8 @@
* the specified <code>nodes</code>.
* @param xpath the xpath query.
* @param nodes the expected result nodes.
+ * @throws RepositoryException if an error occurs while executing the query
+ * or checking the result.
*/
protected void executeXPathQuery(String xpath, Node[] nodes)
throws RepositoryException {
@@ -142,6 +147,8 @@
* the specified <code>nodes</code>.
* @param sql the sql query.
* @param nodes the expected result nodes.
+ * @throws RepositoryException if an error occurs while executing the query
+ * or checking the result.
*/
protected void executeSQLQuery(String sql, Node[] nodes)
throws RepositoryException {
@@ -153,17 +160,49 @@
* Checks if the result set contains exactly the <code>nodes</code>.
* @param result the query result.
* @param nodes the expected nodes in the result set.
+ * @throws RepositoryException if an error occurs while reading from the result.
*/
protected void checkResult(QueryResult result, Node[] nodes)
throws RepositoryException {
+ checkResult(result.getNodes(), nodes);
+ }
+
+ /**
+ * Checks if the result contains exactly the <code>nodes</code>.
+ * @param result the query result.
+ * @param nodes the expected nodes in the result set.
+ * @throws RepositoryException if an error occurs while reading from the result.
+ */
+ protected void checkResult(RowIterator result, Node[] nodes)
+ throws RepositoryException {
+ checkResult(new NodeIteratorAdapter(result) {
+ public Object next() throws NoSuchElementException {
+ Row next = (Row) super.next();
+ try {
+ return superuser.getItem(next.getValue("jcr:path").getString());
+ } catch (RepositoryException e) {
+ throw new NoSuchElementException();
+ }
+ }
+ }, nodes);
+ }
+
+ /**
+ * Checks if the result contains exactly the <code>nodes</code>.
+ * @param result the query result.
+ * @param nodes the expected nodes in the result set.
+ * @throws RepositoryException if an error occurs while reading from the result.
+ */
+ protected void checkResult(NodeIterator result, Node[] nodes)
+ throws RepositoryException {
// collect paths
Set expectedPaths = new HashSet();
for (int i = 0; i < nodes.length; i++) {
expectedPaths.add(nodes[i].getPath());
}
Set resultPaths = new HashSet();
- for (NodeIterator it = result.getNodes(); it.hasNext();) {
- resultPaths.add(it.nextNode().getPath());
+ while (result.hasNext()) {
+ resultPaths.add(result.nextNode().getPath());
}
// check if all expected are in result
for (Iterator it = expectedPaths.iterator(); it.hasNext();) {
@@ -178,6 +217,24 @@
}
/**
+ * Checks if the result set contains exactly the <code>nodes</code> in the
+ * given sequence.
+ *
+ * @param result the query result.
+ * @param nodes the expected nodes in the result set.
+ * @throws RepositoryException if an error occurs while reading from the result.
+ */
+ protected void checkResultSequence(RowIterator result, Node[] nodes)
+ throws RepositoryException {
+ for (int i = 0; i < nodes.length; i++) {
+ assertTrue("No more results, expected " + nodes[i].getPath(), result.hasNext());
+ String path = result.nextRow().getValue("jcr:path").getString();
+ assertEquals("Wrong sequence", nodes[i].getPath(), path);
+ }
+ assertFalse("No more result expected", result.hasNext());
+ }
+
+ /**
* Executes the query specified by <code>statement</code> and returns the
* query result.
*