You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/03/13 12:04:37 UTC

svn commit: r1577108 [2/2] - in /cayenne/main/trunk/cayenne-server/src: main/java/org/apache/cayenne/access/jdbc/ main/java/org/apache/cayenne/access/trans/ main/java/org/apache/cayenne/dba/db2/ main/java/org/apache/cayenne/dba/frontbase/ main/java/org...

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/SelectTranslatorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/SelectTranslatorTest.java?rev=1577108&r1=1577107&r2=1577108&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/SelectTranslatorTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/SelectTranslatorTest.java Thu Mar 13 11:04:36 2014
@@ -20,13 +20,12 @@
 package org.apache.cayenne.access.trans;
 
 import java.sql.Connection;
-import java.sql.SQLException;
 import java.util.Date;
 import java.util.List;
 
 import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
@@ -35,7 +34,6 @@ import org.apache.cayenne.log.JdbcEventL
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.test.jdbc.DBHelper;
@@ -58,17 +56,19 @@ public class SelectTranslatorTest extend
     private DataContext context;
 
     @Inject
-    private DbAdapter adapter;
-    
-    @Inject
     private UnitDbAdapter unitAdapter;
 
     @Inject
     private DBHelper dbHelper;
-    
+
     @Inject
     private JdbcEventLogger logger;
 
+    @Inject
+    private DataNode dataNode;
+
+    private Connection connection;
+
     @Override
     protected void setUpAfterInjection() throws Exception {
         dbHelper.deleteAll("PAINTING_INFO");
@@ -76,6 +76,13 @@ public class SelectTranslatorTest extend
         dbHelper.deleteAll("ARTIST_EXHIBIT");
         dbHelper.deleteAll("ARTIST_GROUP");
         dbHelper.deleteAll("ARTIST");
+
+        this.connection = dataSourceFactory.getSharedDataSource().getConnection();
+    }
+
+    @Override
+    protected void tearDownBeforeInjection() throws Exception {
+        connection.close();
     }
 
     /**
@@ -83,29 +90,17 @@ public class SelectTranslatorTest extend
      */
     public void testCreateSqlString1() throws Exception {
         // query with qualifier and ordering
-        SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.likeExp(
-                "artistName",
-                "a%"));
+        SelectQuery<Artist> q = new SelectQuery<Artist>(Artist.class, ExpressionFactory.likeExp("artistName", "a%"));
         q.addOrdering("dateOfBirth", SortOrder.ASCENDING);
 
