// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.db.oom; import jodd.db.fixtures.DbHsqldbTestCase; import jodd.db.DbSession; import jodd.db.DbThreadSession; import jodd.db.oom.sqlgen.DbEntitySql; import jodd.db.oom.sqlgen.ParsedSql; import jodd.db.oom.fixtures.Boy2; import jodd.db.oom.fixtures.Girl; import org.junit.Before; import org.junit.Test; import static jodd.db.oom.sqlgen.DbSqlBuilder.sql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; public class DbHintTest extends DbHsqldbTestCase { @Before public void setUp() throws Exception { super.setUp(); DbOomManager.resetAll(); DbOomManager dbOom = DbOomManager.getInstance(); dbOom.registerEntity(Boy2.class); dbOom.registerEntity(Girl.class); q1 = sql("select $C{boy.*}, $C{girl.*} from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); q2 = sql("select $C{boy.*}, $C{boy.girl.*} from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); q3 = sql("select $C{boy.*}, $C{girl.*}, (select count (1) from $T{Girl girl2}) as totalGirlsCount from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); q4 = sql("select $C{boy.*}, $C{boy.girlAlt:girl.*} from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); q5 = sql("select $C{boy.*}, $C{boy.girlAlt:girl.*}, (select count (1) from $T{Girl girl2}) as $C{boy.totalGirls:.totalGirlsCount} from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); q6 = sql("select $C{boy.*}, $C{boy.girlAlt:girl.[id,name]} from $T{Boy2 boy} join $T{Girl girl} on $boy.id=$girl.id").parse(); } ParsedSql q1; ParsedSql q2; ParsedSql q3; ParsedSql q4; ParsedSql q5; ParsedSql q6; @Test public void testHint() { DbSession dbSession = new DbThreadSession(cp); // prepare data assertEquals(1, DbEntitySql.insert(new Girl(1, "Anna", "swim")).query().executeUpdate()); assertEquals(1, DbEntitySql.insert(new Girl(2, "Sandra", "piano")).query().executeUpdate()); assertEquals(1, DbEntitySql.insert(new Boy2(1, "John", 1)).query().executeUpdate()); // select without hint DbOomQuery dbOomQuery = new DbOomQuery(q1); Object[] result = dbOomQuery.find(Boy2.class, Girl.class); Boy2 boy2 = (Boy2) result[0]; assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNull(boy2.girl); Girl girl = (Girl) result[1]; assertEquals(1, girl.id); // select with t-sql hint dbOomQuery = new DbOomQuery(q2); boy2 = dbOomQuery.find(Boy2.class, Girl.class); assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNotNull(boy2.girl); assertEquals(1, boy2.girl.id); assertEquals(0, boy2.totalGirls); // select with external hints dbOomQuery = new DbOomQuery(q3); dbOomQuery.withHints("boy", "boy.girlAlt", "boy.totalGirls"); boy2 = dbOomQuery.find(Boy2.class, Girl.class, Integer.class); assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNotNull(boy2.girlAlt); assertEquals(1, boy2.girlAlt.id); assertEquals(2, boy2.totalGirls); // same select with t-sql hints dbOomQuery = new DbOomQuery(q4); boy2 = dbOomQuery.find(Boy2.class, Girl.class); assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNotNull(boy2.girlAlt); assertEquals(1, boy2.girlAlt.id); assertEquals(0, boy2.totalGirls); // same select with t-sql hints dbOomQuery = new DbOomQuery(q5); boy2 = dbOomQuery.find(Boy2.class, Girl.class, Integer.class); assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNotNull(boy2.girlAlt); assertEquals(1, boy2.girlAlt.id); assertEquals(2, boy2.totalGirls); // same select with t-sql hints dbOomQuery = new DbOomQuery(q6); boy2 = dbOomQuery.find(Boy2.class, Girl.class); assertEquals(1, boy2.id); assertEquals("John", boy2.name); assertEquals(1, boy2.girlId); assertNotNull(boy2.girlAlt); assertEquals(1, boy2.girlAlt.id); assertNotNull(boy2.girlAlt.name); assertNull(boy2.girlAlt.speciality); dbSession.closeSession(); } }