/* * 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.RepositoryException; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Calendar; /** * <code>ChildAxisQueryTest</code> tests queries with a child axis in their * predicates. */ public class ChildAxisQueryTest extends AbstractQueryTest { /** * Predicate with child node axis in a relation */ public void testRelationQuery() throws RepositoryException { Node n1 = testRootNode.addNode(nodeName1); n1.setProperty(propertyName1, 1); Node n2 = testRootNode.addNode(nodeName1); n2.setProperty(propertyName1, 2); Node n3 = testRootNode.addNode(nodeName1); n3.setProperty(propertyName1, 3); testRootNode.save(); String base = testPath + "[" + nodeName1 + "/@" + propertyName1; executeXPathQuery(base + " = 1]", new Node[]{testRootNode}); executeXPathQuery(base + " = 2]", new Node[]{testRootNode}); executeXPathQuery(base + " = 3]", new Node[]{testRootNode}); executeXPathQuery(base + " = 4]", new Node[]{}); executeXPathQuery(base + " > 0]", new Node[]{testRootNode}); executeXPathQuery(base + " > 1]", new Node[]{testRootNode}); executeXPathQuery(base + " > 2]", new Node[]{testRootNode}); executeXPathQuery(base + " > 3]", new Node[]{}); executeXPathQuery(base + " >= 1]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 2]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 3]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 4]", new Node[]{}); executeXPathQuery(base + " < 1]", new Node[]{}); executeXPathQuery(base + " < 2]", new Node[]{testRootNode}); executeXPathQuery(base + " < 3]", new Node[]{testRootNode}); executeXPathQuery(base + " < 4]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 0]", new Node[]{}); executeXPathQuery(base + " <= 1]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 2]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 3]", new Node[]{testRootNode}); executeXPathQuery(base + " != 0]", new Node[]{testRootNode}); executeXPathQuery(base + " != 1]", new Node[]{testRootNode}); executeXPathQuery(base + " != 2]", new Node[]{testRootNode}); executeXPathQuery(base + " != 3]", new Node[]{testRootNode}); } public void testRelationQueryDeep() throws RepositoryException { Node n = testRootNode.addNode(nodeName1).addNode(nodeName2); Node n1 = n.addNode(nodeName3); n1.setProperty(propertyName1, 1); Node n2 = n.addNode(nodeName3); n2.setProperty(propertyName1, 2); Node n3 = n.addNode(nodeName3); n3.setProperty(propertyName1, 3); testRootNode.save(); String base = testPath + "[" + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName1; executeXPathQuery(base + " = 1]", new Node[]{testRootNode}); executeXPathQuery(base + " = 2]", new Node[]{testRootNode}); executeXPathQuery(base + " = 3]", new Node[]{testRootNode}); executeXPathQuery(base + " = 4]", new Node[]{}); executeXPathQuery(base + " > 0]", new Node[]{testRootNode}); executeXPathQuery(base + " > 1]", new Node[]{testRootNode}); executeXPathQuery(base + " > 2]", new Node[]{testRootNode}); executeXPathQuery(base + " > 3]", new Node[]{}); executeXPathQuery(base + " >= 1]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 2]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 3]", new Node[]{testRootNode}); executeXPathQuery(base + " >= 4]", new Node[]{}); executeXPathQuery(base + " < 1]", new Node[]{}); executeXPathQuery(base + " < 2]", new Node[]{testRootNode}); executeXPathQuery(base + " < 3]", new Node[]{testRootNode}); executeXPathQuery(base + " < 4]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 0]", new Node[]{}); executeXPathQuery(base + " <= 1]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 2]", new Node[]{testRootNode}); executeXPathQuery(base + " <= 3]", new Node[]{testRootNode}); executeXPathQuery(base + " != 0]", new Node[]{testRootNode}); executeXPathQuery(base + " != 1]", new Node[]{testRootNode}); executeXPathQuery(base + " != 2]", new Node[]{testRootNode}); executeXPathQuery(base + " != 3]", new Node[]{testRootNode}); } public void testMultiRelation() throws RepositoryException { Node level1 = testRootNode.addNode(nodeName1); level1.setProperty(propertyName1, "foo"); Node level2 = level1.addNode(nodeName2); level2.setProperty(propertyName1, "bar"); Node n1 = level2.addNode(nodeName3); n1.setProperty(propertyName2, 1); Node n2 = level2.addNode(nodeName3); n2.setProperty(propertyName2, 2); Node n3 = level2.addNode(nodeName3); n3.setProperty(propertyName2, 3); testRootNode.save(); String base = testPath + "[" + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2; executeXPathQuery(base + " = 1]", new Node[]{testRootNode}); executeXPathQuery(base + " = 1 and " + nodeName1 + "/@" + propertyName1 + " = 'foo' and " + nodeName1 + "/" + nodeName2 + "/@" + propertyName1 + " = 'bar']", new Node[]{testRootNode}); executeXPathQuery(base + " = 1 and " + nodeName1 + "/@" + propertyName1 + " = 'foo' and " + nodeName1 + "/" + nodeName2 + "/@" + propertyName1 + " = 'bar']", new Node[]{testRootNode}); executeXPathQuery(base + " = 1 and " + nodeName1 + "/@" + propertyName1 + " = 'foo' and " + nodeName2 + "/@" + propertyName1 + " = 'bar']", new Node[]{}); } public void testLike() throws RepositoryException { Node n1 = testRootNode.addNode(nodeName1); n1.setProperty(propertyName1, "foo"); Node n2 = testRootNode.addNode(nodeName1); n2.setProperty(propertyName1, "foobar"); Node n3 = testRootNode.addNode(nodeName1); n3.setProperty(propertyName1, "foo bar"); testRootNode.save(); String base = testPath + "[jcr:like(" + nodeName1 + "/@" + propertyName1; executeXPathQuery(base + ", 'fo_')]", new Node[]{testRootNode}); executeXPathQuery(base + ", 'foo_ar')]", new Node[]{testRootNode}); executeXPathQuery(base + ", 'foo %')]", new Node[]{testRootNode}); executeXPathQuery(base + ", 'f_oba')]", new Node[]{}); } public void testContains() throws RepositoryException { Node level1 = testRootNode.addNode(nodeName1); level1.setProperty(propertyName1, "The quick brown fox jumps over the lazy dog."); Node level2 = level1.addNode(nodeName2); level2.setProperty(propertyName1, "Franz jagt im total verwahrlosten Taxi quer durch Bayern."); Node n1 = level2.addNode(nodeName3); n1.setProperty(propertyName2, 1); Node n2 = level2.addNode(nodeName3); n2.setProperty(propertyName2, 2); Node n3 = level2.addNode(nodeName3); n3.setProperty(propertyName2, 3); testRootNode.save(); String base = testPath + "[jcr:contains("; executeXPathQuery(base + nodeName1 + "/@" + propertyName1 + ", 'lazy')" + " and " + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2 + " = 2]", new Node[]{testRootNode}); executeXPathQuery(base + nodeName1 + "/" + nodeName2 + "/@" + propertyName1 + ", 'franz')" + " and " + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2 + " = 3]", new Node[]{testRootNode}); executeXPathQuery(base + nodeName1 + ", 'lazy')" + " and " + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2 + " = 1]", new Node[]{testRootNode}); executeXPathQuery(base + nodeName1 + "/" + nodeName2 + ", 'franz')" + " and " + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2 + " = 1]", new Node[]{testRootNode}); } public void testNtFile() throws RepositoryException, IOException { Node file = testRootNode.addNode(nodeName1, "nt:file"); Node resource = file.addNode("jcr:content", "nt:resource"); resource.setProperty("jcr:encoding", "UTF-8"); resource.setProperty("jcr:mimeType", "text/plain"); ByteArrayOutputStream data = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(data, "UTF-8"); writer.write("The quick brown fox jumps over the lazy dog."); writer.close(); resource.setProperty("jcr:data", new ByteArrayInputStream(data.toByteArray())); resource.setProperty("jcr:lastModified", Calendar.getInstance()); testRootNode.save(); String xpath = testPath + "/*[jcr:contains(jcr:content, 'lazy')]"; executeXPathQuery(xpath, new Node[]{file}); } public void testStarNameTest() throws RepositoryException { Node level1 = testRootNode.addNode(nodeName1); level1.setProperty(propertyName1, "The quick brown fox jumps over the lazy dog."); Node level2 = level1.addNode(nodeName2); level2.setProperty(propertyName1, "Franz jagt im total verwahrlosten Taxi quer durch Bayern."); Node n1 = level2.addNode(nodeName3); n1.setProperty(propertyName2, 1); Node n2 = level2.addNode(nodeName3); n2.setProperty(propertyName2, 2); Node n3 = level2.addNode(nodeName4); n3.setProperty(propertyName2, 3); testRootNode.save(); String base = testPath + "[jcr:contains("; executeXPathQuery(base + nodeName1 + "/@" + propertyName1 + ", 'lazy')" + " and " + nodeName1 + "/" + nodeName2 + "/" + nodeName3 + "/@" + propertyName2 + " = 3]", new Node[]{}); executeXPathQuery(base + nodeName1 + "/@" + propertyName1 + ", 'lazy')" + " and " + nodeName1 + "/" + nodeName2 + "/*/@" + propertyName2 + " = 3]", new Node[]{testRootNode}); executeXPathQuery(base + "*/@" + propertyName1 + ", 'lazy')]", new Node[]{testRootNode}); executeXPathQuery(base + nodeName1 + "/*, 'franz')]", new Node[]{testRootNode}); executeXPathQuery(base + "*/*, 'franz')]", new Node[]{testRootNode}); executeXPathQuery(base + "*/*, 'lazy')]", new Node[]{}); } public void testSimpleQuery() throws Exception { Node foo = testRootNode.addNode("foo"); testRootNode.addNode("bar"); testRootNode.save(); String sql = "SELECT * FROM nt:unstructured WHERE jcr:path LIKE '"+testRoot+"/foo'"; executeSQLQuery(sql, new Node[] {foo}); } }