-        Template test = new Template() {
-
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
-
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT "));
-                assertTrue(generatedSql.indexOf(" FROM ") > 0);
-                assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql
-                        .indexOf(" FROM "));
-                assertTrue(generatedSql.indexOf(" ORDER BY ") > generatedSql
-                        .indexOf(" WHERE "));
-            }
-        };
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-        test.test(q);
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT "));
+        assertTrue(generatedSql.indexOf(" FROM ") > 0);
+        assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql.indexOf(" FROM "));
+        assertTrue(generatedSql.indexOf(" ORDER BY ") > generatedSql.indexOf(" WHERE "));
     }
 
     /**
@@ -113,66 +108,136 @@ public class SelectTranslatorTest extend
      */
     public void testDbEntityQualifier() throws Exception {
 
-        SelectQuery q = new SelectQuery(Artist.class);
+        SelectQuery<Artist> q = new SelectQuery<Artist>(Artist.class);
         final DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
-        final DbEntity middleEntity = context.getEntityResolver().getDbEntity(
-                "ARTIST_GROUP");
+        final DbEntity middleEntity = context.getEntityResolver().getDbEntity("ARTIST_GROUP");
+
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
+
+        entity.setQualifier(Expression.fromString("ARTIST_NAME = \"123\""));
+        middleEntity.setQualifier(Expression.fromString("GROUP_ID = 1987"));
+
+        try {
+
+            String generatedSql = transl.createSqlString();
+
+            // do some simple assertions to make sure all parts are in
+            assertNotNull(generatedSql);
+            assertTrue(generatedSql.startsWith("SELECT "));
+            assertTrue(generatedSql.indexOf(" FROM ") > 0);
+            if (generatedSql.contains("RTRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("RTRIM("));
+            } else if (generatedSql.contains("TRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("TRIM("));
+            } else {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME = ") > 0);
+            }
+        } finally {
+            entity.setQualifier(null);
+            middleEntity.setQualifier(null);
+        }
+    }
+
+    public void testDbEntityQualifier_OuterJoin() throws Exception {
+
+        SelectQuery q = new SelectQuery(Painting.class);
+        q.addOrdering("toArtist+.artistName", SortOrder.ASCENDING);
+
+        final DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
+        final DbEntity middleEntity = context.getEntityResolver().getDbEntity("ARTIST_GROUP");
+
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
+
         entity.setQualifier(Expression.fromString("ARTIST_NAME = \"123\""));
         middleEntity.setQualifier(Expression.fromString("GROUP_ID = 1987"));
 
         try {
-            Template test = new Template() {
 
-                @Override
-                void test(SelectTranslator transl) throws Exception {
-                    String generatedSql = transl.createSqlString();
-
-                    // do some simple assertions to make sure all parts are in
-                    assertNotNull(generatedSql);
-                    assertTrue(generatedSql.startsWith("SELECT "));
-                    assertTrue(generatedSql.indexOf(" FROM ") > 0);
-                    if (generatedSql.contains("RTRIM")) {
-                        assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql
-                                .indexOf("RTRIM("));
-                    } else if (generatedSql.contains("TRIM")) {
-                        assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql
-                                .indexOf("TRIM("));
-                    } else {
-                        assertTrue(generatedSql.indexOf("ARTIST_NAME = ") > 0);
-                    }
-                }
-            };
-
-            test.test(q);
-            context.performQuery(q);
-
-            // testing outer join!!
-            q = new SelectQuery(Painting.class);
-            q.addOrdering("toArtist+.artistName", SortOrder.ASCENDING);
-            test.test(q);
-            context.performQuery(q);
-
-            // testing quering from related table
-            q = new SelectQuery(Painting.class, ExpressionFactory.matchExp(
-                    "toArtist.artistName",
-                    "foo"));
-            test.test(q);
-            context.performQuery(q);
-
-            // testing flattened rels
-            q = new SelectQuery(Artist.class, ExpressionFactory.matchExp(
-                    "groupArray.name",
-                    "bar"));
-            new Template() {
-
-                @Override
-                void test(SelectTranslator transl) throws Exception {
-                    assertTrue(transl.createSqlString().indexOf("GROUP_ID = ") > 0);
-                }
-            }.test(q);
-            context.performQuery(q);
+            String generatedSql = transl.createSqlString();
+
+            // do some simple assertions to make sure all parts are in
+            assertNotNull(generatedSql);
+            assertTrue(generatedSql.startsWith("SELECT "));
+            assertTrue(generatedSql.indexOf(" FROM ") > 0);
+            if (generatedSql.contains("RTRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("RTRIM("));
+            } else if (generatedSql.contains("TRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("TRIM("));
+            } else {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME = ") > 0);
+            }
+
+        } finally {
+            entity.setQualifier(null);
+            middleEntity.setQualifier(null);
         }
-        finally {
+    }
+
+    public void testDbEntityQualifier_FlattenedRel() throws Exception {
+
+        SelectQuery<Artist> q = new SelectQuery<Artist>(Artist.class, ExpressionFactory.matchExp("groupArray.name",
+                "bar"));
+
+        final DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
+        final DbEntity middleEntity = context.getEntityResolver().getDbEntity("ARTIST_GROUP");
+
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
+
+        entity.setQualifier(Expression.fromString("ARTIST_NAME = \"123\""));
+        middleEntity.setQualifier(Expression.fromString("GROUP_ID = 1987"));
+
+        try {
+
+            String generatedSql = transl.createSqlString();
+
+            // do some simple assertions to make sure all parts are in
+            assertNotNull(generatedSql);
+            assertTrue(generatedSql.startsWith("SELECT "));
+            assertTrue(generatedSql.indexOf(" FROM ") > 0);
+            if (generatedSql.contains("RTRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("RTRIM("));
+            } else if (generatedSql.contains("TRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("TRIM("));
+            } else {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME = ") > 0);
+            }
+
+        } finally {
+            entity.setQualifier(null);
+            middleEntity.setQualifier(null);
+        }
+    }
+
+    public void testDbEntityQualifier_RelatedMatch() throws Exception {
+
+        SelectQuery<Artist> q = new SelectQuery(Painting.class,
+                ExpressionFactory.matchExp("toArtist.artistName", "foo"));
+
+        final DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
+        final DbEntity middleEntity = context.getEntityResolver().getDbEntity("ARTIST_GROUP");
+
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
+
+        entity.setQualifier(Expression.fromString("ARTIST_NAME = \"123\""));
+        middleEntity.setQualifier(Expression.fromString("GROUP_ID = 1987"));
+
+        try {
+
+            String generatedSql = transl.createSqlString();
+
+            // do some simple assertions to make sure all parts are in
+            assertNotNull(generatedSql);
+            assertTrue(generatedSql.startsWith("SELECT "));
+            assertTrue(generatedSql.indexOf(" FROM ") > 0);
+            if (generatedSql.contains("RTRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("RTRIM("));
+            } else if (generatedSql.contains("TRIM")) {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME) = ") > generatedSql.indexOf("TRIM("));
+            } else {
+                assertTrue(generatedSql.indexOf("ARTIST_NAME = ") > 0);
+            }
+
+        } finally {
             entity.setQualifier(null);
             middleEntity.setQualifier(null);
         }
@@ -186,19 +251,11 @@ public class SelectTranslatorTest extend
         SelectQuery q = new SelectQuery(Artist.class);
         q.setDistinct(true);
 
-        Template test = new Template() {
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
-
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT DISTINCT"));
-            }
-        };
-
-        test.test(q);
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT DISTINCT"));
     }
 
     /**
@@ -210,39 +267,25 @@ public class SelectTranslatorTest extend
         // query with qualifier and ordering
         SelectQuery q = new SelectQuery(ArtistExhibit.class);
         q.setQualifier(ExpressionFactory.likeExp("toArtist.artistName", "a%"));
-        q.andQualifier(ExpressionFactory.likeExp(
-                "toExhibit.toGallery.paintingArray.toArtist.artistName",
-                "a%"));
-
-        Template test = new Template() {
-
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
-                // logObj.warn("Query: " + generatedSql);
-
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT "));
-                assertTrue(generatedSql.indexOf(" FROM ") > 0);
-                assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql
-                        .indexOf(" FROM "));
-
-                // check that there are 2 distinct aliases for the ARTIST table
-                int ind1 = generatedSql.indexOf("ARTIST t", generatedSql
-                        .indexOf(" FROM "));
-                assertTrue(ind1 > 0);
+        q.andQualifier(ExpressionFactory.likeExp("toExhibit.toGallery.paintingArray.toArtist.artistName", "a%"));
 
-                int ind2 = generatedSql.indexOf("ARTIST t", ind1 + 1);
-                assertTrue(ind2 > 0);
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
+        // logObj.warn("Query: " + generatedSql);
 
-                assertTrue(generatedSql.charAt(ind1 + "ARTIST t".length()) != generatedSql
-                        .charAt(ind2 + "ARTIST t".length()));
-            }
-        };
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT "));
+        assertTrue(generatedSql.indexOf(" FROM ") > 0);
+        assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql.indexOf(" FROM "));
+
+        // check that there are 2 distinct aliases for the ARTIST table
+        int ind1 = generatedSql.indexOf("ARTIST t", generatedSql.indexOf(" FROM "));
+        assertTrue(ind1 > 0);
 
-        test.test(q);
+        int ind2 = generatedSql.indexOf("ARTIST t", ind1 + 1);
+        assertTrue(ind2 > 0);
 
+        assertTrue(generatedSql.charAt(ind1 + "ARTIST t".length()) != generatedSql.charAt(ind2 + "ARTIST t".length()));
     }
 
     /**
@@ -254,77 +297,59 @@ public class SelectTranslatorTest extend
         // query with qualifier and ordering
         SelectQuery q = new SelectQuery(ArtistExhibit.class);
         q.setQualifier(ExpressionFactory.likeExp("toArtist.artistName", "a%"));
-        q.andQualifier(ExpressionFactory.likeExp(
-                "toArtist.paintingArray.paintingTitle",
-                "p%"));
-
-        Template test = new Template() {
-
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
-
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT "));
-                assertTrue(generatedSql.indexOf(" FROM ") > 0);
-                assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql
-                        .indexOf(" FROM "));
-
-                // check that there is only one distinct alias for the ARTIST table
-                int ind1 = generatedSql.indexOf("ARTIST t", generatedSql
-                        .indexOf(" FROM "));
-                assertTrue(ind1 > 0);
+        q.andQualifier(ExpressionFactory.likeExp("toArtist.paintingArray.paintingTitle", "p%"));
 
-                int ind2 = generatedSql.indexOf("ARTIST t", ind1 + 1);
-                assertTrue(generatedSql, ind2 < 0);
-            }
-        };
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
+
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT "));
+        assertTrue(generatedSql.indexOf(" FROM ") > 0);
+        assertTrue(generatedSql.indexOf(" WHERE ") > generatedSql.indexOf(" FROM "));
+
+        // check that there is only one distinct alias for the ARTIST
+        // table
+        int ind1 = generatedSql.indexOf("ARTIST t", generatedSql.indexOf(" FROM "));
+        assertTrue(ind1 > 0);
 
-        test.test(q);
+        int ind2 = generatedSql.indexOf("ARTIST t", ind1 + 1);
+        assertTrue(generatedSql, ind2 < 0);
     }
 
     /**
-     * Test query when qualifying on the same attribute more than once. Check translation
-     * "Artist.dateOfBirth > ? AND Artist.dateOfBirth < ?".
+     * Test query when qualifying on the same attribute more than once. Check
+     * translation "Artist.dateOfBirth > ? AND Artist.dateOfBirth < ?".
      */
     public void testCreateSqlString7() throws Exception {
         SelectQuery q = new SelectQuery(Artist.class);
         q.setQualifier(ExpressionFactory.greaterExp("dateOfBirth", new Date()));
         q.andQualifier(ExpressionFactory.lessExp("dateOfBirth", new Date()));
 
-        Template test = new Template() {
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
+        // logObj.warn("Query: " + generatedSql);
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
-                // logObj.warn("Query: " + generatedSql);
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT "));
 
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT "));
+        int i1 = generatedSql.indexOf(" FROM ");
+        assertTrue(i1 > 0);
 
-                int i1 = generatedSql.indexOf(" FROM ");
-                assertTrue(i1 > 0);
+        int i2 = generatedSql.indexOf(" WHERE ");
+        assertTrue(i2 > i1);
 
-                int i2 = generatedSql.indexOf(" WHERE ");
-                assertTrue(i2 > i1);
+        int i3 = generatedSql.indexOf("DATE_OF_BIRTH", i2 + 1);
+        assertTrue(i3 > i2);
 
-                int i3 = generatedSql.indexOf("DATE_OF_BIRTH", i2 + 1);
-                assertTrue(i3 > i2);
-
-                int i4 = generatedSql.indexOf("DATE_OF_BIRTH", i3 + 1);
-                assertTrue("No second DOB comparison: " + i4 + ", " + i3, i4 > i3);
-            }
-        };
-
-        test.test(q);
+        int i4 = generatedSql.indexOf("DATE_OF_BIRTH", i3 + 1);
+        assertTrue("No second DOB comparison: " + i4 + ", " + i3, i4 > i3);
     }
 
     /**
-     * Test query when qualifying on the same attribute accessed over relationship, more
-     * than once. Check translation "Painting.toArtist.dateOfBirth > ? AND
-     * Painting.toArtist.dateOfBirth < ?".
+     * Test query when qualifying on the same attribute accessed over
+     * relationship, more than once. Check translation
+     * "Painting.toArtist.dateOfBirth > ? AND Painting.toArtist.dateOfBirth <
+     * ?".
      */
     public void testCreateSqlString8() throws Exception {
         SelectQuery q = new SelectQuery();
@@ -332,199 +357,145 @@ public class SelectTranslatorTest extend
         q.setQualifier(ExpressionFactory.greaterExp("toArtist.dateOfBirth", new Date()));
         q.andQualifier(ExpressionFactory.lessExp("toArtist.dateOfBirth", new Date()));
 
-        Template test = new Template() {
-
-            @Override
-            void test(SelectTranslator transl) throws Exception {
-                String generatedSql = transl.createSqlString();
+        String generatedSql = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(generatedSql);
-                assertTrue(generatedSql.startsWith("SELECT "));
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(generatedSql);
+        assertTrue(generatedSql.startsWith("SELECT "));
 
-                int i1 = generatedSql.indexOf(" FROM ");
-                assertTrue(i1 > 0);
+        int i1 = generatedSql.indexOf(" FROM ");
+        assertTrue(i1 > 0);
 
-                int i2 = generatedSql.indexOf(" WHERE ");
-                assertTrue(i2 > i1);
+        int i2 = generatedSql.indexOf(" WHERE ");
+        assertTrue(i2 > i1);
 
-                int i3 = generatedSql.indexOf("DATE_OF_BIRTH", i2 + 1);
-                assertTrue(i3 > i2);
-
-                int i4 = generatedSql.indexOf("DATE_OF_BIRTH", i3 + 1);
-                assertTrue("No second DOB comparison: " + i4 + ", " + i3, i4 > i3);
-            }
-        };
+        int i3 = generatedSql.indexOf("DATE_OF_BIRTH", i2 + 1);
+        assertTrue(i3 > i2);
 
-        test.test(q);
+        int i4 = generatedSql.indexOf("DATE_OF_BIRTH", i3 + 1);
+        assertTrue("No second DOB comparison: " + i4 + ", " + i3, i4 > i3);
     }
 
     public void testCreateSqlString9() throws Exception {
         // query for a compound ObjEntity with qualifier
-        SelectQuery q = new SelectQuery(CompoundPainting.class, ExpressionFactory
-                .likeExp("artistName", "a%"));
+        SelectQuery q = new SelectQuery(CompoundPainting.class, ExpressionFactory.likeExp("artistName", "a%"));
 
-        Template test = new Template() {
+        String sql = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
+        // do some simple assertions to make sure all parts are in
+        assertNotNull(sql);
+        assertTrue(sql.startsWith("SELECT "));
 
-                String sql = transl.createSqlString();
+        int i1 = sql.indexOf(" FROM ");
+        assertTrue(i1 > 0);
 
-                // do some simple assertions to make sure all parts are in
-                assertNotNull(sql);
-                assertTrue(sql.startsWith("SELECT "));
+        int i2 = sql.indexOf("PAINTING");
+        assertTrue(i2 > 0);
 
-                int i1 = sql.indexOf(" FROM ");
-                assertTrue(i1 > 0);
+        int i3 = sql.indexOf("ARTIST");
+        assertTrue(i3 > 0);
 
-                int i2 = sql.indexOf("PAINTING");
-                assertTrue(i2 > 0);
+        int i4 = sql.indexOf("GALLERY");
+        assertTrue(i4 > 0);
 
-                int i3 = sql.indexOf("ARTIST");
-                assertTrue(i3 > 0);
+        int i5 = sql.indexOf("PAINTING_INFO");
+        assertTrue(i5 > 0);
 
-                int i4 = sql.indexOf("GALLERY");
-                assertTrue(i4 > 0);
+        int i6 = sql.indexOf("ARTIST_NAME");
+        assertTrue(i6 > 0);
 
-                int i5 = sql.indexOf("PAINTING_INFO");
-                assertTrue(i5 > 0);
+        int i7 = sql.indexOf("ESTIMATED_PRICE");
+        assertTrue(i7 > 0);
 
-                int i6 = sql.indexOf("ARTIST_NAME");
-                assertTrue(i6 > 0);
+        int i8 = sql.indexOf("GALLERY_NAME");
+        assertTrue(i8 > 0);
 
-                int i7 = sql.indexOf("ESTIMATED_PRICE");
-                assertTrue(i7 > 0);
+        int i9 = sql.indexOf("PAINTING_TITLE");
+        assertTrue(i9 > 0);
 
-                int i8 = sql.indexOf("GALLERY_NAME");
-                assertTrue(i8 > 0);
+        int i10 = sql.indexOf("TEXT_REVIEW");
+        assertTrue(i10 > 0);
 
-                int i9 = sql.indexOf("PAINTING_TITLE");
-                assertTrue(i9 > 0);
+        int i11 = sql.indexOf("PAINTING_ID");
+        assertTrue(i11 > 0);
 
-                int i10 = sql.indexOf("TEXT_REVIEW");
-                assertTrue(i10 > 0);
+        int i12 = sql.indexOf("ARTIST_ID");
+        assertTrue(i12 > 0);
 
-                int i11 = sql.indexOf("PAINTING_ID");
-                assertTrue(i11 > 0);
+        int i13 = sql.indexOf("GALLERY_ID");
+        assertTrue(i13 > 0);
 
-                int i12 = sql.indexOf("ARTIST_ID");
-                assertTrue(i12 > 0);
-
-                int i13 = sql.indexOf("GALLERY_ID");
-                assertTrue(i13 > 0);
-            }
-        };
-
-        test.test(q);
     }
 
     public void testCreateSqlString10() throws Exception {
         // query with to-many joint prefetches
         SelectQuery q = new SelectQuery(Artist.class);
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-
-        Template test = new Template() {
+        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
+        String sql = transl.createSqlString();
+        assertNotNull(sql);
+        assertTrue(sql.startsWith("SELECT "));
 
-                String sql = transl.createSqlString();
-                assertNotNull(sql);
-                assertTrue(sql.startsWith("SELECT "));
+        int i1 = sql.indexOf("ARTIST_ID");
+        assertTrue(sql, i1 > 0);
 
-                int i1 = sql.indexOf("ARTIST_ID");
-                assertTrue(sql, i1 > 0);
+        int i2 = sql.indexOf("FROM");
+        assertTrue(sql, i2 > 0);
 
-                int i2 = sql.indexOf("FROM");
-                assertTrue(sql, i2 > 0);
+        assertTrue(sql, sql.indexOf("PAINTING_ID") > 0);
 
-                assertTrue(sql, sql.indexOf("PAINTING_ID") > 0);
-
-                // assert we have one join
-                assertEquals(1, transl.joinStack.size());
-            }
-        };
-
-        test.test(q);
+        // assert we have one join
+        assertEquals(1, transl.joinStack.size());
     }
 
     public void testCreateSqlString11() throws Exception {
         // query with joint prefetches and other joins
-        SelectQuery q = new SelectQuery(Artist.class, Expression
-                .fromString("paintingArray.paintingTitle = 'a'"));
-        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-
-        Template test = new Template() {
+        SelectQuery q = new SelectQuery(Artist.class, Expression.fromString("paintingArray.paintingTitle = 'a'"));
+        q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
 
-                transl.createSqlString();
+        transl.createSqlString();
 
-                // assert we only have one join
-                assertEquals(2, transl.joinStack.size());
-            }
-        };
-
-        test.test(q);
+        // assert we only have one join
+        assertEquals(2, transl.joinStack.size());
     }
 
     public void testCreateSqlString12() throws Exception {
         // query with to-one joint prefetches
         SelectQuery q = new SelectQuery(Painting.class);
-        q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-
-        Template test = new Template() {
+        q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
-            @Override
-            void test(SelectTranslator transl) throws Exception {
+        SelectTranslator transl = new SelectTranslator(q, dataNode, connection);
 
-                String sql = transl.createSqlString();
-                assertNotNull(sql);
-                assertTrue(sql.startsWith("SELECT "));
+        String sql = transl.createSqlString();
+        assertNotNull(sql);
+        assertTrue(sql.startsWith("SELECT "));
 
-                int i1 = sql.indexOf("ARTIST_ID");
-                assertTrue(sql, i1 > 0);
+        int i1 = sql.indexOf("ARTIST_ID");
+        assertTrue(sql, i1 > 0);
 
-                int i2 = sql.indexOf("FROM");
-                assertTrue(sql, i2 > 0);
+        int i2 = sql.indexOf("FROM");
+        assertTrue(sql, i2 > 0);
 
-                assertTrue(sql, sql.indexOf("PAINTING_ID") > 0);
+        assertTrue(sql, sql.indexOf("PAINTING_ID") > 0);
 
-                // assert we have one join
-                assertEquals(1, transl.joinStack.size());
-            }
-        };
-
-        test.test(q);
+        // assert we have one join
+        assertEquals(1, transl.joinStack.size());
     }
 
     public void testCreateSqlString13() throws Exception {
         // query with invalid joint prefetches
         SelectQuery q = new SelectQuery(Painting.class);
-        q.addPrefetch("invalid.invalid").setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-
-        Template test = new Template() {
-
-            @Override
-            void test(SelectTranslator transl) throws Exception {
+        q.addPrefetch("invalid.invalid").setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
-                try {
-                    transl.createSqlString();
-                    fail("Invalid jointPrefetch must have thrown...");
-                }
-                catch (ExpressionException e) {
-                    // expected
-                }
-            }
-        };
-
-        test.test(q);
+        try {
+            new SelectTranslator(q, dataNode, connection).createSqlString();
+            fail("Invalid jointPrefetch must have thrown...");
+        } catch (ExpressionException e) {
+            // expected
+        }
     }
 
     public void testCreateSqlStringWithQuoteSqlIdentifiers() throws Exception {
@@ -535,65 +506,28 @@ public class SelectTranslatorTest extend
             entity.getDataMap().setQuotingSQLIdentifiers(true);
             q.addOrdering("dateOfBirth", SortOrder.ASCENDING);
 
-            Template test = new Template() {
+            String charStart = unitAdapter.getIdentifiersStartQuote();
+            String charEnd = unitAdapter.getIdentifiersEndQuote();
 
-                @Override
-                void test(SelectTranslator transl) throws Exception {
-                    String charStart = unitAdapter.getIdentifiersStartQuote();
-                    String charEnd = unitAdapter.getIdentifiersEndQuote();
-
-                    String s = transl.createSqlString();
-                    assertTrue(s.startsWith("SELECT "));
-                    int iFrom = s.indexOf(" FROM ");
-                    assertTrue(iFrom > 0);
-                    int artistName = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_NAME"
-                            + charEnd);
-                    assertTrue(artistName > 0 && artistName < iFrom);
-                    int artistId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistId > 0 && artistId < iFrom);
-                    int dateOfBirth = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd);
-                    assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
-                    int iArtist = s.indexOf(charStart
-                            + "ARTIST"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t0"
-                            + charEnd);
-                    assertTrue(iArtist > iFrom);
-                    int iOrderBy = s.indexOf(" ORDER BY ");
-                    int dateOfBirth2 = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd, iOrderBy);
-                    assertTrue(iOrderBy > iArtist);
-                    assertTrue(dateOfBirth2 > iOrderBy);
-                }
-            };
+            String s = new SelectTranslator(q, dataNode, connection).createSqlString();
+            assertTrue(s.startsWith("SELECT "));
+            int iFrom = s.indexOf(" FROM ");
+            assertTrue(iFrom > 0);
+            int artistName = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_NAME" + charEnd);
+            assertTrue(artistName > 0 && artistName < iFrom);
+            int artistId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistId > 0 && artistId < iFrom);
+            int dateOfBirth = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd);
+            assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
+            int iArtist = s.indexOf(charStart + "ARTIST" + charEnd + " " + charStart + "t0" + charEnd);
+            assertTrue(iArtist > iFrom);
+            int iOrderBy = s.indexOf(" ORDER BY ");
+            int dateOfBirth2 = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd,
+                    iOrderBy);
+            assertTrue(iOrderBy > iArtist);
+            assertTrue(dateOfBirth2 > iOrderBy);
 
-            test.test(q);
-        }
-        finally {
+        } finally {
             DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }
@@ -609,82 +543,36 @@ public class SelectTranslatorTest extend
             q.setQualifier(ExpressionFactory.greaterExp("dateOfBirth", new Date()));
             q.andQualifier(ExpressionFactory.lessExp("dateOfBirth", new Date()));
 
-            Template test = new Template() {
-
-                @Override
-                void test(SelectTranslator transl) throws Exception {
+            String charStart = unitAdapter.getIdentifiersStartQuote();
+            String charEnd = unitAdapter.getIdentifiersEndQuote();
 
-                    String charStart = unitAdapter.getIdentifiersStartQuote();
-                    String charEnd = unitAdapter.getIdentifiersEndQuote();
+            String s = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-                    String s = transl.createSqlString();
-
-                    assertTrue(s.startsWith("SELECT "));
-                    int iFrom = s.indexOf(" FROM ");
-                    assertTrue(iFrom > 0);
-                    int artistName = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_NAME"
-                            + charEnd);
-                    assertTrue(artistName > 0 && artistName < iFrom);
-                    int artistId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistId > 0 && artistId < iFrom);
-                    int dateOfBirth = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd);
-                    assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
-                    int iArtist = s.indexOf(charStart
-                            + "ARTIST"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t0"
-                            + charEnd);
-                    assertTrue(iArtist > iFrom);
-                    int iWhere = s.indexOf(" WHERE ");
-                    assertTrue(iWhere > iArtist);
-
-                    int dateOfBirth2 = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd
-                            + " > ?");
-                    assertTrue(dateOfBirth2 > iWhere);
-
-                    int iAnd = s.indexOf(" AND ");
-                    assertTrue(iAnd > iWhere);
-                    int dateOfBirth3 = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd
-                            + " < ?");
-                    assertTrue(dateOfBirth3 > iAnd);
+            assertTrue(s.startsWith("SELECT "));
+            int iFrom = s.indexOf(" FROM ");
+            assertTrue(iFrom > 0);
+            int artistName = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_NAME" + charEnd);
+            assertTrue(artistName > 0 && artistName < iFrom);
+            int artistId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistId > 0 && artistId < iFrom);
+            int dateOfBirth = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd);
+            assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
+            int iArtist = s.indexOf(charStart + "ARTIST" + charEnd + " " + charStart + "t0" + charEnd);
+            assertTrue(iArtist > iFrom);
+            int iWhere = s.indexOf(" WHERE ");
+            assertTrue(iWhere > iArtist);
+
+            int dateOfBirth2 = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd
+                    + " > ?");
+            assertTrue(dateOfBirth2 > iWhere);
+
+            int iAnd = s.indexOf(" AND ");
+            assertTrue(iAnd > iWhere);
+            int dateOfBirth3 = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd
+                    + " < ?");
+            assertTrue(dateOfBirth3 > iAnd);
 
