/* * 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.query; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.query.Query; import javax.jcr.query.QueryResult; import javax.jcr.query.Row; import org.apache.jackrabbit.commons.JcrUtils; /** * Test case for queries with JCR_SQL2 having offset and limit clauses * * Inspired by <a * href="https://issues.apache.org/jira/browse/JCR-2830">JCR-2830</a> * */ public class SQL2OffsetLimitTest extends AbstractQueryTest { private final List<String> c = Arrays.asList("a", "b", "c", "d", "e"); @Override protected void setUp() throws Exception { super.setUp(); for (String s : c) { testRootNode.addNode(s); } testRootNode.getSession().save(); } @Override protected void tearDown() throws Exception { for (Node c : JcrUtils.getChildNodes(testRootNode)) { testRootNode.getSession().removeItem(c.getPath()); } testRootNode.getSession().save(); super.tearDown(); } private Query newQuery() throws Exception { return qm.createQuery("SELECT * FROM [nt:base] WHERE ISCHILDNODE([" + testRoot + "]) order by [jcr:score] ", Query.JCR_SQL2); } public void testNoConstraints() throws Exception { List<String> expected = new ArrayList<String>(c); Query q = newQuery(); List<String> out = qrToPaths(q.execute()); assertEquals(c.size(), out.size()); for (String s : out) { assertTrue(expected.remove(s)); } assertTrue(expected.isEmpty()); } public void testLimitEqSize() throws Exception { List<String> expected = new ArrayList<String>(c); Query q = newQuery(); q.setOffset(0); q.setLimit(c.size()); List<String> out = qrToPaths(q.execute()); assertEquals(c.size(), out.size()); for (String s : out) { assertTrue(expected.remove(s)); } assertTrue(expected.isEmpty()); } public void testLimitGtSize() throws Exception { List<String> expected = new ArrayList<String>(c); Query q = newQuery(); q.setOffset(0); q.setLimit(c.size() * 2); List<String> out = qrToPaths(q.execute()); assertEquals(c.size(), out.size()); for (String s : out) { assertTrue(expected.remove(s)); } assertTrue(expected.isEmpty()); } public void testOffsetEqSize() throws Exception { Query q = newQuery(); q.setOffset(c.size() - 1); List<String> out = qrToPaths(q.execute()); assertEquals(1, out.size()); } public void testOffsetGtSize() throws Exception { Query q = newQuery(); q.setOffset(c.size() * 2); List<String> out = qrToPaths(q.execute()); assertTrue(out.isEmpty()); } public void testSimplePagination() throws Exception { List<String> expected = new ArrayList<String>(c); Query q = newQuery(); for (int i = 0; i < c.size(); i++) { q.setOffset(i); q.setLimit(1); List<String> out = qrToPaths(q.execute()); assertEquals(1, out.size()); assertTrue(expected.remove(out.get(0))); } assertTrue(expected.isEmpty()); } public void test2BigPages() throws Exception { List<String> expected = new ArrayList<String>(c); Query q = newQuery(); int p1 = (int) (c.size() * 0.8); int p2 = c.size() - p1; q.setOffset(0); q.setLimit(p1); List<String> out1 = qrToPaths(q.execute()); assertEquals(p1, out1.size()); for (String s : out1) { assertTrue(expected.remove(s)); } q.setOffset(p1); q.setLimit(p2); List<String> out2 = qrToPaths(q.execute()); assertEquals(p2, out2.size()); for (String s : out2) { assertTrue(expected.remove(s)); } assertTrue(expected.isEmpty()); } private List<String> qrToPaths(QueryResult qr) throws RepositoryException { List<String> ret = new ArrayList<String>(); for (Row row : JcrUtils.getRows(qr)) { Node n = row.getNode(); ret.add(n.getPath().replace(n.getParent().getPath() + "/", "")); } return ret; } }