diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 0eb0d9edb0..ee9bf96c95 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -66,6 +66,7 @@ import static org.jooq.SQLDialect.SQLITE; import java.math.BigDecimal; import java.util.Collection; import java.util.Map; +import java.util.function.Function; import org.jooq.conf.Settings; import org.jooq.impl.DSL; @@ -172,6 +173,32 @@ public interface Field extends SelectField, GroupField, FieldOrRow { @Support Field as(Field otherField); + + /** + * Create an alias for this field. + *

+ * Note that the case-sensitivity of the returned field depends on + * {@link Settings#getRenderNameStyle()}. By default, field aliases are + * quoted, and thus case-sensitive! + *

+ * This works like {@link #as(String)}, except that field aliases are + * provided by a function. This is useful, for instance, to prefix all + * columns with a common prefix (on {@link Table#as(String, Function)}): + *

+ *

+     * MY_TABLE.as("t1", f -> "prefix_" + f.getName());
+     * 
+ *

+ * And then to use the same function also for individual fields: + *

+ *

+     * MY_TABLE.MY_COLUMN.as(f -> "prefix_" + f.getName());
+     * 
+ */ + @Support + Field as(Function, ? extends String> aliasFunction); + + /** * {@inheritDoc} *

diff --git a/jOOQ/src/main/java/org/jooq/FieldLike.java b/jOOQ/src/main/java/org/jooq/FieldLike.java index 01b17df8c6..b466657011 100644 --- a/jOOQ/src/main/java/org/jooq/FieldLike.java +++ b/jOOQ/src/main/java/org/jooq/FieldLike.java @@ -40,6 +40,8 @@ */ package org.jooq; +import java.util.function.Function; + import org.jooq.conf.Settings; /** @@ -50,7 +52,7 @@ import org.jooq.conf.Settings; public interface FieldLike { /** - * The underlying field representation of this object + * The underlying field representation of this object. *

* This method is useful for things like * SELECT y.*, (SELECT a FROM x) FROM y @@ -60,7 +62,7 @@ public interface FieldLike { Field asField(); /** - * The underlying field representation of this object + * The underlying field representation of this object. *

* This method is useful for things like * SELECT y.*, (SELECT a FROM x) [alias] FROM y @@ -73,4 +75,33 @@ public interface FieldLike { */ Field asField(String alias); + + /** + * The underlying field representation of this object. + *

+ * This method is useful for things like + * SELECT y.*, (SELECT a FROM x) [alias] FROM y + *

+ * Note that the case-sensitivity of the returned field depends on + * {@link Settings#getRenderNameStyle()}. By default, field aliases are + * quoted, and thus case-sensitive! + *

+ * This works like {@link #asField(String)}, except that field aliases are + * provided by a function. This is useful, for instance, to prefix all + * columns with a common prefix (on {@link Table#as(String, Function)}): + *

+ *

+     * MY_TABLE.as("t1", f -> "prefix_" + f.getName());
+     * 
+ *

+ * And then to use the same function also for individual fields: + *

+ *

+     * MY_TABLE.MY_COLUMN.as(f -> "prefix_" + f.getName());
+     * 
+ */ + @Support + Field asField(Function, ? extends String> aliasFunction); + + } diff --git a/jOOQ/src/main/java/org/jooq/Table.java b/jOOQ/src/main/java/org/jooq/Table.java index 7249102a18..f70a994aa9 100644 --- a/jOOQ/src/main/java/org/jooq/Table.java +++ b/jOOQ/src/main/java/org/jooq/Table.java @@ -67,6 +67,7 @@ import static org.jooq.SQLDialect.SQLITE; import java.sql.Timestamp; import java.util.Collection; import java.util.List; +import java.util.function.Function; import org.jooq.conf.Settings; import org.jooq.impl.DSL; @@ -292,7 +293,7 @@ public interface Table extends TableLike { Table as(String alias); /** - * Create an alias for this table and its fields + * Create an alias for this table and its fields. *

* Note that the case-sensitivity of the returned table and columns depends * on {@link Settings#getRenderNameStyle()}. By default, table aliases are @@ -345,6 +346,26 @@ public interface Table extends TableLike { @Support Table as(String alias, String... fieldAliases); + + /** + * Create an alias for this table and its fields. + *

+ * This works like {@link #as(String, String...)}, except that field aliases + * are provided by a function. This is useful, for instance, to prefix all + * columns with a common prefix: + *

+ *

+     * MY_TABLE.as("t1", f -> "prefix_" + f.getName());
+     * 
+ * + * @param alias The alias name + * @param aliasFunction The function providing field aliases. + * @return The table alias + */ + @Support + Table as(String alias, Function, ? extends String> aliasFunction); + + /** * Create an alias for this table based on another table's name. *

@@ -373,6 +394,26 @@ public interface Table extends TableLike { @Support Table as(Table otherTable, Field... otherFields); + + /** + * Create an alias for this table and its fields. + *

+ * This works like {@link #as(String, String...)}, except that field aliases + * are provided by a function. This is useful, for instance, to prefix all + * columns with a common prefix: + *

+ *

+     * MY_TABLE.as(MY_OTHER_TABLE, f -> MY_OTHER_TABLE.field(f));
+     * 
+ * + * @param alias The alias name + * @param aliasFunction The function providing field aliases. + * @return The table alias + */ + @Support + Table as(Table otherTable, Function, ? extends Field> aliasFunction); + + // ------------------------------------------------------------------------- // XXX: JOIN clauses on tables // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/TableLike.java b/jOOQ/src/main/java/org/jooq/TableLike.java index c068d1c32d..ea547c0f24 100644 --- a/jOOQ/src/main/java/org/jooq/TableLike.java +++ b/jOOQ/src/main/java/org/jooq/TableLike.java @@ -40,6 +40,8 @@ */ package org.jooq; +import java.util.function.Function; + /** * An object that can behave like a table (a table-like object) * @@ -192,4 +194,15 @@ public interface TableLike extends QueryPart { */ @Support Table asTable(String alias, String... fieldAliases); + + + + /** + * The underlying aliased table representation of this object + * + * @see Table#as(String, Function) + */ + @Support + Table asTable(String alias, Function, ? extends String> aliasFunction); + } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 512ceea4b6..8242024471 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -77,6 +77,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Function; import org.jooq.BetweenAndStep; import org.jooq.Binding; @@ -155,6 +156,11 @@ abstract class AbstractField extends AbstractQueryPart implements Field { return as(otherField.getName()); } + @Override + public final Field as(Function, ? extends String> aliasFunction) { + return as(aliasFunction.apply(this)); + } + @Override public final String getName() { return name; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 89adc930e8..5c0ca3de8c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -64,6 +64,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; import org.jooq.Binding; import org.jooq.Catalog; @@ -266,6 +268,18 @@ abstract class AbstractTable extends AbstractQueryPart impleme return as(alias, fieldAliases); } + + @Override + public final Table asTable(String alias, Function, ? extends String> aliasFunction) { + return as(alias, aliasFunction); + } + + @Override + public final Table as(String alias, Function, ? extends String> aliasFunction) { + return as(alias, Stream.of(fields()).map(aliasFunction).toArray(String[]::new)); + } + + // ------------------------------------------------------------------------ // XXX: Table API // ------------------------------------------------------------------------ @@ -621,6 +635,13 @@ abstract class AbstractTable extends AbstractQueryPart impleme } + @Override + public final Table as(Table otherTable, Function, ? extends Field> aliasFunction) { + return as(otherTable.getName(), f -> aliasFunction.apply(f).getName()); + } + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java index 822e9014c6..1654fbaaf8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java @@ -57,6 +57,7 @@ import java.util.Set; import java.util.concurrent.CompletionStage; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; +import java.util.function.Function; import java.util.stream.Stream; import javax.annotation.Generated; @@ -3640,6 +3641,13 @@ final class SelectImpl asTable(String alias, Function, ? extends String> aliasFunction) { + return getDelegate().asTable(alias, aliasFunction); + } + + @Override public final Field asField() { return getDelegate().asField(); @@ -3650,6 +3658,13 @@ final class SelectImpl Field asField(Function, ? extends String> aliasFunction) { + return getDelegate().asField(aliasFunction); + } + + @Override public final Row fieldsRow() { return getDelegate().fieldsRow(); diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index ffe283fdbc..65ef76959b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -117,6 +117,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import org.jooq.Clause; import org.jooq.Condition; @@ -266,6 +267,13 @@ final class SelectQueryImpl extends AbstractResultQuery imp return this. asField().as(alias); } + + @Override + public Field asField(Function, ? extends String> aliasFunction) { + return this. asField().as(aliasFunction); + } + + @Override public final Row fieldsRow() { return asTable().fieldsRow(); @@ -363,6 +371,13 @@ final class SelectQueryImpl extends AbstractResultQuery imp return new DerivedTable(this).as(alias, fieldAliases); } + + @Override + public final Table asTable(String alias, Function, ? extends String> aliasFunction) { + return new DerivedTable(this).as(alias, aliasFunction); + } + + @Override protected final Field[] getFields(ResultSetMetaData meta) {