package com.processpuzzle.persistence.query.transformer.domain; import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.processpuzzle.commons.persistence.query.BooleanOperator; import com.processpuzzle.commons.persistence.query.BooleanOperators; import com.processpuzzle.commons.persistence.query.Count; import com.processpuzzle.commons.persistence.query.Maximum; import com.processpuzzle.commons.persistence.query.OrderSpecifier; import com.processpuzzle.commons.persistence.query.OrderingDirections; import com.processpuzzle.persistence.domain.TestEntity; import com.processpuzzle.persistence.query.domain.ComparisonOperators; import com.processpuzzle.persistence.query.domain.DateAttributeCondition; import com.processpuzzle.persistence.query.domain.DefaultQuery; import com.processpuzzle.persistence.query.domain.IntegerAttributeCondition; import com.processpuzzle.persistence.query.domain.QueryTest; import com.processpuzzle.persistence.query.domain.QueryVariable; import com.processpuzzle.persistence.query.domain.TextAttributeCondition; public class QueryTransformerTest { public static String REALLY_SIMPLE_HQL = "select testEntity from TestEntity as testEntity"; public static String REALLY_SIMPLE_SQL = "SELECT * FROM TestEntity"; public static String SIMPLE_HQL = "select testEntity.id, testEntity.name, testEntity.textAttribute, testEntity.numberAttribute, testEntity.dateAttribute from TestEntity as testEntity where (testEntity.name = 'bakfity') and (testEntity.numberAttribute >= 256)"; public static String SIMPLE_SQL = "SELECT testEntity.id, testEntity.name, testEntity.textAttribute, testEntity.numberAttribute, testEntity.dateAttribute FROM TestEntity WHERE (testEntity.name = 'bakfity') and (testEntity.numberAttribute >= 256)"; private HQLQueryTransformer hqlTransformer = null; private SQLQueryTransformer sqlTransformer = null; private DefaultQuery reallySimpleQuery = null; private DefaultQuery simpleQuery = null; private DefaultQuery fullFlaggedQuery = null; @Before public void beforeEachTests() { reallySimpleQuery = QueryTest.createReallySimpleQueryForTest(); simpleQuery = QueryTest.createSimpleQueryForTest(); fullFlaggedQuery = QueryTest.createFullFlaggedQueryForTest(); hqlTransformer = QueryTransformerFactory.createHQLQueryTransformer(); sqlTransformer = QueryTransformerFactory.createSQLQueryTransformer(); } @After public void afterEachTests() { hqlTransformer = null; sqlTransformer = null; reallySimpleQuery = null; simpleQuery = null; } @Test public void createStatement_ForImmutability() { DefaultQuery cloneOfOriginal = fullFlaggedQuery.clone(); hqlTransformer.createStatement( fullFlaggedQuery ); sqlTransformer.createStatement( fullFlaggedQuery ); assertEquals( "QueryTransformer works on a cloned query object. Given query should be immutable.", cloneOfOriginal, fullFlaggedQuery ); } @Test public void createStatement_ForHQL() { assertEquals( REALLY_SIMPLE_HQL, hqlTransformer.createStatement( reallySimpleQuery ) ); assertEquals( SIMPLE_HQL, hqlTransformer.createStatement( simpleQuery ) ); } @Test public void createStatement_ForSQL() { assertEquals( REALLY_SIMPLE_SQL, sqlTransformer.createStatement( reallySimpleQuery ) ); assertEquals( SIMPLE_SQL, sqlTransformer.createStatement( simpleQuery ) ); } @Test public void queryWithNotNull() { String HQL_WITH_NOT_NULL = "select testEntity from TestEntity as testEntity where testEntity.dateAttribute is not null"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getQueryCondition().addAttributeCondition( new DateAttributeCondition( "dateAttribute", ComparisonOperators.IS_NOT_NULL ) ); assertEquals( HQL_WITH_NOT_NULL, hqlTransformer.createStatement( query ) ); } @Test public void queryWithLike() { String HQL_WITH_LIKE = "select testEntity from TestEntity as testEntity where testEntity.textAttribute like 'bakf%'"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "textAttribute", "bakf%", ComparisonOperators.LIKE ) ); assertEquals( HQL_WITH_LIKE, hqlTransformer.createStatement( query ) ); } @Ignore @Test public void queryWithOrder() { String HQL_WITH_ORDER = "select testEntity from TestEntity as testEntity order by testEntity.name desc, testEntity.numberAttribute asc"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getQueryOrder().addOrderSpecifier( new OrderSpecifier( "numberAttribute", OrderingDirections.Ascending ) ); query.getQueryOrder().addOrderSpecifier( new OrderSpecifier( "name", OrderingDirections.Descending ) ); assertEquals( HQL_WITH_ORDER, hqlTransformer.createStatement( query ) ); } public @Test void queryWithMaxAggregateFunction() { String HQL_WITH_MAX_AGGREGATE = "select max( testEntity.numberAttribute ) from TestEntity as testEntity"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getAttributeFilter().addAggregateFunction( new Maximum( "numberAttribute" ) ); assertEquals( HQL_WITH_MAX_AGGREGATE, hqlTransformer.createStatement( query ) ); } public @Test void queryWithCountAggregateFunction() { String HQL_WITH_MAX_AGGREGATE = "select count( testEntity.name ) from TestEntity as testEntity"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getAttributeFilter().addAggregateFunction( new Count( "name" ) ); assertEquals( HQL_WITH_MAX_AGGREGATE, hqlTransformer.createStatement( query ) ); } @Test public void testQueryWithContext() { String HQL_WITH_CONTEXT = "select testEntity from TestEntity as testEntity where (testEntity.name = 'bakfity') and (testEntity.numberAttribute >= 256)"; DefaultQuery query = new DefaultQuery( TestEntity.class ); query.getQueryCondition() .addAttributeCondition( new IntegerAttributeCondition( "numberAttribute", new QueryVariable( "numberValue" ), ComparisonOperators.GREATER_OR_EQUAL_TO ) ); query.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "name", new QueryVariable( "nameValue" ), ComparisonOperators.EQUAL_TO ) ); query.getQueryCondition().addBooleanOperator( new BooleanOperator( BooleanOperators.AND ) ); query.getQueryContext().addTextValueFor( "nameValue", "bakfity" ); query.getQueryContext().addIntegerValueFor( "numberValue", 256 ); assertEquals( HQL_WITH_CONTEXT, hqlTransformer.createStatement( query ) ); } }