// 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.fixtures.Boy4;
import jodd.db.oom.fixtures.Girl4;
import jodd.db.oom.fixtures.Room;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static jodd.db.oom.sqlgen.DbSqlBuilder.sql;
import static org.junit.Assert.assertEquals;
public class DbHint2Test extends DbHsqldbTestCase {
@Override
public void tearDown() throws Exception {
DbSession session = new DbSession(cp);
executeUpdate(session, "drop table GIRL if exists");
executeUpdate(session, "drop table BOY if exists");
executeUpdate(session, "drop table ROOM if exists");
session.closeSession();
super.tearDown();
}
protected void initDb(DbSession session) {
executeUpdate(session, "drop table ROOM if exists");
executeUpdate(session, "drop table BOY if exists");
executeUpdate(session, "drop table GIRL if exists");
String sql;
sql = "create table ROOM (" +
"ID integer not null," +
"NAME varchar(20) null," +
"primary key (ID)" +
")";
executeUpdate(session, sql);
sql = "create table BOY (" +
"ID integer not null," +
"ROOM_ID integer not null," +
"NAME varchar(20) null," +
"primary key (ID)," +
"FOREIGN KEY (ROOM_ID) REFERENCES ROOM (ID)" +
')';
executeUpdate(session, sql);
sql = "create table GIRL (" +
"ID integer not null," +
"BOY_ID integer not null," +
"NAME varchar(20) not null," +
"SPECIALITY varchar(20) null," +
"primary key (ID)," +
"FOREIGN KEY (BOY_ID) REFERENCES BOY (ID)" +
')';
executeUpdate(session, sql);
}
@Before
public void setUp() throws Exception {
super.setUp();
DbOomManager.resetAll();
DbOomManager dbOom = DbOomManager.getInstance();
dbOom.registerEntity(Boy4.class);
dbOom.registerEntity(Girl4.class);
dbOom.registerEntity(Room.class);
}
@Test
public void testHint() {
DbSession dbSession = new DbThreadSession(cp);
// prepare data
assertEquals(1, DbEntitySql.insert(new Room(1, "Room1")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Room(2, "Room2")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy4(1, 1, "Oleg")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy4(2, 2, "Stephene")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Boy4(3, 2, "Joe")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Girl4(1, 1, "Anna")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Girl4(2, 2, "Sandra")).query().executeUpdate());
assertEquals(1, DbEntitySql.insert(new Girl4(3, 3, "Jossy")).query().executeUpdate());
// select
DbOomQuery dbOomQuery = new DbOomQuery(sql(
"select $C{room.*}, $C{boy.*}, $C{girl.*} " +
"from $T{Room room} join $T{Boy4 boy} on $room.id=$boy.roomId " +
"join $T{Girl4 girl} on $boy.id=$girl.boyId " +
"order by $room.id, $boy.id"
));
List<Object[]> results = dbOomQuery.autoClose().list(Room.class, Boy4.class, Girl4.class);
assertEquals(3, results.size());
Object[] row = results.get(0);
assertEquals(1, ((Room) row[0]).getId().longValue());
assertEquals(1, ((Boy4) row[1]).id.longValue());
assertEquals(1, ((Girl4) row[2]).getId().longValue());
// ---------------------------------------------------------------- hints
dbOomQuery = new DbOomQuery(sql(
"select $C{room.*}, $C{room.boys:boy.*}, $C{room.boys.girl:girl.*} " +
"from $T{Room room} join $T{Boy4 boy} on $room.id=$boy.roomId " +
"join $T{Girl4 girl} on $boy.id=$girl.boyId " +
"order by $room.id, $boy.id"
));
dbOomQuery
.entityAwareMode(true)
.autoClose();
List<Room> rooms = dbOomQuery.list(Room.class, Boy4.class, Girl4.class);
assertEquals(2, rooms.size());
// room #1
Room room1 = rooms.get(0);
assertEquals(1, room1.getId().longValue());
assertEquals(1, room1.getBoys().size());
Boy4 boy1 = room1.getBoys().get(0);
assertEquals(1, boy1.id.intValue());
Girl4 girl1 = boy1.girl;
assertEquals(1, girl1.getId().longValue());
// room #2
Room room2 = rooms.get(1);
assertEquals(2, room2.getId().longValue());
assertEquals(2, room2.getBoys().size());
Boy4 boy2 = room2.getBoys().get(0);
Boy4 boy3 = room2.getBoys().get(1);
assertEquals(2, boy2.id.longValue());
assertEquals(3, boy3.id.longValue());
Girl4 girl2 = boy2.girl;
assertEquals(2, girl2.getId().longValue());
Girl4 girl3 = boy3.girl;
assertEquals(3, girl3.getId().longValue());
dbSession.closeSession();
}
}