/* * 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.test.api.query.qom; import java.util.List; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import javax.jcr.RepositoryException; import javax.jcr.Node; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.PropertyDefinition; import javax.jcr.query.qom.Column; import javax.jcr.query.qom.QueryObjectModel; import javax.jcr.query.qom.QueryObjectModelConstants; import javax.jcr.query.QueryResult; import javax.jcr.query.RowIterator; import javax.jcr.query.Row; import javax.jcr.query.Query; /** * <code>ColumnTest</code> contains test cases related to QOM column. */ public class ColumnTest extends AbstractQOMTest { private static final String SELECTOR_1 = "s"; private static final String SELECTOR_2 = "p"; private static final String TEST_VALUE = "value"; /** * From the spec: * <p/> * If propertyName is not specified, a column is included for each * single-valued non-residual property of the node type specified by the * nodeType attribute of the selector selectorName. * <p/> * [..] If propertyName is not specified, * columnName must not be specified, and the included columns will be * named "selectorName.propertyName". */ public void testExpandColumnsForNodeType() throws RepositoryException { QueryObjectModel qom = qf.createQuery( qf.selector(testNodeType, SELECTOR_1), null, null, new Column[]{qf.column(SELECTOR_1, null, null)}); forQOMandSQL2(qom, new Callable() { public Object call(Query query) throws RepositoryException { QueryResult result = query.execute(); List names = new ArrayList(Arrays.asList(result.getColumnNames())); NodeTypeManager ntMgr = superuser.getWorkspace().getNodeTypeManager(); NodeType nt = ntMgr.getNodeType(testNodeType); PropertyDefinition[] propDefs = nt.getPropertyDefinitions(); for (int i = 0; i < propDefs.length; i++) { PropertyDefinition propDef = propDefs[i]; if (!propDef.isMultiple() && !propDef.getName().equals("*")) { String columnName = SELECTOR_1 + "." + propDef.getName(); assertTrue("Missing column: " + columnName, names.remove(columnName)); } } for (Iterator it = names.iterator(); it.hasNext(); ) { fail(it.next() + " is not a property on node type " + testNodeType); } return null; } }); } /** * From the spec: * <p/> * If propertyName is specified, columnName is required and used to name * the column in the tabular results. */ public void testColumnNames() throws RepositoryException { QueryObjectModel qom = qf.createQuery( qf.selector(testNodeType, SELECTOR_1), null, null, new Column[]{qf.column(SELECTOR_1, propertyName1, propertyName1)}); forQOMandSQL2(qom, new Callable() { public Object call(Query query) throws RepositoryException { QueryResult result = query.execute(); List names = new ArrayList(Arrays.asList(result.getColumnNames())); assertTrue("Missing column: " + propertyName1, names.remove(propertyName1)); for (Iterator it = names.iterator(); it.hasNext(); ) { fail(it.next() + " was not declared as a column"); } return null; } }); } public void testMultiColumn() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, TEST_VALUE); superuser.save(); final String columnName1 = SELECTOR_1 + "." + propertyName1; final String columnName2 = SELECTOR_2 + "." + propertyName1; QueryObjectModel qom = qf.createQuery( qf.join( qf.selector(testNodeType, SELECTOR_1), qf.selector(testNodeType, SELECTOR_2), QueryObjectModelConstants.JCR_JOIN_TYPE_INNER, qf.equiJoinCondition(SELECTOR_1, propertyName1, SELECTOR_2, propertyName1) ), qf.descendantNode(SELECTOR_1, testRoot), null, new Column[]{ qf.column(SELECTOR_1, propertyName1, columnName1), qf.column(SELECTOR_2, propertyName1, columnName2) } ); forQOMandSQL2(qom, new Callable() { public Object call(Query query) throws RepositoryException { RowIterator rows = query.execute().getRows(); assertTrue("empty result", rows.hasNext()); Row r = rows.nextRow(); assertEquals("unexpected value", TEST_VALUE, r.getValue(columnName1).getString()); assertEquals("unexpected value", TEST_VALUE, r.getValue(columnName2).getString()); return null; } }); } }