[#671] Allow for nesting JOIN clauses
This commit is contained in:
parent
10720d1fe6
commit
0ba28f37da
@ -5985,18 +5985,71 @@ public abstract class jOOQAbstractTest<
|
||||
"Ex Libris", "Orell Füssli", "Orell Füssli",
|
||||
"Buchhandlung im Volkshaus", "Ex Libris", "Orell Füssli"), result4.getValues(1));
|
||||
|
||||
// Test inverse join relationship [#671] TODO
|
||||
// ------------------------------
|
||||
// Result<Record> result5 =
|
||||
// create().select(TBook_TITLE(), TBookStore_NAME())
|
||||
// .from(TBook())
|
||||
// .join(TBookToBookStore()
|
||||
// .join(TBookStore()).onKey())
|
||||
// .onKey()
|
||||
// .orderBy(TBook_ID(), TBookStore_NAME())
|
||||
// .fetch();
|
||||
//
|
||||
// assertEquals(result4, result5);
|
||||
// [#671] Test inverse join relationship
|
||||
// -------------------------------------
|
||||
Result<Record> result5 =
|
||||
create().select(TBook_ID(), TBookStore_NAME())
|
||||
.from(TBook())
|
||||
.join(TBookToBookStore()
|
||||
.join(TBookStore()).onKey())
|
||||
.onKey()
|
||||
.orderBy(TBook_ID(), TBookStore_NAME())
|
||||
.fetch();
|
||||
|
||||
assertEquals(result4, result5);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInverseAndNestedJoin() throws Exception {
|
||||
|
||||
// Testing joining of nested joins
|
||||
// -------------------------------
|
||||
Result<Record> result1 = create()
|
||||
.select(
|
||||
TAuthor_ID(),
|
||||
TBook_ID(),
|
||||
TBookStore_NAME())
|
||||
.from(TAuthor()
|
||||
.join(TBook())
|
||||
.on(TAuthor_ID().equal(TBook_AUTHOR_ID())))
|
||||
.join(TBookToBookStore()
|
||||
.join(TBookStore())
|
||||
.on(TBookToBookStore_BOOK_STORE_NAME().equal(TBookStore_NAME())))
|
||||
.on(TBook_ID().equal(TBookToBookStore_BOOK_ID()))
|
||||
.orderBy(TBook_ID(), TBookStore_NAME())
|
||||
.fetch();
|
||||
|
||||
assertEquals(6, result1.size());
|
||||
assertEquals(asList(1, 1, 1, 2, 2, 2), result1.getValues(0));
|
||||
assertEquals(asList(1, 1, 2, 3, 3, 3), result1.getValues(1));
|
||||
assertEquals(asList(
|
||||
"Ex Libris", "Orell Füssli", "Orell Füssli",
|
||||
"Buchhandlung im Volkshaus", "Ex Libris", "Orell Füssli"), result1.getValues(2));
|
||||
|
||||
// Testing joining of cross products
|
||||
Result<Record> result2 = create()
|
||||
.select(
|
||||
TAuthor_ID(),
|
||||
TBook_ID(),
|
||||
TBookStore_NAME())
|
||||
.from(TAuthor()
|
||||
.join(TBook())
|
||||
.on(TAuthor_ID().equal(TBook_AUTHOR_ID())),
|
||||
TBookToBookStore()
|
||||
.join(TBookStore())
|
||||
.on(TBookToBookStore_BOOK_STORE_NAME().equal(TBookStore_NAME())))
|
||||
.where(TBook_ID().equal(TBookToBookStore_BOOK_ID()))
|
||||
.orderBy(TBook_ID(), TBookStore_NAME())
|
||||
.fetch();
|
||||
|
||||
assertEquals(6, result2.size());
|
||||
assertEquals(asList(1, 1, 1, 2, 2, 2), result2.getValues(0));
|
||||
assertEquals(asList(1, 1, 2, 3, 3, 3), result2.getValues(1));
|
||||
assertEquals(asList(
|
||||
"Ex Libris", "Orell Füssli", "Orell Füssli",
|
||||
"Buchhandlung im Volkshaus", "Ex Libris", "Orell Füssli"), result2.getValues(2));
|
||||
|
||||
assertEquals(result1, result2);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@ -114,7 +114,12 @@ class JoinTable extends AbstractTable<Record> implements TableOnStep, TableOnCon
|
||||
.sql(" ")
|
||||
.sql(getType(context).toSQL())
|
||||
.sql(" ")
|
||||
.sql(rhs);
|
||||
|
||||
// [#671] Some databases formally require nested JOINS to be
|
||||
// wrapped in parentheses (e.g. MySQL)
|
||||
.sql(rhs instanceof JoinTable ? "(" : "")
|
||||
.sql(rhs)
|
||||
.sql(rhs instanceof JoinTable ? ")" : "");
|
||||
|
||||
switch (getType(context)) {
|
||||
|
||||
@ -129,7 +134,7 @@ class JoinTable extends AbstractTable<Record> implements TableOnStep, TableOnCon
|
||||
|
||||
// Regular JOINs
|
||||
default: {
|
||||
toSQL0(context);
|
||||
toSQLJoinCondition(context);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -144,7 +149,7 @@ class JoinTable extends AbstractTable<Record> implements TableOnStep, TableOnCon
|
||||
}
|
||||
}
|
||||
|
||||
private void toSQL0(RenderContext context) {
|
||||
private void toSQLJoinCondition(RenderContext context) {
|
||||
if (!using.isEmpty()) {
|
||||
context.sql(" using (");
|
||||
Util.toSQLNames(context, using);
|
||||
@ -169,7 +174,7 @@ class JoinTable extends AbstractTable<Record> implements TableOnStep, TableOnCon
|
||||
|
||||
@Override
|
||||
public final Table<Record> as(String alias) {
|
||||
return new TableAlias<Record>(this, alias);
|
||||
return new TableAlias<Record>(this, alias, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -301,7 +301,7 @@ implements
|
||||
|
||||
@Override
|
||||
public final Table<Record> as(String alias) {
|
||||
return new TableAlias<Record>(this, alias);
|
||||
return new TableAlias<Record>(this, alias, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Loading…
Reference in New Issue
Block a user