From f4adc38d8efae0b7fd7d5a6ddfef930abf21105e Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 1 Feb 2013 14:08:59 +0100 Subject: [PATCH] Improved performance of AbstractRecord.fieldsRow(), resulting in a 14% performance gain in a relevant Record.setValue(), Record.getValue() benchmark --- .../java/org/jooq/util/JavaGenerator.java | 7 +-- jOOQ-tools/src/org/jooq/xtend/Records.xtend | 6 +-- jOOQ-tools/src/org/jooq/xtend/Rows.xtend | 2 +- .../java/org/jooq/impl/AbstractRecord.java | 45 ++++++++--------- .../main/java/org/jooq/impl/RecordImpl.java | 48 +++++++++---------- jOOQ/src/main/java/org/jooq/impl/RowImpl.java | 2 +- .../java/org/jooq/impl/TableRecordImpl.java | 5 +- .../java/org/jooq/impl/UDTRecordImpl.java | 5 +- .../org/jooq/impl/UpdatableRecordImpl.java | 2 +- 9 files changed, 56 insertions(+), 66 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index e99d45d9d5..8df5cf59ef 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -37,8 +37,6 @@ package org.jooq.util; -import static org.jooq.util.GenerationUtil.range; - import java.io.File; import java.lang.reflect.TypeVariable; import java.util.ArrayList; @@ -70,7 +68,6 @@ import org.jooq.impl.ArrayRecordImpl; import org.jooq.impl.DAOImpl; import org.jooq.impl.DefaultDataType; import org.jooq.impl.Executor; -import org.jooq.impl.Factory; import org.jooq.impl.PackageImpl; import org.jooq.impl.SQLDataType; import org.jooq.impl.SchemaImpl; @@ -544,13 +541,13 @@ public class JavaGenerator extends AbstractGenerator { // fieldsRow() out.tab(1).overrideInherit(); out.tab(1).println("public %s%s<%s> fieldsRow() {", Row.class, degree, rowType); - out.tab(2).println("return %s.row([[field%s()]]);", Factory.class, range(1, degree)); + out.tab(2).println("return (%s%s) super.fieldsRow();", Row.class, degree); out.tab(1).println("}"); // valuesRow() out.tab(1).overrideInherit(); out.tab(1).println("public %s%s<%s> valuesRow() {", Row.class, degree, rowType); - out.tab(2).println("return %s.row([[value%s()]]);", Factory.class, range(1, degree)); + out.tab(2).println("return (%s%s) super.valuesRow();", Row.class, degree); out.tab(1).println("}"); // field[N]() diff --git a/jOOQ-tools/src/org/jooq/xtend/Records.xtend b/jOOQ-tools/src/org/jooq/xtend/Records.xtend index 563e3cf36e..2196f549fc 100644 --- a/jOOQ-tools/src/org/jooq/xtend/Records.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/Records.xtend @@ -176,18 +176,18 @@ class Records extends Generators { @Override public RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> fieldsRow() { - return new RowImpl(fields); + return fields; } @Override public final RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> valuesRow() { - return new RowImpl(vals(intoArray(), fields)); + return new RowImpl(vals(intoArray(), fields.fields)); } «FOR degree : (1..Constants::MAX_ROW_DEGREE)» @Override public final Field field«degree»() { - return (Field) fields[«degree - 1»]; + return fields.field(«degree - 1»); } «ENDFOR» «FOR degree : (1..Constants::MAX_ROW_DEGREE)» diff --git a/jOOQ-tools/src/org/jooq/xtend/Rows.xtend b/jOOQ-tools/src/org/jooq/xtend/Rows.xtend index aa17ed0ca0..566ee5af69 100644 --- a/jOOQ-tools/src/org/jooq/xtend/Rows.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/Rows.xtend @@ -1168,7 +1168,7 @@ class Rows extends Generators { */ private static final long serialVersionUID = -929427349071556318L; - private final Field[] fields; + final Field[] fields; RowImpl(Field... fields) { super(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java index d18f056e5d..eb758bad88 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRecord.java @@ -79,6 +79,7 @@ import org.jooq.tools.reflect.Reflect; * * @author Lukas Eder */ +@SuppressWarnings({ "rawtypes", "unchecked" }) abstract class AbstractRecord extends AbstractStore implements Record { /** @@ -86,15 +87,15 @@ abstract class AbstractRecord extends AbstractStore implements Record { */ private static final long serialVersionUID = -6052512608911220404L; - final Field[] fields; + final RowImpl fields; Value[] values; AbstractRecord(Collection> fields) { - this.fields = fields.toArray(new Field[fields.size()]); + this.fields = new RowImpl(fields); } AbstractRecord(Field... fields) { - this.fields = fields; + this.fields = new RowImpl(fields); } // ------------------------------------------------------------------------ @@ -133,12 +134,12 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final Field field(int index) { - return index >= 0 && index < fields.length ? fields[index] : null; + return index >= 0 && index < fields.size() ? fields.field(index) : null; } @Override public final Field[] fields() { - return fields.clone(); + return fields.fields(); } // ------------------------------------------------------------------------ @@ -147,7 +148,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final int size() { - return fields.length; + return fields.size(); } @Override @@ -220,7 +221,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { return getValue(field(fieldName)); } - @SuppressWarnings("unchecked") @Override public final Object getValue(String fieldName, Object defaultValue) { return getValue((Field) field(fieldName), defaultValue); @@ -248,7 +248,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { return result == null ? defaultValue : result; } - @SuppressWarnings("unchecked") final Value getValue0(int index) { Value[] v = getValues(); @@ -265,7 +264,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { final Value[] getValues() { if (values == null) { - values = new Value[fields.length]; + values = new Value[fields.size()]; for (int i = 0; i < values.length; i++) { values[i] = new Value(null); @@ -336,7 +335,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { */ @Override public Record original() { - AbstractRecord result = Utils.newRecord(getClass(), fields, getConfiguration()); + AbstractRecord result = Utils.newRecord(getClass(), fields.fields, getConfiguration()); Value[] v = getValues(); for (int i = 0; i < v.length; i++) { @@ -346,7 +345,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { return result; } - @SuppressWarnings("unchecked") @Override public final T original(Field field) { return (T) original(fieldsRow().indexOf(field)); @@ -441,8 +439,9 @@ abstract class AbstractRecord extends AbstractStore implements Record { public final Map intoMap() { Map map = new LinkedHashMap(); - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; + int size = fields.size(); + for (int i = 0; i < size; i++) { + Field field = fields.field(i); if (map.put(field.getName(), getValue(i)) != null) { throw new InvalidResultException("Field " + field.getName() + " is not unique in Record : " + this); @@ -474,7 +473,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { } } - @SuppressWarnings("unchecked") @Override public final E into(E object) { if (object == null) { @@ -510,7 +508,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { * may make sense to supply String[], Integer[] * etc. */ - @SuppressWarnings("unchecked") private final E intoArray(Class type) { int size = size(); Class componentType = type.getComponentType(); @@ -571,7 +568,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { * Convert this record into an "immutable" POJO (final fields, "matching" * constructor). */ - @SuppressWarnings("unchecked") private final E intoImmutablePOJO(Class type) throws Exception { Constructor[] constructors = (Constructor[]) type.getDeclaredConstructors(); @@ -732,7 +728,7 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final ResultSet intoResultSet() { - ResultImpl result = new ResultImpl(getConfiguration(), fields); + ResultImpl result = new ResultImpl(getConfiguration(), fields.fields); result.add(this); return result.intoResultSet(); } @@ -742,7 +738,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { return mapper.map(this); } - @SuppressWarnings("unchecked") @Override public final void from(Object source) { if (source == null) return; @@ -800,8 +795,9 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void fromMap(Map map) { - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; + int size = fields.size(); + for (int i = 0; i < size; i++) { + Field field = fields.field(i); String name = field.getName(); // Set only those values contained in the map @@ -813,8 +809,9 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public final void fromArray(Object... array) { - for (int i = 0; i < fields.length && i < array.length; i++) { - Utils.setValue(this, fields[i], array[i]); + int size = fields.size(); + for (int i = 0; i < size && i < array.length; i++) { + Utils.setValue(this, fields.field(i), array[i]); } } @@ -908,12 +905,11 @@ abstract class AbstractRecord extends AbstractStore implements Record { @Override public String toString() { - Result result = new ResultImpl(getConfiguration(), fields); + Result result = new ResultImpl(getConfiguration(), fields.fields); result.add(this); return result.toString(); } - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public int compareTo(Record that) { // Note: keep this implementation in-sync with AbstractStore.equals()! @@ -1010,7 +1006,6 @@ abstract class AbstractRecord extends AbstractStore implements Record { /** * Compare two arrays */ - @SuppressWarnings({ "rawtypes", "unchecked" }) final int compare(Object[] array1, Object[] array2) { int length = Math.min(array1.length, array2.length); diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java index 7d75e93c3e..01faae2cf2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java @@ -130,122 +130,122 @@ implements @Override public RowImpl fieldsRow() { - return new RowImpl(fields); + return fields; } @Override public final RowImpl valuesRow() { - return new RowImpl(vals(intoArray(), fields)); + return new RowImpl(vals(intoArray(), fields.fields)); } @Override public final Field field1() { - return (Field) fields[0]; + return fields.field(0); } @Override public final Field field2() { - return (Field) fields[1]; + return fields.field(1); } @Override public final Field field3() { - return (Field) fields[2]; + return fields.field(2); } @Override public final Field field4() { - return (Field) fields[3]; + return fields.field(3); } @Override public final Field field5() { - return (Field) fields[4]; + return fields.field(4); } @Override public final Field field6() { - return (Field) fields[5]; + return fields.field(5); } @Override public final Field field7() { - return (Field) fields[6]; + return fields.field(6); } @Override public final Field field8() { - return (Field) fields[7]; + return fields.field(7); } @Override public final Field field9() { - return (Field) fields[8]; + return fields.field(8); } @Override public final Field field10() { - return (Field) fields[9]; + return fields.field(9); } @Override public final Field field11() { - return (Field) fields[10]; + return fields.field(10); } @Override public final Field field12() { - return (Field) fields[11]; + return fields.field(11); } @Override public final Field field13() { - return (Field) fields[12]; + return fields.field(12); } @Override public final Field field14() { - return (Field) fields[13]; + return fields.field(13); } @Override public final Field field15() { - return (Field) fields[14]; + return fields.field(14); } @Override public final Field field16() { - return (Field) fields[15]; + return fields.field(15); } @Override public final Field field17() { - return (Field) fields[16]; + return fields.field(16); } @Override public final Field field18() { - return (Field) fields[17]; + return fields.field(17); } @Override public final Field field19() { - return (Field) fields[18]; + return fields.field(18); } @Override public final Field field20() { - return (Field) fields[19]; + return fields.field(19); } @Override public final Field field21() { - return (Field) fields[20]; + return fields.field(20); } @Override public final Field field22() { - return (Field) fields[21]; + return fields.field(21); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java index e67056885d..5bf6975ee1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java @@ -162,7 +162,7 @@ implements */ private static final long serialVersionUID = -929427349071556318L; - private final Field[] fields; + final Field[] fields; RowImpl(Field... fields) { super(); diff --git a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java index 6dfc006a05..70db3ac4cc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java @@ -75,10 +75,9 @@ public class TableRecordImpl> extends AbstractRecord im /* * Subclasses may override this method */ - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row fieldsRow() { - return new RowImpl(fields); + return fields; } /* @@ -87,7 +86,7 @@ public class TableRecordImpl> extends AbstractRecord im @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { - return new RowImpl(vals(intoArray(), fields)); + return new RowImpl(vals(intoArray(), fields.fields)); } @SuppressWarnings("unchecked") diff --git a/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java index b029e3cf3d..ed0ae7cec0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java @@ -77,10 +77,9 @@ public class UDTRecordImpl> extends AbstractRecord implem /* * Subclasses may override this method */ - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row fieldsRow() { - return new RowImpl(fields); + return fields; } /* @@ -89,7 +88,7 @@ public class UDTRecordImpl> extends AbstractRecord implem @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { - return new RowImpl(vals(intoArray(), fields)); + return new RowImpl(vals(intoArray(), fields.fields)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java index 84a571fb0d..ab9120eb37 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java @@ -329,7 +329,7 @@ public class UpdatableRecordImpl> extends TableReco @Override public final void refresh() { - refresh(fields); + refresh(fields.fields); } @Override