From b2dd7d4c217c2bf52f5977fc1b80039cd886ad27 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 5 Dec 2022 11:06:45 +0100 Subject: [PATCH] [jOOQ/jOOQ#14360] Add parser support for prefixed PARTITION BY .. OUTER JOIN syntax This includes: - [jOOQ/jOOQ#14361] Add API support for fullJoin(..).partitionBy(..) --- jOOQ/src/main/java/org/jooq/Table.java | 24 +-- .../java/org/jooq/TableOuterJoinStep.java | 198 +++++++++++++++++- .../java/org/jooq/impl/AbstractTable.java | 28 +-- .../main/java/org/jooq/impl/JoinTable.java | 2 +- .../main/java/org/jooq/impl/ParserImpl.java | 49 ++++- .../org/jooq/impl/PartitionJoinTable.java | 75 ++++++- 6 files changed, 344 insertions(+), 32 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Table.java b/jOOQ/src/main/java/org/jooq/Table.java index 9ad70df55a..ae483af983 100644 --- a/jOOQ/src/main/java/org/jooq/Table.java +++ b/jOOQ/src/main/java/org/jooq/Table.java @@ -1618,7 +1618,7 @@ extends */ @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) - TableOnStep fullJoin(TableLike table); + TablePartitionByStep fullJoin(TableLike table); /** * FULL OUTER JOIN a table to this table. @@ -1633,7 +1633,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullJoin(SQL sql); + TablePartitionByStep fullJoin(SQL sql); /** * FULL OUTER JOIN a table to this table. @@ -1648,7 +1648,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullJoin(String sql); + TablePartitionByStep fullJoin(String sql); /** * FULL OUTER JOIN a table to this table. @@ -1663,7 +1663,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullJoin(String sql, Object... bindings); + TablePartitionByStep fullJoin(String sql, Object... bindings); /** * FULL OUTER JOIN a table to this table. @@ -1678,7 +1678,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullJoin(String sql, QueryPart... parts); + TablePartitionByStep fullJoin(String sql, QueryPart... parts); /** * FULL OUTER JOIN a table to this table. @@ -1687,7 +1687,7 @@ extends */ @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) - TableOnStep fullJoin(Name name); + TablePartitionByStep fullJoin(Name name); /** * FULL OUTER JOIN a table to this table. @@ -1696,7 +1696,7 @@ extends */ @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) - TableOnStep fullOuterJoin(TableLike table); + TablePartitionByStep fullOuterJoin(TableLike table); /** * FULL OUTER JOIN a table to this table. @@ -1714,7 +1714,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullOuterJoin(SQL sql); + TablePartitionByStep fullOuterJoin(SQL sql); /** * FULL OUTER JOIN a table to this table. @@ -1732,7 +1732,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullOuterJoin(String sql); + TablePartitionByStep fullOuterJoin(String sql); /** * FULL OUTER JOIN a table to this table. @@ -1751,7 +1751,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullOuterJoin(String sql, Object... bindings); + TablePartitionByStep fullOuterJoin(String sql, Object... bindings); /** * FULL OUTER JOIN a table to this table. @@ -1770,7 +1770,7 @@ extends @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) @PlainSQL - TableOnStep fullOuterJoin(String sql, QueryPart... parts); + TablePartitionByStep fullOuterJoin(String sql, QueryPart... parts); /** * FULL OUTER JOIN a table to this table. @@ -1781,7 +1781,7 @@ extends */ @NotNull @Support({ FIREBIRD, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB }) - TableOnStep fullOuterJoin(Name name); + TablePartitionByStep fullOuterJoin(Name name); /** * CROSS JOIN a table to this table. diff --git a/jOOQ/src/main/java/org/jooq/TableOuterJoinStep.java b/jOOQ/src/main/java/org/jooq/TableOuterJoinStep.java index c105c99685..94e5982ebb 100644 --- a/jOOQ/src/main/java/org/jooq/TableOuterJoinStep.java +++ b/jOOQ/src/main/java/org/jooq/TableOuterJoinStep.java @@ -39,7 +39,7 @@ package org.jooq; import org.jetbrains.annotations.*; - +import static org.jooq.SQLDialect.DEFAULT; // ... import org.jooq.impl.DSL; @@ -484,6 +484,202 @@ public interface TableOuterJoinStep { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 0cc1eace6f..3f0c8db76c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -1337,7 +1337,7 @@ implements // ------------------------------------------------------------------------ @Override - public final TableOptionalOnStep join(TableLike table, JoinType type) { + public final JoinTable join(TableLike table, JoinType type) { switch (type) { case CROSS_APPLY: return new CrossApply(this, table); @@ -1569,62 +1569,62 @@ implements } @Override - public final TableOnStep fullOuterJoin(TableLike table) { - return join(table, FULL_OUTER_JOIN); + public final TablePartitionByStep fullOuterJoin(TableLike table) { + return (TablePartitionByStep) join(table, FULL_OUTER_JOIN); } @Override - public final TableOnStep fullOuterJoin(SQL sql) { + public final TablePartitionByStep fullOuterJoin(SQL sql) { return fullOuterJoin(table(sql)); } @Override - public final TableOnStep fullOuterJoin(String sql) { + public final TablePartitionByStep fullOuterJoin(String sql) { return fullOuterJoin(table(sql)); } @Override - public final TableOnStep fullOuterJoin(String sql, Object... bindings) { + public final TablePartitionByStep fullOuterJoin(String sql, Object... bindings) { return fullOuterJoin(table(sql, bindings)); } @Override - public final TableOnStep fullOuterJoin(String sql, QueryPart... parts) { + public final TablePartitionByStep fullOuterJoin(String sql, QueryPart... parts) { return fullOuterJoin(table(sql, parts)); } @Override - public final TableOnStep fullOuterJoin(Name name) { + public final TablePartitionByStep fullOuterJoin(Name name) { return fullOuterJoin(table(name)); } @Override - public final TableOnStep fullJoin(TableLike table) { + public final TablePartitionByStep fullJoin(TableLike table) { return fullOuterJoin(table); } @Override - public final TableOnStep fullJoin(SQL sql) { + public final TablePartitionByStep fullJoin(SQL sql) { return fullOuterJoin(sql); } @Override - public final TableOnStep fullJoin(String sql) { + public final TablePartitionByStep fullJoin(String sql) { return fullOuterJoin(sql); } @Override - public final TableOnStep fullJoin(String sql, Object... bindings) { + public final TablePartitionByStep fullJoin(String sql, Object... bindings) { return fullOuterJoin(sql, bindings); } @Override - public final TableOnStep fullJoin(String sql, QueryPart... parts) { + public final TablePartitionByStep fullJoin(String sql, QueryPart... parts) { return fullOuterJoin(sql, parts); } @Override - public final TableOnStep fullJoin(Name name) { + public final TablePartitionByStep fullJoin(Name name) { return fullOuterJoin(name); } diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 47a1d7b606..4e03c4e076 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -154,7 +154,7 @@ import org.jooq.impl.QOM.UnmodifiableList; */ abstract class JoinTable> extends - AbstractTable + AbstractTable implements TableOuterJoinStep, TableOptionalOnStep, diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 00fdd53da8..95e12a8bc7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -669,6 +669,7 @@ import org.jooq.TableField; import org.jooq.TableLike; import org.jooq.TableOnStep; import org.jooq.TableOptionalOnStep; +import org.jooq.TableOuterJoinStep; import org.jooq.TablePartitionByStep; import org.jooq.Truncate; import org.jooq.TruncateCascadeStep; @@ -7417,6 +7418,50 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private final Table parseJoinedTableIf(Table left, BooleanSupplier forbiddenKeywords) { + int p = position(); + if (!ignoreProEdition() && parseKeywordIf("PARTITION BY") && requireProEdition()) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + JoinType joinType = parseJoinTypeIf(); if (joinType == null) @@ -7433,9 +7478,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { case LEFT_OUTER_JOIN: case FULL_OUTER_JOIN: case RIGHT_OUTER_JOIN: - if (!ignoreProEdition() && parseKeywordIf("PARTITION BY")) { - requireProEdition(); - + if (!ignoreProEdition() && parseKeywordIf("PARTITION BY") && requireProEdition()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/PartitionJoinTable.java b/jOOQ/src/main/java/org/jooq/impl/PartitionJoinTable.java index 32adad1316..3d43eec706 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PartitionJoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/PartitionJoinTable.java @@ -37,6 +37,7 @@ */ package org.jooq.impl; +import static org.jooq.JoinType.FULL_OUTER_JOIN; import static org.jooq.JoinType.LEFT_OUTER_JOIN; import static org.jooq.JoinType.RIGHT_OUTER_JOIN; import static org.jooq.impl.DSL.table; @@ -52,8 +53,8 @@ import org.jooq.Record; import org.jooq.SQL; import org.jooq.Table; import org.jooq.TableLike; -import org.jooq.TableOnStep; import org.jooq.TableOuterJoinStep; +import org.jooq.TablePartitionByStep; /** * @author Lukas Eder @@ -218,6 +219,78 @@ final class PartitionJoinTable implements TableOuterJoinStep { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +