[#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:
Lukas Eder 2013-02-08 19:10:49 +01:00
parent 7acb6ebe8c
commit 7ce2b9d8c5
16 changed files with 78 additions and 60 deletions

View File

@ -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());

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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

View File

@ -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();
}
// ------------------------------------------------------------------------

View File

@ -95,7 +95,7 @@ class QualifiedTable extends AbstractTable<Record> {
}
@Override
protected final FieldList fields0() {
return new FieldList();
final Fields fields0() {
return new Fields();
}
}

View File

@ -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;
}
// ------------------------------------------------------------------------

View File

@ -90,7 +90,7 @@ class SQLTable extends AbstractTable<Record> {
}
@Override
protected final FieldList fields0() {
return new FieldList();
final Fields fields0() {
return new Fields();
}
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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());
}
}

View File

@ -95,7 +95,7 @@ class WithTable<R extends Record> extends AbstractTable<R> {
}
@Override
final FieldList fields0() {
final Fields fields0() {
return delegate.fields0();
}
}