/*
* 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 javax.jcr.Node;
import javax.jcr.PropertyType;
import javax.jcr.nodetype.NodeType;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
/**
* Test case for JOIN queries with JCR_SQL2
*/
public class JoinTest extends AbstractQueryTest {
private Node node;
@Override
protected void setUp() throws Exception {
super.setUp();
node = testRootNode.addNode("jointest", "nt:unstructured");
Node n1a = node.addNode("n1a", "nt:unstructured");
n1a.addMixin(NodeType.MIX_REFERENCEABLE);
n1a.setProperty("type", "parent");
Node n1b = node.addNode("n1b", "nt:unstructured");
n1b.addMixin(NodeType.MIX_REFERENCEABLE);
n1b.setProperty("type", "parent");
n1b.setProperty("testJoinWithOR4", "testJoinWithOR4");
Node n1c = node.addNode("n1c", "nt:unstructured");
n1c.addMixin(NodeType.MIX_REFERENCEABLE);
n1c.setProperty("type", "parent");
Node n3 = node.addNode("node3", "nt:unstructured");
n3.addMixin(NodeType.MIX_REFERENCEABLE);
n3.setProperty("testref", new String[] { n1a.getIdentifier() },
PropertyType.REFERENCE);
n3.setProperty("type", "child");
n3.setProperty("testJoinWithOR4", "testJoinWithOR4");
Node n4 = node.addNode("node4", "nt:unstructured");
n4.addMixin(NodeType.MIX_REFERENCEABLE);
n4.setProperty("testref", new String[] { n1b.getIdentifier() },
PropertyType.REFERENCE);
n4.setProperty("type", "child");
Node n5 = node.addNode("node5", "nt:unstructured");
n5.addMixin(NodeType.MIX_REFERENCEABLE);
n5.setProperty("testref", new String[] { n1c.getIdentifier() },
PropertyType.REFERENCE);
n5.setProperty("type", "child");
Node parent2 = testRootNode
.addNode("jointest_other", "nt:unstructured");
parent2.setProperty("p", "abc");
Node p2n1 = parent2.addNode("p2n1", "nt:unstructured");
p2n1.setProperty("p", "abc");
Node p2n2 = parent2.addNode("p2n2", "nt:unstructured");
p2n2.setProperty("p", "xyz");
testRootNode.getSession().save();
}
@Override
protected void tearDown() throws Exception {
node.remove();
testRootNode.getSession().save();
super.tearDown();
}
/**
* Test case for <a
* href="https://issues.apache.org/jira/browse/JCR-2718">JCR-2718</a>
*/
public void testMultiValuedReferenceJoin() throws Exception {
String join = "SELECT a.*, b.*"
+ " FROM [nt:unstructured] AS a"
+ " INNER JOIN [nt:unstructured] AS b ON a.[jcr:uuid] = b.testref";
checkResult(qm.createQuery(join, Query.JCR_SQL2).execute(), 3);
}
/**
* Test case for <a
* href="https://issues.apache.org/jira/browse/JCR-2852">JCR-2852</a>
*/
public void testJoinWithOR() throws Exception {
String join = "SELECT a.*, b.*"
+ " FROM [nt:unstructured] AS a"
+ " INNER JOIN [nt:unstructured] AS b ON a.[jcr:uuid] = b.testref WHERE "
+ "a.[jcr:primaryType] IS NOT NULL OR b.[jcr:primaryType] IS NOT NULL";
checkResult(qm.createQuery(join, Query.JCR_SQL2).execute(), 3);
}
public void testJoinWithOR2() throws Exception {
StringBuilder join = new StringBuilder(
"SELECT a.* FROM [nt:unstructured] AS a");
join.append(" INNER JOIN [nt:unstructured] AS b ON ISCHILDNODE(b, a) ");
join.append(" WHERE ");
join.append(" a.[p] = 'abc' OR b.[p] = 'abc' ");
checkResult(qm.createQuery(join.toString(), Query.JCR_SQL2).execute(),
3);
}
public void testJoinWithOR3() throws Exception {
StringBuilder join = new StringBuilder(
"SELECT a.* FROM [nt:unstructured] AS a");
join.append(" INNER JOIN [nt:unstructured] AS b ON ISCHILDNODE(b, a) ");
join.append(" WHERE ");
join.append(" ( CONTAINS(b.*, 'abc' ) OR CONTAINS(a.*, 'abc') ) ");
join.append(" AND ");
join.append(" NAME(b) = 'p2n2' ");
checkResult(qm.createQuery(join.toString(), Query.JCR_SQL2).execute(),
1);
}
public void testJoinWithOR4() throws Exception {
StringBuilder join = new StringBuilder(
"SELECT a.* FROM [nt:unstructured] AS a");
join.append(" INNER JOIN [nt:unstructured] AS b ON b.[jcr:uuid] = a.testref ");
join.append(" WHERE ");
join.append(" a.type = 'child' ");
join.append(" AND (");
join.append(" CONTAINS(a.*, 'testJoinWithOR4') ");
join.append(" OR ");
join.append(" b.type = 'parent' ");
join.append(" AND ");
join.append(" CONTAINS(b.*, 'testJoinWithOR4') ");
join.append(" )");
Query q = qm.createQuery(join.toString(), Query.JCR_SQL2);
QueryResult result = q.execute();
checkResult(result, 2);
}
public void testJoinWithOR5() throws Exception {
StringBuilder join = new StringBuilder(
"SELECT a.* FROM [nt:unstructured] AS a");
join.append(" INNER JOIN [nt:unstructured] AS b ON b.[jcr:uuid] = a.testref ");
join.append(" WHERE ");
join.append(" a.type = 'child' AND CONTAINS(a.*, 'testJoinWithOR4') ");
join.append(" OR ");
join.append(" b.type = 'parent' AND CONTAINS(b.*, 'testJoinWithOR4') ");
checkResult(qm.createQuery(join.toString(), Query.JCR_SQL2).execute(),
2);
}
}