[#2178] Improve FieldList. Avoid creating excessive array lists,
where simple (immutable) Field<?>[] are sufficient - More improvements leading to another 50% performance increase
This commit is contained in:
parent
7acb6ebe8c
commit
7ce2b9d8c5
@ -95,9 +95,9 @@ abstract class AbstractTable<R extends Record> extends AbstractQueryPart impleme
|
||||
* <code>TableAlias</code> contains aliased fields of its
|
||||
* <code>AliasProvider</code> table.
|
||||
*/
|
||||
abstract FieldList fields0();
|
||||
abstract Fields fields0();
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
@Override
|
||||
public final Row fieldsRow() {
|
||||
return new RowImpl(fields0());
|
||||
|
||||
@ -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<Record> {
|
||||
*/
|
||||
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<Record> {
|
||||
|
||||
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<Field<?>> result = new ArrayList<Field<?>>();
|
||||
|
||||
// [#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<Record> {
|
||||
|
||||
// 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<Record> {
|
||||
}
|
||||
|
||||
@Override
|
||||
final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return ArrayTable.this.fields0();
|
||||
}
|
||||
}
|
||||
@ -297,7 +308,7 @@ class ArrayTable extends AbstractTable<Record> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return field;
|
||||
}
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ class ArrayTableSimulation extends AbstractTable<Record> {
|
||||
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<Record> {
|
||||
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<Record> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return field;
|
||||
}
|
||||
|
||||
@ -138,7 +137,7 @@ class ArrayTableSimulation extends AbstractTable<Record> {
|
||||
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<Record> subselect = create(configuration).select(val.as("COLUMN_VALUE")).select();
|
||||
|
||||
if (select == null) {
|
||||
|
||||
@ -125,7 +125,7 @@ class Dual extends AbstractTable<Record> {
|
||||
public final void bind(BindContext context) {}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList();
|
||||
final Fields fields0() {
|
||||
return new Fields();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ class FunctionTable<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList();
|
||||
final Fields fields0() {
|
||||
return new Fields();
|
||||
}
|
||||
}
|
||||
|
||||
@ -289,7 +289,7 @@ class JoinTable extends AbstractTable<Record> 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<Record> 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
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@ -95,7 +95,7 @@ class QualifiedTable extends AbstractTable<Record> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList();
|
||||
final Fields fields0() {
|
||||
return new Fields();
|
||||
}
|
||||
}
|
||||
|
||||
@ -164,15 +164,17 @@ implements
|
||||
final Fields fields;
|
||||
|
||||
RowImpl(Field<?>... fields) {
|
||||
super();
|
||||
|
||||
this.fields = new Fields(fields);
|
||||
this(new Fields(fields));
|
||||
}
|
||||
|
||||
RowImpl(Collection<? extends Field<?>> fields) {
|
||||
this(new Fields(fields));
|
||||
}
|
||||
|
||||
RowImpl(Fields fields) {
|
||||
super();
|
||||
|
||||
this.fields = new Fields(fields.toArray(new Field[fields.size()]));
|
||||
this.fields = fields;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
@ -90,7 +90,7 @@ class SQLTable extends AbstractTable<Record> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList();
|
||||
final Fields fields0() {
|
||||
return new Fields();
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,8 +68,8 @@ class SelectQueryAsTable<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList(query.getSelect());
|
||||
final Fields fields0() {
|
||||
return new Fields(query.getSelect());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -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<R extends Record> extends AbstractTable<R> {
|
||||
private static final long serialVersionUID = -8417114874567698325L;
|
||||
|
||||
private final Alias<Table<R>> alias;
|
||||
private final FieldList aliasedFields;
|
||||
private final Fields aliasedFields;
|
||||
|
||||
TableAlias(Table<R> table, String alias) {
|
||||
this(table, alias, null, false);
|
||||
@ -72,15 +73,15 @@ class TableAlias<R extends Record> extends AbstractTable<R> {
|
||||
super(alias, table.getSchema());
|
||||
|
||||
this.alias = new Alias<Table<R>>(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<Field<?>> result = new ArrayList<Field<?>>();
|
||||
Row row = this.alias.wrapped().fieldsRow();
|
||||
int size = row.size();
|
||||
|
||||
@ -92,15 +93,10 @@ class TableAlias<R extends Record> extends AbstractTable<R> {
|
||||
name = fieldAliases[i];
|
||||
}
|
||||
|
||||
registerTableField(field, name);
|
||||
result.add(new TableFieldImpl(name, field.getDataType(), this));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a field for this table alias
|
||||
*/
|
||||
private final <T> void registerTableField(Field<T> field, String name) {
|
||||
aliasedFields.add(new TableFieldImpl<R, T>(name, field.getDataType(), this));
|
||||
return new Fields(result);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -145,7 +141,7 @@ class TableAlias<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return aliasedFields;
|
||||
}
|
||||
|
||||
|
||||
@ -54,7 +54,7 @@ public class TableImpl<R extends Record> extends AbstractTable<R> {
|
||||
|
||||
private static final long serialVersionUID = 261033315221985068L;
|
||||
|
||||
private final FieldList fields;
|
||||
private final Fields fields;
|
||||
private final Alias<Table<R>> alias;
|
||||
|
||||
public TableImpl(String name) {
|
||||
@ -68,7 +68,7 @@ public class TableImpl<R extends Record> extends AbstractTable<R> {
|
||||
public TableImpl(String name, Schema schema, Table<R> aliased) {
|
||||
super(name, schema);
|
||||
|
||||
this.fields = new FieldList();
|
||||
this.fields = new Fields();
|
||||
|
||||
if (aliased != null) {
|
||||
alias = new Alias<Table<R>>(aliased, name);
|
||||
@ -97,7 +97,7 @@ public class TableImpl<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return fields;
|
||||
}
|
||||
|
||||
|
||||
@ -157,7 +157,7 @@ class Values<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final FieldList fields0() {
|
||||
return new FieldList(rows[0].fields());
|
||||
final Fields fields0() {
|
||||
return new Fields(rows[0].fields());
|
||||
}
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ class WithTable<R extends Record> extends AbstractTable<R> {
|
||||
}
|
||||
|
||||
@Override
|
||||
final FieldList fields0() {
|
||||
final Fields fields0() {
|
||||
return delegate.fields0();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user