-                }
-            };
-
-            test.test(q);
-        }
-        finally {
+        } finally {
             DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }
@@ -695,184 +583,74 @@ public class SelectTranslatorTest extend
         // query with joint prefetches and other joins
         // and with QuoteSqlIdentifiers = true
         try {
-            SelectQuery q = new SelectQuery(Artist.class, Expression
-                    .fromString("paintingArray.paintingTitle = 'a'"));
-            q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
-                    PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+            SelectQuery q = new SelectQuery(Artist.class, Expression.fromString("paintingArray.paintingTitle = 'a'"));
+            q.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
             DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
             entity.getDataMap().setQuotingSQLIdentifiers(true);
 
-            Template test = new Template() {
+            String charStart = unitAdapter.getIdentifiersStartQuote();
+            String charEnd = unitAdapter.getIdentifiersEndQuote();
 
-                @Override
-                void test(SelectTranslator transl) throws Exception {
-                    String charStart = unitAdapter.getIdentifiersStartQuote();
-                    String charEnd = unitAdapter.getIdentifiersEndQuote();
-
-                    String s = transl.createSqlString();
-
-                    assertTrue(s.startsWith("SELECT DISTINCT "));
-                    int iFrom = s.indexOf(" FROM ");
-                    assertTrue(iFrom > 0);
-                    int artistName = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_NAME"
-                            + charEnd);
-                    assertTrue(artistName > 0 && artistName < iFrom);
-                    int artistId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistId > 0 && artistId < iFrom);
-                    int dateOfBirth = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd);
-                    assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
-                    int estimatedPrice = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ESTIMATED_PRICE"
-                            + charEnd);
-                    assertTrue(estimatedPrice > 0 && estimatedPrice < iFrom);
-                    int paintingDescription = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_DESCRIPTION"
-                            + charEnd);
-                    assertTrue(paintingDescription > 0 && paintingDescription < iFrom);
-                    int paintingTitle = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_TITLE"
-                            + charEnd);
-                    assertTrue(paintingTitle > 0 && paintingTitle < iFrom);
-                    int artistIdT1 = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistIdT1 > 0 && artistIdT1 < iFrom);
-                    int galleryId = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "GALLERY_ID"
-                            + charEnd);
-                    assertTrue(galleryId > 0 && galleryId < iFrom);
-                    int paintingId = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_ID"
-                            + charEnd);
-                    assertTrue(paintingId > 0 && paintingId < iFrom);
-                    int iArtist = s.indexOf(charStart
-                            + "ARTIST"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t0"
-                            + charEnd);
-                    assertTrue(iArtist > iFrom);
-                    int iLeftJoin = s.indexOf("LEFT JOIN");
-                    assertTrue(iLeftJoin > iFrom);
-                    int iPainting = s.indexOf(charStart
-                            + "PAINTING"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t1"
-                            + charEnd);
-                    assertTrue(iPainting > iLeftJoin);
-                    int iOn = s.indexOf(" ON ");
-                    assertTrue(iOn > iLeftJoin);
-                    int iArtistId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iLeftJoin);
-                    assertTrue(iArtistId > iOn);
-                    int iArtistIdT1 = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iLeftJoin);
-                    assertTrue(iArtistIdT1 > iOn);
-                    int i = s.indexOf("=", iLeftJoin);
-                    assertTrue(iArtistIdT1 > i || iArtistId > i);
-                    int iJoin = s.indexOf("JOIN");
-                    assertTrue(iJoin > iLeftJoin);
-                    int iPainting2 = s.indexOf(charStart
-                            + "PAINTING"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t2"
-                            + charEnd);
-                    assertTrue(iPainting2 > iJoin);
-                    int iOn2 = s.indexOf(" ON ");
-                    assertTrue(iOn2 > iJoin);
-                    int iArtistId2 = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iJoin);
-                    assertTrue(iArtistId2 > iOn2);
-                    int iArtistId2T2 = s.indexOf(charStart
-                            + "t2"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iJoin);
-                    assertTrue(iArtistId2T2 > iOn2);
-                    int i2 = s.indexOf("=", iJoin);
-                    assertTrue(iArtistId2T2 > i2 || iArtistId2 > i2);
-                    int iWhere = s.indexOf(" WHERE ");
-                    assertTrue(iWhere > iJoin);
-
-                    int paintingTitle2 = s.indexOf(charStart
-                            + "t2"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_TITLE"
-                            + charEnd
-                            + " = ?");
-                    assertTrue(paintingTitle2 > iWhere);
-                }
-            };
+            String s = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-            test.test(q);
-        }
-        finally {
+            assertTrue(s.startsWith("SELECT DISTINCT "));
+            int iFrom = s.indexOf(" FROM ");
+            assertTrue(iFrom > 0);
+            int artistName = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_NAME" + charEnd);
+            assertTrue(artistName > 0 && artistName < iFrom);
+            int artistId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistId > 0 && artistId < iFrom);
+            int dateOfBirth = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd);
+            assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
+            int estimatedPrice = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "ESTIMATED_PRICE" + charEnd);
+            assertTrue(estimatedPrice > 0 && estimatedPrice < iFrom);
+            int paintingDescription = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "PAINTING_DESCRIPTION"
+                    + charEnd);
+            assertTrue(paintingDescription > 0 && paintingDescription < iFrom);
+            int paintingTitle = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "PAINTING_TITLE" + charEnd);
+            assertTrue(paintingTitle > 0 && paintingTitle < iFrom);
+            int artistIdT1 = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistIdT1 > 0 && artistIdT1 < iFrom);
+            int galleryId = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "GALLERY_ID" + charEnd);
+            assertTrue(galleryId > 0 && galleryId < iFrom);
+            int paintingId = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "PAINTING_ID" + charEnd);
+            assertTrue(paintingId > 0 && paintingId < iFrom);
+            int iArtist = s.indexOf(charStart + "ARTIST" + charEnd + " " + charStart + "t0" + charEnd);
+            assertTrue(iArtist > iFrom);
+            int iLeftJoin = s.indexOf("LEFT JOIN");
+            assertTrue(iLeftJoin > iFrom);
+            int iPainting = s.indexOf(charStart + "PAINTING" + charEnd + " " + charStart + "t1" + charEnd);
+            assertTrue(iPainting > iLeftJoin);
+            int iOn = s.indexOf(" ON ");
+            assertTrue(iOn > iLeftJoin);
+            int iArtistId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iLeftJoin);
+            assertTrue(iArtistId > iOn);
+            int iArtistIdT1 = s
+                    .indexOf(charStart + "t1" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iLeftJoin);
+            assertTrue(iArtistIdT1 > iOn);
+            int i = s.indexOf("=", iLeftJoin);
+            assertTrue(iArtistIdT1 > i || iArtistId > i);
+            int iJoin = s.indexOf("JOIN");
+            assertTrue(iJoin > iLeftJoin);
+            int iPainting2 = s.indexOf(charStart + "PAINTING" + charEnd + " " + charStart + "t2" + charEnd);
+            assertTrue(iPainting2 > iJoin);
+            int iOn2 = s.indexOf(" ON ");
+            assertTrue(iOn2 > iJoin);
+            int iArtistId2 = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iJoin);
+            assertTrue(iArtistId2 > iOn2);
+            int iArtistId2T2 = s.indexOf(charStart + "t2" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iJoin);
+            assertTrue(iArtistId2T2 > iOn2);
+            int i2 = s.indexOf("=", iJoin);
+            assertTrue(iArtistId2T2 > i2 || iArtistId2 > i2);
+            int iWhere = s.indexOf(" WHERE ");
+            assertTrue(iWhere > iJoin);
+
+            int paintingTitle2 = s.indexOf(charStart + "t2" + charEnd + "." + charStart + "PAINTING_TITLE" + charEnd
+                    + " = ?");
+            assertTrue(paintingTitle2 > iWhere);
+
+        } finally {
             DbEntity entity = context.getEntityResolver().getDbEntity("ARTIST");
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }
@@ -884,142 +662,57 @@ public class SelectTranslatorTest extend
         // and with QuoteSqlIdentifiers = true
         try {
             SelectQuery q = new SelectQuery(Painting.class);
-            q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(
-                    PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+            q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
 
             DbEntity entity = context.getEntityResolver().getDbEntity("PAINTING");
             entity.getDataMap().setQuotingSQLIdentifiers(true);
 
-            Template test = new Template() {
+            String charStart = unitAdapter.getIdentifiersStartQuote();
+            String charEnd = unitAdapter.getIdentifiersEndQuote();
 
-                @Override
-                void test(SelectTranslator transl) throws Exception {
-                    String charStart = unitAdapter.getIdentifiersStartQuote();
-                    String charEnd = unitAdapter.getIdentifiersEndQuote();
-
-                    String s = transl.createSqlString();
-
-                    assertTrue(s.startsWith("SELECT "));
-                    int iFrom = s.indexOf(" FROM ");
-                    assertTrue(iFrom > 0);
-
-                    int paintingDescription = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_DESCRIPTION"
-                            + charEnd);
-                    assertTrue(paintingDescription > 0 && paintingDescription < iFrom);
-                    int paintingTitle = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_TITLE"
-                            + charEnd);
-                    assertTrue(paintingTitle > 0 && paintingTitle < iFrom);
-                    int artistIdT1 = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistIdT1 > 0 && artistIdT1 < iFrom);
-                    int estimatedPrice = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ESTIMATED_PRICE"
-                            + charEnd);
-                    assertTrue(estimatedPrice > 0 && estimatedPrice < iFrom);
-                    int galleryId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "GALLERY_ID"
-                            + charEnd);
-                    assertTrue(galleryId > 0 && galleryId < iFrom);
-                    int paintingId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "PAINTING_ID"
-                            + charEnd);
-                    assertTrue(paintingId > 0 && paintingId < iFrom);
-                    int artistName = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_NAME"
-                            + charEnd);
-                    assertTrue(artistName > 0 && artistName < iFrom);
-                    int artistId = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd);
-                    assertTrue(artistId > 0 && artistId < iFrom);
-                    int dateOfBirth = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "DATE_OF_BIRTH"
-                            + charEnd);
-                    assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
-                    int iPainting = s.indexOf(charStart
-                            + "PAINTING"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t0"
-                            + charEnd);
-                    assertTrue(iPainting > iFrom);
-
-                    int iLeftJoin = s.indexOf("LEFT JOIN");
-                    assertTrue(iLeftJoin > iFrom);
-                    int iArtist = s.indexOf(charStart
-                            + "ARTIST"
-                            + charEnd
-                            + " "
-                            + charStart
-                            + "t1"
-                            + charEnd);
-                    assertTrue(iArtist > iLeftJoin);
-                    int iOn = s.indexOf(" ON ");
-                    assertTrue(iOn > iLeftJoin);
-                    int iArtistId = s.indexOf(charStart
-                            + "t0"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iLeftJoin);
-                    assertTrue(iArtistId > iOn);
-                    int iArtistIdT1 = s.indexOf(charStart
-                            + "t1"
-                            + charEnd
-                            + "."
-                            + charStart
-                            + "ARTIST_ID"
-                            + charEnd, iLeftJoin);
-                    assertTrue(iArtistIdT1 > iOn);
-                    int i = s.indexOf("=", iLeftJoin);
-                    assertTrue(iArtistIdT1 > i || iArtistId > i);
-                }
-            };
+            String s = new SelectTranslator(q, dataNode, connection).createSqlString();
 
