package org.tests.rawsql.inherit; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.FetchConfig; import io.ebean.RawSql; import io.ebean.RawSqlBuilder; import org.tests.inherit.ChildA; import org.tests.inherit.ChildB; import org.tests.inherit.Data; import org.tests.inherit.EUncle; import org.tests.inherit.Parent; import org.tests.inherit.ParentAggregate; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.*; public class ParentRawSqlTest extends BaseTestCase { @Test public void RawSqlParentLoad() { List<Data> exampleData = new ArrayList<>(); exampleData.add(new Data(0)); exampleData.add(new Data(1)); exampleData.add(new Data(2)); ChildA a = new ChildA(0, "PA"); a.setData(exampleData); Ebean.save(a); ChildB b = new ChildB(1, "PB"); b.setData(exampleData); Ebean.save(b); ChildA c = new ChildA(2, "PC"); c.setData(exampleData); Ebean.save(c); RawSql rawSql = RawSqlBuilder .parse("select type, id, val from rawinherit_parent where val > 1") .create(); List<Parent> partial = Ebean.find(Parent.class) .setRawSql(rawSql) .findList(); assertNotNull(partial.get(0).getData()); assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0); } @Test public void RawSqlParentFetch() { List<Data> exampleData = new ArrayList<>(); exampleData.add(new Data(0)); exampleData.add(new Data(1)); exampleData.add(new Data(2)); ChildA a = new ChildA(0, "PA"); a.setData(exampleData); Ebean.save(a); ChildB b = new ChildB(1, "PB"); b.setData(exampleData); Ebean.save(b); ChildA c = new ChildA(2, "PC"); c.setData(exampleData); Ebean.save(c); EUncle e1 = new EUncle(); e1.setParent(b); e1.setName("fester"); Ebean.save(e1); joinToInheritanceHierarchy_withAliasMapping(); joinToInheritanceHierarchy_bug416(); joinToInheritanceHierarchy_with_queryJoin(); joinToInheritanceHierarchy_withIgnore(); useColumnMappingIgnore(); useColumnMappingWithDiscriminator(); useExtraColumnMappingIgnore(); } private void joinToInheritanceHierarchy_bug416() { // For bug 416 we need the parent.more to trigger it RawSql rawSql = RawSqlBuilder .unparsed("select u.id, u.name, p.type as p_type, p.id as p_id, p.more as p_more from rawinherit_uncle u join rawinherit_parent p on p.id = u.parent_id") .columnMapping("id", "id") .columnMapping("name", "name") .columnMapping("p_type", "parent.type") .columnMapping("p_id", "parent.id") .columnMapping("p_more", "parent.more") .create(); List<EUncle> uncles = Ebean.find(EUncle.class).setRawSql(rawSql).findList(); assertNotNull(uncles.get(0)); Parent parent = uncles.get(0).getParent(); assertTrue(parent instanceof ChildB); } private void joinToInheritanceHierarchy_with_queryJoin() { RawSql rawSql = RawSqlBuilder .unparsed("select u.id, u.name, p.type as p_type, p.id as p_id from rawinherit_uncle u join rawinherit_parent p on p.id = u.parent_id") .columnMapping("id", "id") .columnMapping("name", "name") .columnMapping("p_type", "parent.type") .columnMapping("p_id", "parent.id") .create(); List<EUncle> uncles = Ebean.find(EUncle.class).setRawSql(rawSql) .fetch("parent", new FetchConfig().query()) .findList(); assertNotNull(uncles.get(0)); Parent parent = uncles.get(0).getParent(); assertTrue(parent instanceof ChildB); } private void joinToInheritanceHierarchy_withIgnore() { RawSql rawSql = RawSqlBuilder .unparsed("select u.id, u.name, p.type as ptype, p.id as pid from rawinherit_uncle u join rawinherit_parent p on p.id = u.parent_id") .columnMapping("id", "id") .columnMapping("name", "name") .columnMappingIgnore("ptype") .columnMapping("pid", "parent.id") .create(); List<EUncle> uncles = Ebean.find(EUncle.class).setRawSql(rawSql) .fetch("parent", new FetchConfig().query()) .findList(); assertNotNull(uncles.get(0)); Parent parent = uncles.get(0).getParent(); assertTrue(parent instanceof ChildB); } private void joinToInheritanceHierarchy_withAliasMapping() { RawSql rawSql = RawSqlBuilder .parse("select u.id, u.name, p.type, p.id from rawinherit_uncle u join rawinherit_parent p on p.id = u.parent_id") .tableAliasMapping("p", "parent") .create(); List<EUncle> uncles = Ebean.find(EUncle.class).setRawSql(rawSql) .findList(); assertNotNull(uncles.get(0)); Parent parent = uncles.get(0).getParent(); assertTrue(parent instanceof ChildB); } /** * Map the discriminator column - columnMapping("type", "parent.type"). */ private void useColumnMappingWithDiscriminator() { RawSql rawSql = RawSqlBuilder .unparsed("select type, id from rawinherit_parent where val > 1") .columnMapping("type", "parent.type") // can map the discriminator column 'type' .columnMapping("id", "parent.id") .create(); List<ParentAggregate> aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) .fetch("parent", new FetchConfig().query()) .findList(); List<Parent> partial = new ArrayList<>(); for (ParentAggregate aggregate : aggregates) { partial.add(aggregate.parent); } assertNotNull(partial.get(0).getData()); assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0); } /** * Use columnMappingIgnore() to ignore the discriminator column. */ private void useColumnMappingIgnore() { RawSql rawSql = RawSqlBuilder .unparsed("select type, id from rawinherit_parent where val > 1") .columnMappingIgnore("type") // can ignore the discriminator 'type' .columnMapping("id", "parent.id") .create(); List<ParentAggregate> aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) .fetch("parent", new FetchConfig().query()) .findList(); List<Parent> partial = new ArrayList<>(); for (ParentAggregate aggregate : aggregates) { partial.add(aggregate.parent); } assertNotNull(partial.get(0).getData()); assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0); } /** * Extra columnMappingIgnore() before and after. */ private void useExtraColumnMappingIgnore() { RawSql rawSql = RawSqlBuilder .unparsed("select 'a', type, id, 'b' from rawinherit_parent where val > 1") .columnMappingIgnore("a") // extra ignore before .columnMappingIgnore("type") .columnMapping("id", "parent.id") .columnMappingIgnore("b") // extra ignore after .create(); List<ParentAggregate> aggregates = Ebean.find(ParentAggregate.class).setRawSql(rawSql) .fetch("parent", new FetchConfig().query()) .findList(); List<Parent> partial = new ArrayList<>(); for (ParentAggregate aggregate : aggregates) { partial.add(aggregate.parent); } assertNotNull(partial.get(0).getData()); assertEquals(partial.get(0).getData().get(0).getVal().intValue(), 0); } }