/*
* 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.exoplatform.services.jcr.api.core.query;
import javax.jcr.RepositoryException;
import javax.jcr.NodeIterator;
import javax.jcr.query.QueryManager;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
import java.util.NoSuchElementException;
/**
* <code>QueryResultTest</code> tests various methods on the
* <code>NodeIterator</code> returned by a <code>QueryResult</code>.
*/
public class QueryResultTest extends AbstractQueryTest {
private static int INITIAL_NODE_NUM = 55;
protected void setUp() throws Exception {
super.setUp();
for (int i = 0; i < INITIAL_NODE_NUM; i++) {
testRootNode.addNode("node" + i).setProperty(propertyName1, i);
}
testRootNode.save();
}
public void testGetSize() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000]";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
assertEquals("Wrong size of NodeIterator in result",
INITIAL_NODE_NUM - i, result.getNodes().getSize());
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testGetSizeOrderByScore() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000] order by jcr:score()";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
assertEquals("Wrong size of NodeIterator in result",
INITIAL_NODE_NUM - i, result.getNodes().getSize());
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testIteratorNext() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000]";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
int size = 0;
for (NodeIterator it = result.getNodes(); it.hasNext(); ) {
it.nextNode();
size++;
}
assertEquals("Wrong size of NodeIterator in result",
INITIAL_NODE_NUM - i, size);
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testIteratorNextOrderByScore() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000] order by jcr:score()";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
int size = 0;
for (NodeIterator it = result.getNodes(); it.hasNext(); ) {
it.nextNode();
size++;
}
assertEquals("Wrong size of NodeIterator in result",
INITIAL_NODE_NUM - i, size);
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testSkip() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000]";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
for (int j = 0; j < INITIAL_NODE_NUM - i; j++) {
// skip to each node in the result
NodeIterator it = result.getNodes();
it.skip(j);
long propValue = it.nextNode().getProperty(propertyName1).getLong();
// expected = number of skipped nodes + number of deleted nodes
long expected = j + i;
assertEquals("Wrong node after skip()", expected, propValue);
}
try {
NodeIterator it = result.getNodes();
it.skip(it.getSize() + 1);
fail("must throw NoSuchElementException");
} catch (NoSuchElementException e) {
// correct
}
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testSkipOrderByProperty() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 +
" < 1000] order by @" + propertyName1;
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
for (int j = 0; j < INITIAL_NODE_NUM - i; j++) {
// skip to each node in the result
NodeIterator it = result.getNodes();
it.skip(j);
long propValue = it.nextNode().getProperty(propertyName1).getLong();
// expected = number of skipped nodes + number of deleted nodes
long expected = j + i;
assertEquals("Wrong node after skip()", expected, propValue);
}
try {
NodeIterator it = result.getNodes();
it.skip(it.getSize() + 1);
fail("must throw NoSuchElementException");
} catch (NoSuchElementException e) {
// correct
}
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testGetPosition() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000]";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
NodeIterator it = result.getNodes();
assertEquals("Wrong position", 0, it.getPosition());
int count = 0;
while (it.hasNext()) {
long position = it.getPosition();
it.nextNode();
assertEquals("Wrong position", count++, position);
}
try {
it.next();
fail("must throw NoSuchElementException");
} catch (Exception e) {
// correct
}
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testGetPositionOrderBy() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
for (int i = 0; i < 10; i++) {
String stmt = testPath + "/*[@" + propertyName1 + " < 1000] order by jcr:score()";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
NodeIterator it = result.getNodes();
assertEquals("Wrong position", 0, it.getPosition());
int count = 0;
while (it.hasNext()) {
long position = it.getPosition();
it.nextNode();
assertEquals("Wrong position", count++, position);
}
try {
it.next();
fail("must throw NoSuchElementException");
} catch (Exception e) {
// correct
}
// remove node for the next iteration
testRootNode.getNode("node" + i).remove();
testRootNode.save();
}
}
public void testPositionEmptyResult() throws RepositoryException {
QueryManager qm = superuser.getWorkspace().getQueryManager();
String stmt = testPath + "/*[@" + propertyName1 + " > 1000]";
QueryResult result = qm.createQuery(stmt, Query.XPATH).execute();
assertEquals("Wrong position", 0, result.getNodes().getPosition());
assertEquals("Wrong position", 0, result.getRows().getPosition());
stmt += " order by jcr:score()";
result = qm.createQuery(stmt, Query.XPATH).execute();
assertEquals("Wrong position", 0, result.getNodes().getPosition());
assertEquals("Wrong position", 0, result.getRows().getPosition());
}
}