-            test.test(q);
-        }
-        finally {
+            assertTrue(s.startsWith("SELECT "));
+            int iFrom = s.indexOf(" FROM ");
+            assertTrue(iFrom > 0);
+
+            int paintingDescription = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "PAINTING_DESCRIPTION"
+                    + charEnd);
+            assertTrue(paintingDescription > 0 && paintingDescription < iFrom);
+            int paintingTitle = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "PAINTING_TITLE" + charEnd);
+            assertTrue(paintingTitle > 0 && paintingTitle < iFrom);
+            int artistIdT1 = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistIdT1 > 0 && artistIdT1 < iFrom);
+            int estimatedPrice = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ESTIMATED_PRICE" + charEnd);
+            assertTrue(estimatedPrice > 0 && estimatedPrice < iFrom);
+            int galleryId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "GALLERY_ID" + charEnd);
+            assertTrue(galleryId > 0 && galleryId < iFrom);
+            int paintingId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "PAINTING_ID" + charEnd);
+            assertTrue(paintingId > 0 && paintingId < iFrom);
+            int artistName = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "ARTIST_NAME" + charEnd);
+            assertTrue(artistName > 0 && artistName < iFrom);
+            int artistId = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "ARTIST_ID" + charEnd);
+            assertTrue(artistId > 0 && artistId < iFrom);
+            int dateOfBirth = s.indexOf(charStart + "t1" + charEnd + "." + charStart + "DATE_OF_BIRTH" + charEnd);
+            assertTrue(dateOfBirth > 0 && dateOfBirth < iFrom);
+            int iPainting = s.indexOf(charStart + "PAINTING" + charEnd + " " + charStart + "t0" + charEnd);
+            assertTrue(iPainting > iFrom);
+
+            int iLeftJoin = s.indexOf("LEFT JOIN");
+            assertTrue(iLeftJoin > iFrom);
+            int iArtist = s.indexOf(charStart + "ARTIST" + charEnd + " " + charStart + "t1" + charEnd);
+            assertTrue(iArtist > iLeftJoin);
+            int iOn = s.indexOf(" ON ");
+            assertTrue(iOn > iLeftJoin);
+            int iArtistId = s.indexOf(charStart + "t0" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iLeftJoin);
+            assertTrue(iArtistId > iOn);
+            int iArtistIdT1 = s
+                    .indexOf(charStart + "t1" + charEnd + "." + charStart + "ARTIST_ID" + charEnd, iLeftJoin);
+            assertTrue(iArtistIdT1 > iOn);
+            int i = s.indexOf("=", iLeftJoin);
+            assertTrue(iArtistIdT1 > i || iArtistId > i);
+
+        } finally {
             DbEntity entity = context.getEntityResolver().getDbEntity("PAINTING");
             entity.getDataMap().setQuotingSQLIdentifiers(false);
         }
