/* * 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.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.InvalidQueryException; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import org.exoplatform.services.jcr.access.AccessControlEntry; import org.exoplatform.services.jcr.access.PermissionType; import org.exoplatform.services.jcr.core.CredentialsImpl; import org.exoplatform.services.jcr.core.ExtendedNode; import org.exoplatform.services.jcr.impl.core.query.QueryImpl; import org.exoplatform.services.jcr.impl.core.query.lucene.QueryResultImpl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class LimitAndOffsetTest extends AbstractQueryTest { private Node node1; private Node node2; private Node node3; private QueryImpl query; protected void setUp() throws Exception { super.setUp(); node1 = testRootNode.addNode("foo"); node1.setProperty("name", "1"); node2 = testRootNode.addNode("foo"); node2.setProperty("name", "2"); node3 = testRootNode.addNode("foo"); node3.setProperty("name", "3"); testRootNode.save(); query = createXPathQuery("/jcr:root" + testRoot + "/* order by @name"); } protected void tearDown() throws Exception { node1 = null; node2 = null; node3 = null; query = null; super.tearDown(); } private QueryImpl createXPathQuery(String xpath) throws InvalidQueryException, RepositoryException { QueryManager queryManager = superuser.getWorkspace().getQueryManager(); return (QueryImpl) queryManager.createQuery(xpath, Query.XPATH); } protected void checkResult(QueryResult result, Node[] expectedNodes) throws RepositoryException { assertEquals(expectedNodes.length, result.getNodes().getSize()); } public void testLimit() throws Exception { query.setLimit(1); QueryResult result = query.execute(); checkResult(result, new Node[] { node1 }); query.setLimit(2); result = query.execute(); checkResult(result, new Node[] { node1, node2 }); query.setLimit(3); result = query.execute(); checkResult(result, new Node[] { node1, node2, node3 }); } public void testOffset() throws Exception { query.setOffset(0); QueryResult result = query.execute(); checkResult(result, new Node[] { node1, node2, node3 }); query.setOffset(1); result = query.execute(); checkResult(result, new Node[] { node2, node3 }); query.setOffset(2); result = query.execute(); checkResult(result, new Node[] { node3 }); } public void testOffsetAndLimit() throws Exception { query.setOffset(0); query.setLimit(1); QueryResult result = query.execute(); checkResult(result, new Node[] { node1 }); query.setOffset(1); query.setLimit(1); result = query.execute(); checkResult(result, new Node[] { node2 }); query.setOffset(1); query.setLimit(2); result = query.execute(); checkResult(result, new Node[] { node2, node3 }); query.setOffset(0); query.setLimit(2); result = query.execute(); checkResult(result, new Node[] { node1, node2 }); // Added for JCR-1323 query.setOffset(0); query.setLimit(4); result = query.execute(); checkResult(result, new Node[] { node1, node2, node3 }); } public void testOffsetAndSkip() throws Exception { query.setOffset(1); QueryResult result = query.execute(); NodeIterator nodes = result.getNodes(); nodes.skip(1); assertTrue(nodes.nextNode() == node3); } public void testOffsetAndLimitWithGetSize() throws Exception { query.setOffset(1); QueryResult result = query.execute(); NodeIterator nodes = result.getNodes(); assertEquals(2, nodes.getSize()); assertEquals(3, ((QueryResultImpl) result).getTotalSize()); query.setOffset(1); query.setLimit(1); result = query.execute(); nodes = result.getNodes(); assertEquals(1, nodes.getSize()); assertEquals(3, ((QueryResultImpl) result).getTotalSize()); } public void testOffsetAndLimitWithSetPermissions() throws Exception { String query = "Select * from nt:base where jcr:path like '/testroot/node1/%'" + " and not jcr:path like '/testroot/node1/%/%' order by title asc"; checkResultOffsetAndLimit(query); } public void testOffsetAndLimitWithSetPermissions1() throws Exception { String query = "Select * from nt:base where jcr:path like '/testroot/node1/%'" + " and not jcr:path like '/testroot/node1/%/%'"; checkResultOffsetAndLimit(query); } private void checkResultOffsetAndLimit(String sqlQuery) throws Exception { addTestNodes(); Session session = superuser.getRepository().login(new CredentialsImpl("mary", "exo".toCharArray())); Query query = session.getWorkspace().getQueryManager().createQuery(sqlQuery, Query.SQL); ((QueryImpl) query).setOffset(2); ((QueryImpl) query).setLimit(2); QueryResult queryResult = query.execute(); assertNotNull(queryResult); NodeIterator iter = queryResult.getNodes(); String[] result = new String[]{"f", "h"}; int p = 0; while (iter.hasNext()) { assertEquals(result[p], iter.nextNode().getName()); p++; } long size = queryResult.getNodes().getSize(); assertEquals(2, size); session.logout(); } private void addTestNodes() throws Exception { Map<String, String[]> per = new HashMap<String, String[]>(); Map<String, String[]> per1 = new HashMap<String, String[]>(); per.put("*:/platform/administrators", PermissionType.ALL); per.put("*:/platform/users", PermissionType.ALL); per1.put("*:/platform/administrators", PermissionType.ALL); Node node1 = testRootNode.addNode("node1"); Node a = node1.addNode("a"); a.setProperty("title", "a"); a.addMixin("exo:privilegeable"); ((ExtendedNode) a).setPermissions(per1); Node b = node1.addNode("b"); b.setProperty("title", "b"); b.addMixin("exo:privilegeable"); ((ExtendedNode) b).setPermissions(per); Node c = node1.addNode("c"); c.setProperty("title", "c"); c.addMixin("exo:privilegeable"); ((ExtendedNode) c).setPermissions(per1); Node d = node1.addNode("d"); d.setProperty("title", "d"); d.addMixin("exo:privilegeable"); ((ExtendedNode) d).setPermissions(per); Node e = node1.addNode("e"); e.setProperty("title", "e"); e.addMixin("exo:privilegeable"); ((ExtendedNode) e).setPermissions(per1); Node f = node1.addNode("f"); f.setProperty("title", "f"); f.addMixin("exo:privilegeable"); ((ExtendedNode) f).setPermissions(per); Node g = node1.addNode("g"); g.setProperty("title", "g"); g.addMixin("exo:privilegeable"); ((ExtendedNode) g).setPermissions(per1); Node h = node1.addNode("h"); h.setProperty("title", "h"); h.addMixin("exo:privilegeable"); ((ExtendedNode) h).setPermissions(per); Node i = node1.addNode("i"); i.setProperty("title", "i"); i.addMixin("exo:privilegeable"); ((ExtendedNode) i).setPermissions(per1); Node j = node1.addNode("j"); j.setProperty("title", "j"); j.addMixin("exo:privilegeable"); ((ExtendedNode) j).setPermissions(per); testRootNode.save(); } }