Improved performance of AbstractRecord.fieldsRow(), resulting in a
14% performance gain in a relevant Record.setValue(), Record.getValue() benchmark
This commit is contained in:
parent
212e3c81a6
commit
f4adc38d8e
@ -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]()
|
||||
|
||||
@ -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<T«degree»> field«degree»() {
|
||||
return (Field<T«degree»>) fields[«degree - 1»];
|
||||
return fields.field(«degree - 1»);
|
||||
}
|
||||
«ENDFOR»
|
||||
«FOR degree : (1..Constants::MAX_ROW_DEGREE)»
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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<? extends Field<?>> 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<Object>) field(fieldName), defaultValue);
|
||||
@ -248,7 +248,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
|
||||
return result == null ? defaultValue : result;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final <T> Value<T> 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<Object>(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> T original(Field<T> field) {
|
||||
return (T) original(fieldsRow().indexOf(field));
|
||||
@ -441,8 +439,9 @@ abstract class AbstractRecord extends AbstractStore implements Record {
|
||||
public final Map<String, Object> intoMap() {
|
||||
Map<String, Object> map = new LinkedHashMap<String, Object>();
|
||||
|
||||
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> E into(E object) {
|
||||
if (object == null) {
|
||||
@ -510,7 +508,6 @@ abstract class AbstractRecord extends AbstractStore implements Record {
|
||||
* may make sense to supply <code>String[]</code>, <code>Integer[]</code>
|
||||
* etc.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private final <E> E intoArray(Class<? extends E> 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> E intoImmutablePOJO(Class<? extends E> type) throws Exception {
|
||||
Constructor<E>[] constructors = (Constructor<E>[]) type.getDeclaredConstructors();
|
||||
|
||||
@ -732,7 +728,7 @@ abstract class AbstractRecord extends AbstractStore implements Record {
|
||||
|
||||
@Override
|
||||
public final ResultSet intoResultSet() {
|
||||
ResultImpl<Record> result = new ResultImpl<Record>(getConfiguration(), fields);
|
||||
ResultImpl<Record> result = new ResultImpl<Record>(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<String, ?> 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<AbstractRecord> result = new ResultImpl<AbstractRecord>(getConfiguration(), fields);
|
||||
Result<AbstractRecord> result = new ResultImpl<AbstractRecord>(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);
|
||||
|
||||
|
||||
@ -130,122 +130,122 @@ implements
|
||||
|
||||
@Override
|
||||
public RowImpl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> fieldsRow() {
|
||||
return new RowImpl(fields);
|
||||
return fields;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final RowImpl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> valuesRow() {
|
||||
return new RowImpl(vals(intoArray(), fields));
|
||||
return new RowImpl(vals(intoArray(), fields.fields));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T1> field1() {
|
||||
return (Field<T1>) fields[0];
|
||||
return fields.field(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T2> field2() {
|
||||
return (Field<T2>) fields[1];
|
||||
return fields.field(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T3> field3() {
|
||||
return (Field<T3>) fields[2];
|
||||
return fields.field(2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T4> field4() {
|
||||
return (Field<T4>) fields[3];
|
||||
return fields.field(3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T5> field5() {
|
||||
return (Field<T5>) fields[4];
|
||||
return fields.field(4);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T6> field6() {
|
||||
return (Field<T6>) fields[5];
|
||||
return fields.field(5);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T7> field7() {
|
||||
return (Field<T7>) fields[6];
|
||||
return fields.field(6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T8> field8() {
|
||||
return (Field<T8>) fields[7];
|
||||
return fields.field(7);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T9> field9() {
|
||||
return (Field<T9>) fields[8];
|
||||
return fields.field(8);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T10> field10() {
|
||||
return (Field<T10>) fields[9];
|
||||
return fields.field(9);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T11> field11() {
|
||||
return (Field<T11>) fields[10];
|
||||
return fields.field(10);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T12> field12() {
|
||||
return (Field<T12>) fields[11];
|
||||
return fields.field(11);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T13> field13() {
|
||||
return (Field<T13>) fields[12];
|
||||
return fields.field(12);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T14> field14() {
|
||||
return (Field<T14>) fields[13];
|
||||
return fields.field(13);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T15> field15() {
|
||||
return (Field<T15>) fields[14];
|
||||
return fields.field(14);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T16> field16() {
|
||||
return (Field<T16>) fields[15];
|
||||
return fields.field(15);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T17> field17() {
|
||||
return (Field<T17>) fields[16];
|
||||
return fields.field(16);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T18> field18() {
|
||||
return (Field<T18>) fields[17];
|
||||
return fields.field(17);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T19> field19() {
|
||||
return (Field<T19>) fields[18];
|
||||
return fields.field(18);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T20> field20() {
|
||||
return (Field<T20>) fields[19];
|
||||
return fields.field(19);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T21> field21() {
|
||||
return (Field<T21>) fields[20];
|
||||
return fields.field(20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Field<T22> field22() {
|
||||
return (Field<T22>) fields[21];
|
||||
return fields.field(21);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -162,7 +162,7 @@ implements
|
||||
*/
|
||||
private static final long serialVersionUID = -929427349071556318L;
|
||||
|
||||
private final Field<?>[] fields;
|
||||
final Field<?>[] fields;
|
||||
|
||||
RowImpl(Field<?>... fields) {
|
||||
super();
|
||||
|
||||
@ -75,10 +75,9 @@ public class TableRecordImpl<R extends TableRecord<R>> 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<R extends TableRecord<R>> 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")
|
||||
|
||||
@ -77,10 +77,9 @@ public class UDTRecordImpl<R extends UDTRecord<R>> 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<R extends UDTRecord<R>> extends AbstractRecord implem
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@Override
|
||||
public Row valuesRow() {
|
||||
return new RowImpl(vals(intoArray(), fields));
|
||||
return new RowImpl(vals(intoArray(), fields.fields));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -329,7 +329,7 @@ public class UpdatableRecordImpl<R extends UpdatableRecord<R>> extends TableReco
|
||||
|
||||
@Override
|
||||
public final void refresh() {
|
||||
refresh(fields);
|
||||
refresh(fields.fields);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Loading…
Reference in New Issue
Block a user