/* * Copyright 2010, Andrew M Gibson * * www.andygibson.net * * This file is part of DataValve. * * DataValve is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * DataValve is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * * You should have received a copy of the GNU Lesser General Public License * along with DataValve. If not, see <http://www.gnu.org/licenses/>. * */ package org.fluttercode.datavalve.provider; import org.fluttercode.datavalve.provider.util.DataQuery; import org.fluttercode.datavalve.provider.util.DataQueryBuilder; import junit.framework.TestCase; /** * @author Andy Gibson * */ public class DataQueryBuilderTest extends TestCase { protected DataQueryBuilder builder; protected DummyDataProvider<Object> provider; @Override protected void setUp() throws Exception { super.setUp(); builder = new DataQueryBuilder(); builder.setBaseStatement("select x from y"); provider = new DummyDataProvider<Object>(); builder.setProvider(provider); } public void testParameterizedStatement() { DataQuery query = builder.build(); assertEquals("select x from y", query.getStatement()); } public void testParameterizedStatementWithWhere() { builder.setBaseStatement("select x from y where a = b"); DataQuery query = builder.build(); assertEquals("select x from y where a = b", query.getStatement()); } public void testParameterizedStatementWithParam() { builder.setBaseStatement("select x from y where a = :VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y where a = :param_0", query.getStatement()); assertEquals(1, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertFalse(query.getParameters().get(0).isNull()); assertEquals(new Long(1), query.getParameters().get(0).getValue()); } public void testQueryBuilderWithRestriction() { provider.addRestriction("a=b"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=b", query.getStatement()); assertEquals(0, query.getParameters().size()); } public void testQueryBuilderWithParameterizedRestriction() { provider.addRestriction("a=b"); provider.addRestriction("v=:VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=b AND v=:param_0", query .getStatement()); assertEquals(1, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals(1l, query.getParameters().get(0).getValue()); } public void testQueryBuilderWithParameterizedNullRestriction() { provider.addRestriction("a=b"); provider.addRestriction("v=:NULL"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=b", query.getStatement()); assertEquals(0, query.getParameters().size()); } public void testQueryBuilderWithParameterizedAllowedNullRestriction() { provider.addRestriction("a=b"); provider.addRestriction("v=:NULL"); builder.setAllowNullParameters(true); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=b AND v=:param_0", query .getStatement()); assertEquals(1, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertNull(query.getParameters().get(0).getValue()); } public void testStatementWithNullParameter() { // check we allow null parameters in the base statement builder.setAllowNullParameters(true); builder.setBaseStatement("select x from y where d = :NULL"); DataQuery query = builder.build(); assertEquals("select x from y where d = :param_0", query.getStatement()); assertEquals(1, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertNull(query.getParameters().get(0).getValue()); } public void testDuplicateParameter() { builder .setBaseStatement("select x from y where d = :VALUE1 and e = :VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y where d = :param_0 and e = :param_1", query.getStatement()); assertEquals(2, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals(1l, query.getParameters().get(0).getValue()); assertEquals("param_1", query.getParameters().get(1).getName()); assertEquals(1l, query.getParameters().get(1).getValue()); } public void testDuplicateParameterInRestrictions() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=:VALUE1"); provider.addRestriction("b=:VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=:param_0 AND b=:param_1", query .getStatement()); assertEquals(2, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals(1l, query.getParameters().get(0).getValue()); assertEquals("param_1", query.getParameters().get(1).getName()); assertEquals(1l, query.getParameters().get(1).getValue()); } public void testElParameter() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=#{id}"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=:param_0", query.getStatement()); assertEquals(1, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals(99, query.getParameters().get(0).getValue()); } public void testDuplicateElParameter() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=#{id}"); provider.addRestriction("b=#{id}"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=:param_0 AND b=:param_1", query .getStatement()); assertEquals(2, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals(99, query.getParameters().get(0).getValue()); assertEquals("param_1", query.getParameters().get(1).getName()); assertEquals(99, query.getParameters().get(1).getValue()); } public void testOrderingDefaultAsc() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=#{id}"); provider.addRestriction("b=#{id}"); builder.setOrderBy("y.a,y.b"); DataQuery query = builder.build(); assertEquals( "select x from y WHERE a=:param_0 AND b=:param_1 ORDER BY y.a ASC, y.b ASC", query.getStatement()); } public void testOrderingDescending() { builder.setBaseStatement("select x from y"); builder.setOrderAscending(false); provider.addRestriction("a=#{id}"); provider.addRestriction("b=#{id}"); builder.setOrderBy("y.a,y.b"); DataQuery query = builder.build(); assertEquals( "select x from y WHERE a=:param_0 AND b=:param_1 ORDER BY y.a DESC, y.b DESC", query.getStatement()); } public void testSelectSubQUery() { builder .setBaseStatement("select x,(select count from o where o.id = :VALUE1 and o.y = y.id) from y"); provider.addRestriction("a=:VALUE2"); provider.addRestriction("b=#{id}"); DataQuery query = builder.build(); assertEquals( "select x,(select count from o where o.id = :param_0 and o.y = y.id) from y WHERE a=:param_1 AND b=:param_2", query.getStatement()); assertEquals(3, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals("param_1", query.getParameters().get(1).getName()); assertEquals("param_2", query.getParameters().get(2).getName()); assertEquals(1l, query.getParameters().get(0).getValue()); assertEquals(2l, query.getParameters().get(1).getValue()); assertEquals(99, query.getParameters().get(2).getValue()); } public void testSelectSubQUeryNullParam() { builder .setBaseStatement("select x,(select count from o where o.id = :NULL and o.y = y.id) from y"); provider.addRestriction("a=:VALUE2"); provider.addRestriction("b=#{id}"); DataQuery query = builder.build(); assertEquals( "select x,(select count from o where o.id = :param_0 and o.y = y.id) from y WHERE a=:param_1 AND b=:param_2", query.getStatement()); assertEquals(3, query.getParameters().size()); assertEquals("param_0", query.getParameters().get(0).getName()); assertEquals("param_1", query.getParameters().get(1).getName()); assertEquals("param_2", query.getParameters().get(2).getName()); assertNull(query.getParameters().get(0).getValue()); assertEquals(2l, query.getParameters().get(1).getValue()); assertEquals(99, query.getParameters().get(2).getValue()); } public void testManuallyJoinedRestrictions() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=:VALUE2"); provider.addRestriction("OR b=:VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=:param_0 OR b=:param_1", query .getStatement()); } public void testManuallyAddedParameters() { builder.setBaseStatement("select x from y"); provider.addRestriction("a=:VALUE2"); provider.addRestriction("OR b=:VALUE1"); DataQuery query = builder.build(); assertEquals("select x from y WHERE a=:param_0 OR b=:param_1", query .getStatement()); } }