diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 8af2290835..675a3b435b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -95,9 +95,9 @@ abstract class AbstractTable extends AbstractQueryPart impleme * TableAlias contains aliased fields of its * AliasProvider table. */ - abstract FieldList fields0(); + abstract Fields fields0(); - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({ "rawtypes" }) @Override public final Row fieldsRow() { return new RowImpl(fields0()); diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java index 1e3e237918..8a82b4e538 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayTable.java @@ -37,6 +37,9 @@ package org.jooq.impl; import static org.jooq.impl.Factory.fieldByName; +import java.util.ArrayList; +import java.util.List; + import org.jooq.ArrayRecord; import org.jooq.BindContext; import org.jooq.Configuration; @@ -63,9 +66,9 @@ class ArrayTable extends AbstractTable { */ private static final long serialVersionUID = 2380426377794577041L; - private final Field array; - private final FieldList field; - private final String alias; + private final Field array; + private final Fields field; + private final String alias; ArrayTable(Field array) { this(array, "array_table"); @@ -102,14 +105,27 @@ class ArrayTable extends AbstractTable { this.array = array; this.alias = alias; - this.field = new FieldList(); + this.field = init(alias, arrayType); + + init(alias, arrayType); + } + + @SuppressWarnings("unused") + ArrayTable(Field array, String alias, String[] fieldAliases) { + super(alias); + + throw new UnsupportedOperationException("This constructor is not yet implemented"); + } + + private static final Fields init(String alias, Class arrayType) { + List> result = new ArrayList>(); // [#1114] VARRAY/TABLE of OBJECT have more than one field if (UDTRecord.class.isAssignableFrom(arrayType)) { try { UDTRecord record = (UDTRecord) arrayType.newInstance(); for (Field f : record.fields()) { - this.field.add(fieldByName(f.getDataType(), alias, f.getName())); + result.add(fieldByName(f.getDataType(), alias, f.getName())); } } catch (Exception e) { @@ -119,15 +135,10 @@ class ArrayTable extends AbstractTable { // Simple array types have a synthetic field called "COLUMN_VALUE" else { - this.field.add(fieldByName(Factory.getDataType(arrayType), alias, "COLUMN_VALUE")); + result.add(fieldByName(Factory.getDataType(arrayType), alias, "COLUMN_VALUE")); } - } - @SuppressWarnings("unused") - ArrayTable(Field array, String alias, String[] fieldAliases) { - super(alias); - - throw new UnsupportedOperationException("This constructor is not yet implemented"); + return new Fields(result); } @Override @@ -286,7 +297,7 @@ class ArrayTable extends AbstractTable { } @Override - final FieldList fields0() { + final Fields fields0() { return ArrayTable.this.fields0(); } } @@ -297,7 +308,7 @@ class ArrayTable extends AbstractTable { } @Override - protected final FieldList fields0() { + final Fields fields0() { return field; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java b/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java index 4a75d9d2fe..f2c0ec057c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayTableSimulation.java @@ -62,7 +62,7 @@ class ArrayTableSimulation extends AbstractTable { private static final long serialVersionUID = 2392515064450536343L; private final Object[] array; - private final FieldList field; + private final Fields field; private final String alias; private final String fieldAlias; @@ -80,10 +80,9 @@ class ArrayTableSimulation extends AbstractTable { super(alias); this.array = array; - this.field = new FieldList(); this.alias = alias; this.fieldAlias = fieldAlias == null ? "COLUMN_VALUE" : fieldAlias; - this.field.add(fieldByName(Factory.getDataType(array.getClass().getComponentType()), alias, this.fieldAlias)); + this.field = new Fields(fieldByName(Factory.getDataType(array.getClass().getComponentType()), alias, this.fieldAlias)); } @Override @@ -127,7 +126,7 @@ class ArrayTableSimulation extends AbstractTable { } @Override - protected final FieldList fields0() { + final Fields fields0() { return field; } @@ -138,7 +137,7 @@ class ArrayTableSimulation extends AbstractTable { for (Object element : array) { // [#1081] Be sure to get the correct cast type also for null - Field val = Factory.val(element, field.get(0).getDataType()); + Field val = Factory.val(element, field.fields[0].getDataType()); Select subselect = create(configuration).select(val.as("COLUMN_VALUE")).select(); if (select == null) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Dual.java b/jOOQ/src/main/java/org/jooq/impl/Dual.java index af7f3215f8..b4c76370cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Dual.java +++ b/jOOQ/src/main/java/org/jooq/impl/Dual.java @@ -125,7 +125,7 @@ class Dual extends AbstractTable { public final void bind(BindContext context) {} @Override - protected final FieldList fields0() { - return new FieldList(); + final Fields fields0() { + return new Fields(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Fields.java b/jOOQ/src/main/java/org/jooq/impl/Fields.java index 4f5d519499..464f376b61 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Fields.java +++ b/jOOQ/src/main/java/org/jooq/impl/Fields.java @@ -51,7 +51,7 @@ import org.jooq.RenderContext; class Fields extends AbstractQueryPart { private static final long serialVersionUID = -6911012275707591576L; - final Field[] fields; + Field[] fields; Fields(Field... fields) { this.fields = fields; @@ -142,4 +142,14 @@ class Fields extends AbstractQueryPart { public final void bind(BindContext context) { new FieldList(fields).bind(context); } + + final void add(Field field) { + int length = fields.length; + + Field[] result = new Field[length + 1]; + System.arraycopy(fields, 0, result, 0, length); + result[length] = field; + + fields = result; + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java b/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java index 8937a36053..c0026340d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/FunctionTable.java @@ -102,7 +102,7 @@ class FunctionTable extends AbstractTable { } @Override - protected final FieldList fields0() { - return new FieldList(); + final Fields fields0() { + return new Fields(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 15b6da1b01..d7c99ef048 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -289,7 +289,7 @@ class JoinTable extends AbstractTable implements TableOptionalOnStep, Ta } @Override - protected final FieldList fields0() { + final Fields fields0() { Field[] l = lhs.asTable().fields(); Field[] r = rhs.asTable().fields(); Field[] all = new Field[l.length + r.length]; @@ -297,7 +297,7 @@ class JoinTable extends AbstractTable implements TableOptionalOnStep, Ta System.arraycopy(l, 0, all, 0, l.length); System.arraycopy(r, 0, all, l.length, r.length); - return new FieldList(all); + return new Fields(all); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Pivot.java b/jOOQ/src/main/java/org/jooq/impl/Pivot.java index 28dd042c07..341b20d709 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Pivot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Pivot.java @@ -287,7 +287,7 @@ implements } @Override - final FieldList fields0() { + final Fields fields0() { return Pivot.this.fields0(); } } @@ -321,8 +321,8 @@ implements } @Override - protected final FieldList fields0() { - return new FieldList(); + final Fields fields0() { + return new Fields(); } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java index 066d4d2ef2..01c693d6ed 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedTable.java @@ -95,7 +95,7 @@ class QualifiedTable extends AbstractTable { } @Override - protected final FieldList fields0() { - return new FieldList(); + final Fields fields0() { + return new Fields(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java index fb7d82dc30..927e2b0802 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java @@ -164,15 +164,17 @@ implements final Fields fields; RowImpl(Field... fields) { - super(); - - this.fields = new Fields(fields); + this(new Fields(fields)); } RowImpl(Collection> fields) { + this(new Fields(fields)); + } + + RowImpl(Fields fields) { super(); - this.fields = new Fields(fields.toArray(new Field[fields.size()])); + this.fields = fields; } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLTable.java b/jOOQ/src/main/java/org/jooq/impl/SQLTable.java index 9a47337e83..0c26dcf6d1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLTable.java @@ -90,7 +90,7 @@ class SQLTable extends AbstractTable { } @Override - protected final FieldList fields0() { - return new FieldList(); + final Fields fields0() { + return new Fields(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java index 513415639b..ec9301b83d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryAsTable.java @@ -68,8 +68,8 @@ class SelectQueryAsTable extends AbstractTable { } @Override - protected final FieldList fields0() { - return new FieldList(query.getSelect()); + final Fields fields0() { + return new Fields(query.getSelect()); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java index a89153465e..368453623d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java @@ -36,6 +36,7 @@ package org.jooq.impl; +import java.util.ArrayList; import java.util.List; import org.jooq.BindContext; @@ -54,7 +55,7 @@ class TableAlias extends AbstractTable { private static final long serialVersionUID = -8417114874567698325L; private final Alias> alias; - private final FieldList aliasedFields; + private final Fields aliasedFields; TableAlias(Table table, String alias) { this(table, alias, null, false); @@ -72,15 +73,15 @@ class TableAlias extends AbstractTable { super(alias, table.getSchema()); this.alias = new Alias>(table, alias, fieldAliases, wrapInParentheses); - this.aliasedFields = new FieldList(); - - registerFields(fieldAliases); + this.aliasedFields = init(fieldAliases); } /** * Register fields for this table alias */ - private final void registerFields(String[] fieldAliases) { + @SuppressWarnings({ "rawtypes", "unchecked" }) + private final Fields init(String[] fieldAliases) { + List> result = new ArrayList>(); Row row = this.alias.wrapped().fieldsRow(); int size = row.size(); @@ -92,15 +93,10 @@ class TableAlias extends AbstractTable { name = fieldAliases[i]; } - registerTableField(field, name); + result.add(new TableFieldImpl(name, field.getDataType(), this)); } - } - /** - * Register a field for this table alias - */ - private final void registerTableField(Field field, String name) { - aliasedFields.add(new TableFieldImpl(name, field.getDataType(), this)); + return new Fields(result); } /** @@ -145,7 +141,7 @@ class TableAlias extends AbstractTable { } @Override - protected final FieldList fields0() { + final Fields fields0() { return aliasedFields; } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index c311182d6b..493fefb9ba 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -54,7 +54,7 @@ public class TableImpl extends AbstractTable { private static final long serialVersionUID = 261033315221985068L; - private final FieldList fields; + private final Fields fields; private final Alias> alias; public TableImpl(String name) { @@ -68,7 +68,7 @@ public class TableImpl extends AbstractTable { public TableImpl(String name, Schema schema, Table aliased) { super(name, schema); - this.fields = new FieldList(); + this.fields = new Fields(); if (aliased != null) { alias = new Alias>(aliased, name); @@ -97,7 +97,7 @@ public class TableImpl extends AbstractTable { } @Override - protected final FieldList fields0() { + final Fields fields0() { return fields; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Values.java b/jOOQ/src/main/java/org/jooq/impl/Values.java index aaba48093a..022902c319 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Values.java +++ b/jOOQ/src/main/java/org/jooq/impl/Values.java @@ -157,7 +157,7 @@ class Values extends AbstractTable { } @Override - protected final FieldList fields0() { - return new FieldList(rows[0].fields()); + final Fields fields0() { + return new Fields(rows[0].fields()); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/WithTable.java b/jOOQ/src/main/java/org/jooq/impl/WithTable.java index 2cceb35fb6..6b7c7b246a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WithTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/WithTable.java @@ -95,7 +95,7 @@ class WithTable extends AbstractTable { } @Override - final FieldList fields0() { + final Fields fields0() { return delegate.fields0(); } }