package org.jooq.impl;
import static org.jooq.SQLDialect.DERBY;
import static org.jooq.impl.DSL.selectFrom;
import static org.jooq.impl.Names.N_SELECT;
import static org.jooq.impl.Tools.selectQueryImpl;
import static org.jooq.impl.Tools.visitSubquery;
import static org.jooq.impl.Tools.DataKey.DATA_SELECT_ALIASES;
import org.jooq.Clause;
import org.jooq.Context;
import org.jooq.Name;
import org.jooq.Record;
import org.jooq.Select;
import org.jooq.Table;
import org.jooq.TableOptions;
final class AliasedSelect<R extends Record> extends AbstractTable<R> {
private static final long serialVersionUID = 6763689261249123076L;
private final Select<R> query;
private final Name[] aliases;
AliasedSelect(Select<R> query) {
this(query, Tools.fieldNames(Tools.degree(query)));
}
AliasedSelect(Select<R> query, Name... aliases) {
super(TableOptions.expression(), N_SELECT);
this.query = query;
this.aliases = aliases;
}
final Select<R> query() {
return query;
}
@Override
public final Table<R> as(Name alias) {
SelectQueryImpl<R> q = selectQueryImpl(query);
if (q != null && (!q.getOrderBy().isEmpty() || Tools.hasEmbeddedFields(q.getSelect())))
return query.asTable(alias, aliases);
else
return new TableAlias<>(this, alias, true);
}
@Override
public final Table<R> as(Name alias, Name... fieldAliases) {
return new TableAlias<>(this, alias, fieldAliases, true);
}
@Override
final Fields<R> fields0() {
return new Fields<>(query.asTable(DSL.name("t"), aliases).fields());
}
@Override
public final Class<? extends R> getRecordType() {
return query.getRecordType();
}
@Override
public final void accept(Context<?> ctx) {
SelectQueryImpl<R> q = selectQueryImpl(query);
if (ctx.family() == DERBY && q != null && q.hasUnions()) {
visitSubquery(ctx, selectFrom(query.asTable(DSL.name("t"), aliases)));
}
else {
Object previous = ctx.data(DATA_SELECT_ALIASES);
ctx.data(DATA_SELECT_ALIASES, aliases);
visitSubquery(ctx, query);
ctx.data(DATA_SELECT_ALIASES, previous);
}
}
@Override
public final Clause[] clauses(Context<?> ctx) {
return null;
}
}