@@ -1030,7 +723,7 @@ public class SelectTranslatorTest extend
      */
     public void testBuildResultColumns1() throws Exception {
         SelectQuery q = new SelectQuery(Painting.class);
-        SelectTranslator tr = makeTranslator(q);
+        SelectTranslator tr = new SelectTranslator(q, dataNode, connection);
 
         List<?> columns = tr.buildResultColumns();
 
@@ -1038,8 +731,7 @@ public class SelectTranslatorTest extend
         DbEntity entity = context.getEntityResolver().getDbEntity("PAINTING");
         for (final DbAttribute a : entity.getAttributes()) {
             ColumnDescriptor c = new ColumnDescriptor(a, "t0");
-            assertTrue("No descriptor for " + a + ", columns: " + columns, columns
-                    .contains(c));
+            assertTrue("No descriptor for " + a + ", columns: " + columns, columns.contains(c));
         }
     }
 
@@ -1048,9 +740,8 @@ public class SelectTranslatorTest extend
      */
     public void testBuildResultColumns2() throws Exception {
         SelectQuery q = new SelectQuery(Painting.class);
-        q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(
-                PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
-        SelectTranslator tr = makeTranslator(q);
+        q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+        SelectTranslator tr = new SelectTranslator(q, dataNode, connection);
 
         List<?> columns = tr.buildResultColumns();
 
@@ -1058,8 +749,7 @@ public class SelectTranslatorTest extend
         DbEntity entity = context.getEntityResolver().getDbEntity("PAINTING");
         for (final DbAttribute a : entity.getAttributes()) {
             ColumnDescriptor c = new ColumnDescriptor(a, "t0");
-            assertTrue("No descriptor for " + a + ", columns: " + columns, columns
-                    .contains(c));
+            assertTrue("No descriptor for " + a + ", columns: " + columns, columns.contains(c));
         }
 
         // assert joined columns
@@ -1073,46 +763,8 @@ public class SelectTranslatorTest extend
 
             ColumnDescriptor c = new ColumnDescriptor(a, "t1");
             c.setDataRowKey("toArtist." + a.getName());
-            assertTrue("No descriptor for " + a + ", columns: " + columns, columns
-                    .contains(c));
+            assertTrue("No descriptor for " + a + ", columns: " + columns, columns.contains(c));
         }
     }
 
