/** * AnalyzerBeans * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program 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 this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.eobjects.analyzer.beans.filter; import junit.framework.TestCase; import org.eobjects.analyzer.connection.Datastore; import org.eobjects.analyzer.connection.DatastoreConnection; import org.eobjects.analyzer.data.InputColumn; import org.eobjects.analyzer.data.MetaModelInputColumn; import org.eobjects.analyzer.data.MockInputColumn; import org.eobjects.analyzer.test.TestHelper; import org.apache.metamodel.query.Query; import org.apache.metamodel.schema.Column; public class EqualsFilterTest extends TestCase { private Datastore datastore = TestHelper.createSampleDatabaseDatastore("ds"); public void testSingleString() throws Exception { EqualsFilter f = new EqualsFilter(new String[] { "hello" }, new MockInputColumn<String>("col", String.class)); assertEquals(ValidationCategory.VALID, f.filter("hello")); assertEquals(ValidationCategory.INVALID, f.filter("Hello")); assertEquals(ValidationCategory.INVALID, f.filter("")); assertEquals(ValidationCategory.INVALID, f.filter(null)); } public void testSingleNumber() throws Exception { EqualsFilter f = new EqualsFilter(new String[] { "1234" }, new MockInputColumn<Number>("col", Number.class)); assertEquals(ValidationCategory.VALID, f.filter(1234)); assertEquals(ValidationCategory.VALID, f.filter(1234.0)); assertEquals(ValidationCategory.INVALID, f.filter(2)); assertEquals(ValidationCategory.INVALID, f.filter(-2)); } public void testMultipleStrings() throws Exception { EqualsFilter f = new EqualsFilter(new String[] { "hello", "Hello", "World" }, new MockInputColumn<String>( "col", String.class)); assertEquals(ValidationCategory.VALID, f.filter("hello")); assertEquals(ValidationCategory.VALID, f.filter("Hello")); assertEquals(ValidationCategory.INVALID, f.filter("")); assertEquals(ValidationCategory.INVALID, f.filter("world")); assertEquals(ValidationCategory.INVALID, f.filter(null)); } public void testCompareValueColumnNumbers() throws Exception { EqualsFilter f = new EqualsFilter(new MockInputColumn<Object>("col1", Number.class), new MockInputColumn<Object>("col2", Object.class)); assertEquals(ValidationCategory.VALID, f.filter(1234, 1234)); assertEquals(ValidationCategory.VALID, f.filter(1234.0, 1234)); assertEquals(ValidationCategory.VALID, f.filter(1235, "1235")); assertEquals(ValidationCategory.VALID, f.filter(1235, "1235.0")); assertEquals(ValidationCategory.INVALID, f.filter(2, 3)); assertEquals(ValidationCategory.INVALID, f.filter(-2, "2000")); } public void testCompareValueColumnStrings() throws Exception { EqualsFilter f = new EqualsFilter(new MockInputColumn<Object>("col1", String.class), new MockInputColumn<Object>("col2", Object.class)); assertEquals(ValidationCategory.VALID, f.filter("foo", "foo")); assertEquals(ValidationCategory.INVALID, f.filter("foo", "bar")); } public void testNonOptimizeableQuery() throws Exception { DatastoreConnection con = datastore.openConnection(); Column column1 = con.getSchemaNavigator().convertToColumn("PUBLIC.EMPLOYEES.FIRSTNAME"); Column column2 = con.getSchemaNavigator().convertToColumn("PUBLIC.EMPLOYEES.LASTNAME"); InputColumn<?> inputColumn1 = new MetaModelInputColumn(column1); InputColumn<?> inputColumn2 = new MetaModelInputColumn(column2); EqualsFilter filter = new EqualsFilter(inputColumn1, inputColumn2); filter.setValues(new String[] { "foobar" }); assertFalse(filter.isOptimizable(ValidationCategory.VALID)); assertFalse(filter.isOptimizable(ValidationCategory.INVALID)); } public void testOptimizeQueryValueColumn() throws Exception { DatastoreConnection con = datastore.openConnection(); Column column1 = con.getSchemaNavigator().convertToColumn("PUBLIC.EMPLOYEES.FIRSTNAME"); Column column2 = con.getSchemaNavigator().convertToColumn("PUBLIC.EMPLOYEES.LASTNAME"); InputColumn<?> inputColumn1 = new MetaModelInputColumn(column1); InputColumn<?> inputColumn2 = new MetaModelInputColumn(column2); EqualsFilter filter = new EqualsFilter(inputColumn1, inputColumn2); assertTrue(filter.isOptimizable(ValidationCategory.VALID)); assertTrue(filter.isOptimizable(ValidationCategory.INVALID)); Query query = con.getDataContext().query().from(column1.getTable()).select(column1, column2).toQuery(); String originalSql = query.toSql(); assertEquals("SELECT \"EMPLOYEES\".\"FIRSTNAME\", \"EMPLOYEES\".\"LASTNAME\" FROM PUBLIC.\"EMPLOYEES\"", originalSql); Query result; result = filter.optimizeQuery(query.clone(), ValidationCategory.VALID); assertEquals(originalSql + " WHERE \"EMPLOYEES\".\"FIRSTNAME\" = \"EMPLOYEES\".\"LASTNAME\"", result.toSql()); result = filter.optimizeQuery(query.clone(), ValidationCategory.INVALID); assertEquals(originalSql + " WHERE \"EMPLOYEES\".\"FIRSTNAME\" <> \"EMPLOYEES\".\"LASTNAME\"", result.toSql()); con.close(); } public void testOptimizeQueryValuesArray() throws Exception { DatastoreConnection con = datastore.openConnection(); Column column = con.getSchemaNavigator().convertToColumn("PUBLIC.EMPLOYEES.FIRSTNAME"); InputColumn<?> inputColumn = new MetaModelInputColumn(column); EqualsFilter filter = new EqualsFilter(new String[] { "foobar" }, inputColumn); assertTrue(filter.isOptimizable(ValidationCategory.VALID)); assertTrue(filter.isOptimizable(ValidationCategory.INVALID)); Query query = con.getDataContext().query().from(column.getTable()).select(column).toQuery(); String originalSql = query.toSql(); assertEquals("SELECT \"EMPLOYEES\".\"FIRSTNAME\" FROM PUBLIC.\"EMPLOYEES\"", originalSql); Query result; result = filter.optimizeQuery(query.clone(), ValidationCategory.VALID); assertEquals(originalSql + " WHERE (\"EMPLOYEES\".\"FIRSTNAME\" = 'foobar')", result.toSql()); result = filter.optimizeQuery(query.clone(), ValidationCategory.INVALID); assertEquals(originalSql + " WHERE \"EMPLOYEES\".\"FIRSTNAME\" <> 'foobar'", result.toSql()); con.close(); } }