// Copyright (c) 2003-2014, Jodd Team (jodd.org). All Rights Reserved.
package jodd.db.oom;
import jodd.db.DbHsqldbTestCase;
import jodd.db.DbSession;
import jodd.db.DbThreadSession;
import jodd.db.oom.sqlgen.DbEntitySql;
import jodd.db.oom.tst.Boy;
import jodd.db.oom.tst.Girl2;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import static jodd.db.oom.sqlgen.DbSqlBuilder.sql;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@SuppressWarnings("SimplifiableJUnitAssertion")
public class EntityCacheTest extends DbHsqldbTestCase {
public static final String TSQL =
"select $C{g.id, g.name, g.speciality}, $C{b.*} from " +
"$T{Girl2 g} join $T{Boy b} on $g.id = $b.girlId " +
"order by $g.id desc";
public static final String TSQL_LEFT =
"select $C{g.id, g.name, g.speciality}, $C{b.*} from " +
"$T{Girl2 g} left join $T{Boy b} on $g.id = $b.girlId " +
"order by $g.id desc";
DbSession dbSession;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
DbOomManager.resetAll();
DbOomManager dbOom = DbOomManager.getInstance();
dbOom.registerEntity(Girl2.class);
dbOom.registerEntity(Boy.class);
dbSession = new DbThreadSession(cp);
assertEquals(1, DbEntitySql.insert(new Girl2(1, "Anna", "swim")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Girl2(2, "Sandra", "piano")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Girl2(3, "Emma", "nothing")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy(1, "Johny", 2)).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy(2, "Marco", 2)).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy(3, "Hugo", 1)).query().executeUpdate());
}
@After
public void tearDown() throws Exception {
dbSession.closeSession();
super.tearDown();
}
@Test
public void testMapRows2Types_useCache_noHints() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
List<Object[]> result = q.cacheEntities(true).list(Girl2.class, Boy.class);
assertEquals(3, result.size());
Girl2 girl1 = (Girl2) result.get(0)[0];
Girl2 girl2 = (Girl2) result.get(1)[0];
Girl2 girl3 = (Girl2) result.get(2)[0];
assertTrue(girl1.equals(girl2));
assertTrue(girl1 == girl2);
assertFalse(girl3 == girl1);
Boy boy1 = (Boy) result.get(0)[1];
Boy boy2 = (Boy) result.get(1)[1];
Boy boy3 = (Boy) result.get(2)[1];
assertTrue(boy1.id != boy2.id);
assertFalse(boy1 == boy2);
assertFalse(boy2 == boy3);
assertNull(girl1.getBoys());
assertNull(girl3.getBoys());
}
@Test
public void testMapRows2Types_useCache_noHints_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
List<Object[]> result = q.cacheEntities(true).list(Girl2.class, Boy.class);
assertEquals(4, result.size());
Girl2 girl0 = (Girl2) result.get(0)[0];
Girl2 girl1 = (Girl2) result.get(1)[0];
Girl2 girl2 = (Girl2) result.get(2)[0];
Girl2 girl3 = (Girl2) result.get(3)[0];
assertEquals("Emma", girl0.name);
assertTrue(girl1.equals(girl2));
assertTrue(girl1 == girl2);
assertFalse(girl3 == girl1);
Boy boy0 = (Boy) result.get(0)[1];
Boy boy1 = (Boy) result.get(1)[1];
Boy boy2 = (Boy) result.get(2)[1];
Boy boy3 = (Boy) result.get(3)[1];
assertNull(boy0);
assertTrue(boy1.id != boy2.id);
assertFalse(boy1 == boy2);
assertFalse(boy2 == boy3);
assertNull(girl1.getBoys());
assertNull(girl3.getBoys());
}
@Test
public void testMapRows2Types_useCache_useHints_1perRow() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
List<Girl2> result2 = q.withHints("g", "g.boys").cacheEntities(true).list(Girl2.class, Boy.class);
assertEquals(3, result2.size());
Girl2 girl1 = result2.get(0);
Girl2 girl2 = result2.get(1);
Girl2 girl3 = result2.get(2);
assertTrue(girl1.equals(girl2));
assertTrue(girl1 == girl2);
assertFalse(girl3 == girl1);
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
assertEquals("Hugo", girl3.getBoys().get(0).name);
}
@Test
public void testMapRows2Types_useCache_useHints_1perRow_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
List<Girl2> result2 = q.withHints("g", "g.boys").cacheEntities(true).list(Girl2.class, Boy.class);
assertEquals(4, result2.size());
Girl2 girl0 = result2.get(0);
Girl2 girl1 = result2.get(1);
Girl2 girl2 = result2.get(2);
Girl2 girl3 = result2.get(3);
assertTrue(girl1.equals(girl2));
assertTrue(girl1 == girl2);
assertFalse(girl3 == girl1);
assertNull(girl0.getBoys());
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
assertEquals("Hugo", girl3.getBoys().get(0).name);
}
@Test
public void testMapRows2Types_entityAware() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
List<Girl2> result2 = q.withHints("g", "g.boys").entityAwareMode(true).list(Girl2.class, Boy.class);
assertEquals(2, result2.size());
Girl2 girl1 = result2.get(0);
Girl2 girl3 = result2.get(1);
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
}
@Test
public void testMapRows2Types_entityAware_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
List<Girl2> result2 = q.withHints("g", "g.boys").entityAwareMode(true).list(Girl2.class, Boy.class);
assertEquals(3, result2.size());
Girl2 girl0 = result2.get(0);
Girl2 girl1 = result2.get(1);
Girl2 girl3 = result2.get(2);
assertNull(girl0.getBoys());
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
}
@Test
public void testMapRows2Types_entityAware_List() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
List<Girl2> result2 = q.withHints("g", "g.boys").entityAwareMode(true).list(1, Girl2.class, Boy.class);
assertEquals(1, result2.size());
Girl2 girl1 = result2.get(0);
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
}
@Test
public void testMapRows2Types_entityAware_List_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
List<Girl2> result2 = q.withHints("g", "g.boys").entityAwareMode(true).list(2, Girl2.class, Boy.class);
assertEquals(2, result2.size());
Girl2 girl0 = result2.get(0);
Girl2 girl1 = result2.get(1);
assertNull(girl0.getBoys());
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
}
@Test
public void testMapRows2Types_entityAware_Set() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
Set<Girl2> set1 = q.withHints("g", "g.boys").entityAwareMode(true).listSet(Girl2.class, Boy.class);
assertEquals(2, set1.size());
for (Girl2 girl : set1) {
if (girl.id.equals(1)) {
assertEquals(1, girl.getBoys().size());
}
if (girl.id.equals(2)) {
assertEquals(2, girl.getBoys().size());
}
}
}
@Test
public void testMapRows2Types_entityAware_Set_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
Set<Girl2> set1 = q.withHints("g", "g.boys").entityAwareMode(true).listSet(Girl2.class, Boy.class);
assertEquals(3, set1.size());
for (Girl2 girl : set1) {
if (girl.id.equals(1)) {
assertEquals(1, girl.getBoys().size());
}
if (girl.id.equals(2)) {
assertEquals(2, girl.getBoys().size());
}
if (girl.id.equals(3)) {
assertNull(girl.getBoys());
}
}
}
@Test
public void testMapRows2Types_entityAware_Max() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
Set<Girl2> set1 = q.withHints("g", "g.boys").entityAwareMode(true).listSet(1, Girl2.class, Boy.class);
assertEquals(1, set1.size());
for (Girl2 girl : set1) {
if (girl.id.equals(2)) {
assertEquals(2, girl.getBoys().size());
} else {
fail();
}
}
}
@Test
public void testMapRows2Types_entityAware_Max_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
Set<Girl2> set1 = q.withHints("g", "g.boys").entityAwareMode(true).listSet(2, Girl2.class, Boy.class);
assertEquals(2, set1.size());
for (Girl2 girl : set1) {
if (girl.id.equals(3)) {
assertNull(girl.getBoys());
} else if (girl.id.equals(2)) {
assertEquals(2, girl.getBoys().size());
} else {
fail();
}
}
}
@Test
public void testMapRows2Types_entityAware_Iterator() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
Iterator<Girl2> iterator = q.withHints("g", "g.boys").entityAwareMode(true).iterate(Girl2.class, Boy.class);
assertTrue(iterator.hasNext());
assertTrue(iterator.hasNext());
assertTrue(iterator.hasNext());
Girl2 girl1 = iterator.next();
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertTrue(iterator.hasNext());
Girl2 girl3 = iterator.next();
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
assertFalse(iterator.hasNext());
}
@Test
public void testMapRows2Types_entityAware_Iterator_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
Iterator<Girl2> iterator = q.withHints("g", "g.boys").entityAwareMode(true).iterate(Girl2.class, Boy.class);
assertTrue(iterator.hasNext());
Girl2 girl0 = iterator.next();
assertNull(girl0.getBoys());
Girl2 girl1 = iterator.next();
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
assertTrue(iterator.hasNext());
Girl2 girl3 = iterator.next();
assertNotNull(girl3.getBoys());
assertEquals(1, girl3.getBoys().size());
assertFalse(iterator.hasNext());
}
@Test
public void testMapRows2Types_entityAware_Find() {
DbOomQuery q = new DbOomQuery(sql(TSQL));
Girl2 girl1 = q.withHints("g", "g.boys").entityAwareMode(true).find(Girl2.class, Boy.class);
assertNotNull(girl1.getBoys());
assertEquals(2, girl1.getBoys().size());
}
@Test
public void testMapRows2Types_entityAware_Find_LEFT() {
DbOomQuery q = new DbOomQuery(sql(TSQL_LEFT));
Girl2 girl0 = q.withHints("g", "g.boys").entityAwareMode(true).find(Girl2.class, Boy.class);
assertNull(girl0.getBoys());
}
}