[jOOQ/jOOQ#13349] Select.asTable() should delay slow call to

Tools::autoAlias
This commit is contained in:
Lukas Eder 2022-03-30 11:18:54 +02:00
parent 23222356eb
commit 1d659422d8
2 changed files with 11 additions and 9 deletions

View File

@ -649,9 +649,9 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
@Override
public final Table<R> asTable() {
// Its usually better to alias nested selects that are used in
// the FROM clause of a query
return new DerivedTable<>(this).as(autoAlias(this));
// [#13349] Delay the possibly expensive computation of the auto alias,
// possibly making the computation unnecessary
return new DerivedTable<>(this).as(new LazyName(() -> DSL.name(autoAlias(this))));
}
@Override

View File

@ -59,8 +59,8 @@ import org.jooq.UniqueKey;
*/
final class TableAlias<R extends Record> extends AbstractTable<R> implements QOM.TableAlias<R> {
final Alias<Table<R>> alias;
final FieldsImpl<R> aliasedFields;
final Alias<Table<R>> alias;
transient FieldsImpl<R> aliasedFields;
TableAlias(Table<R> table, Name alias) {
this(table, alias, null, c -> false);
@ -78,17 +78,16 @@ final class TableAlias<R extends Record> extends AbstractTable<R> implements QOM
super(table.getOptions(), alias, table.getSchema());
this.alias = new Alias<>(table, this, alias, fieldAliases, wrapInParentheses);
this.aliasedFields = init(fieldAliases);
}
/**
* Register fields for this table alias
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private final FieldsImpl<R> init(Name[] fieldAliases) {
private final FieldsImpl<R> initFieldAliases() {
List<Field<?>> result = Tools.map(this.alias.wrapped().fieldsRow().fields(), (f, i) -> new TableFieldImpl(
fieldAliases != null && fieldAliases.length > i
? fieldAliases[i]
alias.fieldAliases != null && alias.fieldAliases.length > i
? alias.fieldAliases[i]
: f.getUnqualifiedName(), f.getDataType(), this, f.getCommentPart(), f.getBinding()
));
@ -157,6 +156,9 @@ final class TableAlias<R extends Record> extends AbstractTable<R> implements QOM
@Override
final FieldsImpl<R> fields0() {
if (aliasedFields == null)
aliasedFields = initFieldAliases();
return aliasedFields;
}