-    SelectTranslator makeTranslator(Query q) throws Exception {
-
-        SelectTranslator translator = new SelectTranslator();
-        translator.setQuery(q);
-        translator.setAdapter(adapter);
-        translator.setEntityResolver(context.getEntityResolver());
-        translator.setJdbcEventLogger(logger);
-        return translator;
-    }
-
-    /**
-     * Helper class that serves as a template to streamline testing that requires an open
-     * connection.
-     */
-    abstract class Template {
-
-        void test(SelectQuery q) throws Exception {
-            SelectTranslator transl = makeTranslator(q);
-
-            Connection c = dataSourceFactory.getSharedDataSource().getConnection();
-            try {
-
-                transl.setConnection(c);
-                test(transl);
-            }
-            finally {
-                try {
-                    c.close();
-                }
-                catch (SQLException ex) {
-
-                }
-            }
-        }
-
-        abstract void test(SelectTranslator transl) throws Exception;
-    }
 }

Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/TstQueryAssembler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/TstQueryAssembler.java?rev=1577108&r1=1577107&r2=1577108&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/TstQueryAssembler.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/trans/TstQueryAssembler.java Thu Mar 13 11:04:36 2014
@@ -19,43 +19,28 @@
 
 package org.apache.cayenne.access.trans;
 
+import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.JoinType;
 import org.apache.cayenne.query.Query;
 
 public class TstQueryAssembler extends QueryAssembler {
 
-    protected List dbRels = new ArrayList();
+    protected List<DbRelationship> dbRels;
 
-    public TstQueryAssembler(DataNode node, Query q) {
-
-        super.setAdapter(node.getAdapter());
-
-        try {
-            super.setConnection(node.getDataSource().getConnection());
-        }
-        catch (Exception ex) {
-            throw new CayenneRuntimeException("Error getting connection...", ex);
-        }
-        super.setEntityResolver(node.getEntityResolver());
-        super.setQuery(q);
-    }
-
-    public void dispose() throws SQLException {
-        connection.close();
+    public TstQueryAssembler(Query q, DataNode node, Connection connection) throws SQLException {
+        super(q, node, connection);
+        dbRels = new ArrayList<DbRelationship>();
     }
 
     @Override
-    public void dbRelationshipAdded(
-            DbRelationship relationship,
-            JoinType joinType,
-            String joinSplitAlias) {
+    public void dbRelationshipAdded(DbRelationship relationship, JoinType joinType, String joinSplitAlias) {
         dbRels.add(relationship);
     }
 
@@ -79,7 +64,7 @@ public class TstQueryAssembler extends Q
         return "SELECT * FROM ARTIST";
     }
 
-    public List getAttributes() {
+    public List<DbAttribute> getAttributes() {
         return attributes;
     }