diff --git a/jOOQ/src/main/java/org/jooq/TableLike.java b/jOOQ/src/main/java/org/jooq/TableLike.java index 3417891914..80bead287f 100644 --- a/jOOQ/src/main/java/org/jooq/TableLike.java +++ b/jOOQ/src/main/java/org/jooq/TableLike.java @@ -37,10 +37,27 @@ */ package org.jooq; +// ... +// ... +// ... +import static org.jooq.SQLDialect.H2; +// ... +import static org.jooq.SQLDialect.MARIADB; +import static org.jooq.SQLDialect.MYSQL; +// ... +import static org.jooq.SQLDialect.POSTGRES; +import static org.jooq.SQLDialect.SQLITE; +// ... +// ... +import static org.jooq.SQLDialect.YUGABYTEDB; +import static org.jooq.impl.DSL.selectFrom; + import java.util.Collection; import java.util.function.BiFunction; import java.util.function.Function; +import org.jooq.impl.DSL; + import org.jetbrains.annotations.NotNull; /** @@ -60,6 +77,14 @@ extends Table */ { + /** + * Turn this {@link TableLike} expression into a + * {@link DSL#multiset(TableLike)}. + */ + @NotNull + @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) + Field> asMultiset(); + /** * The underlying table representation of this object. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index c10027a1a1..9697861693 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -102,6 +102,7 @@ import org.jooq.QualifiedAsterisk; import org.jooq.QueryPart; import org.jooq.Record; import org.jooq.RecordType; +import org.jooq.Result; import org.jooq.Row; import org.jooq.RowId; import org.jooq.SQL; @@ -301,6 +302,11 @@ abstract class AbstractTable extends AbstractNamed implements return fieldsRow().fields(); } + @Override + public final Field> asMultiset() { + return DSL.multiset(this); + } + @Override public final Table asTable() { return this; diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index ed2224dc08..16b677a54e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -25624,8 +25624,8 @@ public class DSL { */ @NotNull @Support({ H2, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB }) - public static Field> multiset(Select select) { - return new Multiset<>(select); + public static Field> multiset(TableLike table) { + return new Multiset<>(table); } // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 8e045f5a60..199289b169 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -105,6 +105,7 @@ import org.jooq.SQLDialect; import org.jooq.Scope; import org.jooq.Select; import org.jooq.Table; +import org.jooq.TableLike; // ... import org.jooq.XML; import org.jooq.XMLAggOrderByStep; @@ -119,13 +120,19 @@ final class Multiset extends AbstractField> implemen static final Set NO_SUPPORT_XML_COMPARE = SQLDialect.supportedBy(POSTGRES); static final Set FORCE_LIMIT_IN_DERIVED_TABLE = SQLDialect.supportedBy(MARIADB, MYSQL); + final TableLike table; final Select select; + Multiset(TableLike table) { + this(table, table instanceof Select ? (Select) table : selectFrom(table)); + } + @SuppressWarnings("unchecked") - Multiset(Select select) { + private Multiset(TableLike table, Select select) { // [#12100] Can't use select.fieldsRow() here. super(N_MULTISET, new MultisetDataType<>((AbstractRow) DSL.row(select.getSelect()), select.getRecordType())); + this.table = table; this.select = select; } @@ -448,8 +455,8 @@ final class Multiset extends AbstractField> implemen // ------------------------------------------------------------------------- @Override - public final Select $select() { - return select; + public final TableLike $table() { + return table; } diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index c026c7c2d1..4c50856030 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -118,6 +118,7 @@ import org.jooq.Spatial; import org.jooq.Statement; import org.jooq.Table; import org.jooq.TableElement; +import org.jooq.TableLike; // ... // ... import org.jooq.WindowDefinition; @@ -855,7 +856,7 @@ public final class QOM { /*permits Multiset*/ { - @NotNull Select $select(); + @NotNull TableLike $table(); } public /*sealed*/ interface ScalarSubquery diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java index 7063e047f5..3202e1b01d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java @@ -2866,6 +2866,11 @@ implements return getDelegate().fetchMany(); } + @Override + public final Field> asMultiset() { + return getDelegate().asMultiset(); + } + @Override public final Table asTable() { return getDelegate().asTable(); diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 932c216b28..2647fab463 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -265,6 +265,7 @@ import org.jooq.QualifiedAsterisk; import org.jooq.QueryPart; import org.jooq.Record; // ... +import org.jooq.Result; import org.jooq.Row; import org.jooq.SQLDialect; import org.jooq.Scope; @@ -656,6 +657,11 @@ final class SelectQueryImpl extends AbstractResultQuery imp return asTable().fieldsRow(); } + @Override + public final Field> asMultiset() { + return DSL.multiset(this); + } + @Override public final Table asTable() { // [#13349] Delay the possibly expensive computation of the auto alias,