/* * 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.Calendar; import java.math.BigDecimal; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.PropertyType; import javax.jcr.query.Query; import javax.jcr.query.qom.QueryObjectModelConstants; import org.apache.jackrabbit.test.NotExecutableException; /** * <code>BindVariableValueTest</code>... */ public class BindVariableValueTest extends AbstractQOMTest { private static final String STRING_VALUE = "JSR"; private static final long LONG_VALUE = 283; private static final double DOUBLE_VALUE = Math.PI; private static final boolean BOOLEAN_VALUE = true; private static final Calendar DATE_VALUE = Calendar.getInstance(); private static final BigDecimal DECIMAL_VALUE = new BigDecimal(LONG_VALUE); private static final String URI_VALUE = "http://example.com/"; private Query qomQuery; private Query sqlQuery; protected void setUp() throws Exception { super.setUp(); qomQuery = qf.createQuery( qf.selector(testNodeType, "s"), qf.and( qf.childNode("s", testRoot), qf.comparison( qf.propertyValue("s", propertyName1), QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, qf.bindVariable("v") ) ), null, null); sqlQuery = qm.createQuery(qomQuery.getStatement(), Query.JCR_SQL2); } protected void tearDown() throws Exception { qomQuery = null; super.tearDown(); } public void testBindVariableNames() throws RepositoryException { String[] names = qomQuery.getBindVariableNames(); assertNotNull(names); assertEquals(1, names.length); assertEquals("v", names[0]); } public void testIllegalArgumentException() throws RepositoryException { try { bindVariableValue(qomQuery, "x", vf.createValue(STRING_VALUE)); fail("Query.bindValue() must throw IllegalArgumentException for unknown variable name"); } catch (IllegalArgumentException e) { // expected } try { bindVariableValue(sqlQuery, "x", vf.createValue(STRING_VALUE)); fail("Query.bindValue() must throw IllegalArgumentException for unknown variable name"); } catch (IllegalArgumentException e) { // expected } } public void testString() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, STRING_VALUE); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(STRING_VALUE)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(STRING_VALUE)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testDate() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, DATE_VALUE); superuser.save(); bindVariableValue(sqlQuery, "v", vf.createValue(DATE_VALUE)); checkResult(sqlQuery.execute(), new Node[]{n}); bindVariableValue(qomQuery, "v", vf.createValue(DATE_VALUE)); checkResult(qomQuery.execute(), new Node[]{n}); } public void testLong() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, LONG_VALUE); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(LONG_VALUE)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(LONG_VALUE)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testDouble() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, DOUBLE_VALUE); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(DOUBLE_VALUE)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(DOUBLE_VALUE)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testBoolean() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, BOOLEAN_VALUE); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(BOOLEAN_VALUE)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(BOOLEAN_VALUE)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testName() throws RepositoryException { Value name = vf.createValue(STRING_VALUE, PropertyType.NAME); Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, name); superuser.save(); bindVariableValue(qomQuery, "v", name); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", name); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testPath() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType); Value path = vf.createValue(n.getPath(), PropertyType.PATH); n.setProperty(propertyName1, path); superuser.save(); bindVariableValue(qomQuery, "v", path); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", path); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testReference() throws RepositoryException, NotExecutableException { Node n = testRootNode.addNode(nodeName1, testNodeType); superuser.save(); ensureMixinType(n, mixReferenceable); superuser.save(); n.setProperty(propertyName1, n); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(n)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(n)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testWeakReference() throws RepositoryException, NotExecutableException { Node n = testRootNode.addNode(nodeName1, testNodeType); superuser.save(); ensureMixinType(n, mixReferenceable); superuser.save(); n.setProperty(propertyName1, vf.createValue(n, true)); superuser.save(); bindVariableValue(qomQuery, "v", vf.createValue(n, true)); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", vf.createValue(n, true)); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testURI() throws RepositoryException { Value value = vf.createValue(URI_VALUE, PropertyType.URI); Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, value); superuser.save(); bindVariableValue(qomQuery, "v", value); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", value); checkResult(sqlQuery.execute(), new Node[]{n}); } public void testDecimal() throws RepositoryException { Value value = vf.createValue(DECIMAL_VALUE); Node n = testRootNode.addNode(nodeName1, testNodeType); n.setProperty(propertyName1, value); superuser.save(); bindVariableValue(qomQuery, "v", value); checkResult(qomQuery.execute(), new Node[]{n}); bindVariableValue(sqlQuery, "v", value); checkResult(sqlQuery.execute(), new Node[]{n}); } }