From 900893613841dd4dccb801d26f1fbd68c295f69b Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 1 Feb 2013 14:41:24 +0100 Subject: [PATCH] Improved performance of RowImpl.indexOf() and similar operations, resulting in a 60% performance gain in a relevant Record.setValue(), Record.getValue() benchmark --- jOOQ-tools/src/org/jooq/xtend/Records.xtend | 2 +- jOOQ-tools/src/org/jooq/xtend/Rows.xtend | 55 ++++++----- .../main/java/org/jooq/impl/RecordImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/RowImpl.java | 97 ++++++++++--------- .../java/org/jooq/impl/TableRecordImpl.java | 2 +- .../java/org/jooq/impl/UDTRecordImpl.java | 2 +- .../org/jooq/impl/UpdatableRecordImpl.java | 2 +- 7 files changed, 86 insertions(+), 76 deletions(-) diff --git a/jOOQ-tools/src/org/jooq/xtend/Records.xtend b/jOOQ-tools/src/org/jooq/xtend/Records.xtend index 2196f549fc..2095a9a0b3 100644 --- a/jOOQ-tools/src/org/jooq/xtend/Records.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/Records.xtend @@ -181,7 +181,7 @@ class Records extends Generators { @Override public final RowImpl<«TN(Constants::MAX_ROW_DEGREE)»> valuesRow() { - return new RowImpl(vals(intoArray(), fields.fields)); + return new RowImpl(vals(intoArray(), fields.fields())); } «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 566ee5af69..c7c52db48f 100644 --- a/jOOQ-tools/src/org/jooq/xtend/Rows.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/Rows.xtend @@ -1117,7 +1117,6 @@ class Rows extends Generators { «classHeader» package org.jooq.impl; - import static java.util.Arrays.asList; import static org.jooq.impl.Factory.row; import static org.jooq.impl.Factory.vals; @@ -1136,6 +1135,7 @@ class Rows extends Generators { import org.jooq.Condition; import org.jooq.DataType; import org.jooq.Field; + import org.jooq.QueryPart; import org.jooq.Record; «FOR degree : (1..Constants::MAX_ROW_DEGREE)» import org.jooq.Record«degree»; @@ -1168,16 +1168,18 @@ class Rows extends Generators { */ private static final long serialVersionUID = -929427349071556318L; - final Field[] fields; + final FieldList fields; RowImpl(Field... fields) { super(); - this.fields = fields; + this.fields = new FieldList(fields); } RowImpl(Collection> fields) { - this(fields.toArray(new Field[fields.size()])); + super(); + + this.fields = new FieldList(fields); } // ------------------------------------------------------------------------ @@ -1201,7 +1203,7 @@ class Rows extends Generators { @Override public final void bind(BindContext context) { - context.bind(fields); + context.bind((QueryPart) fields); } // ------------------------------------------------------------------------ @@ -1210,45 +1212,46 @@ class Rows extends Generators { @Override public final int size() { - return fields.length; + return fields.size(); } @Override public final Field field(Field field) { - return new FieldList(fields).field(field); + return fields.field(field); } @Override public final Field field(String name) { - return new FieldList(fields).field(name); + return fields.field(name); } @Override public final Field field(int index) { - return new FieldList(fields).field(index); + return fields.field(index); } - + @Override public final Field[] fields() { - return fields.clone(); + return fields.fields(); } @Override public final int indexOf(Field field) { - return new FieldList(fields).indexOf(field); + return fields.indexOf(field); } @Override public final int indexOf(String fieldName) { - return new FieldList(fields).indexOf(fieldName); + return fields.indexOf(fieldName); } @Override public final Class[] types() { - Class[] result = new Class[fields.length]; + int size = fields.size(); + Class[] result = new Class[size]; - for (int i = 0; i < fields.length; i++) { - result[i] = fields[i].getType(); + for (int i = 0; i < size; i++) { + result[i] = fields.field(i).getType(); } return result; @@ -1256,19 +1259,20 @@ class Rows extends Generators { @Override public final DataType[] dataTypes() { - DataType[] result = new DataType[fields.length]; - - for (int i = 0; i < fields.length; i++) { - result[i] = fields[i].getDataType(); - } - - return result; + int size = fields.size(); + DataType[] result = new DataType[size]; + + for (int i = 0; i < size; i++) { + result[i] = fields.field(i).getDataType(); + } + + return result; } «FOR degree : (1..Constants::MAX_ROW_DEGREE)» @Override public final Field field«degree»() { - return (Field) fields[«degree - 1»]; + return (Field) fields.field(«degree - 1»); } «ENDFOR» @@ -2143,9 +2147,10 @@ class Rows extends Generators { // ------------------------------------------------------------------------ // XXX: Other // ------------------------------------------------------------------------ + @Override public final Iterator> iterator() { - return asList(fields).iterator(); + return fields.iterator(); } } '''); diff --git a/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java index 01faae2cf2..bb32cf03cc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RecordImpl.java @@ -135,7 +135,7 @@ implements @Override public final RowImpl valuesRow() { - return new RowImpl(vals(intoArray(), fields.fields)); + return new RowImpl(vals(intoArray(), fields.fields())); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java index 5bf6975ee1..66b20774d9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowImpl.java @@ -35,7 +35,6 @@ */ package org.jooq.impl; -import static java.util.Arrays.asList; import static org.jooq.impl.Factory.row; import static org.jooq.impl.Factory.vals; @@ -73,6 +72,7 @@ import org.jooq.Comparator; import org.jooq.Condition; import org.jooq.DataType; import org.jooq.Field; +import org.jooq.QueryPart; import org.jooq.Record; import org.jooq.Record1; import org.jooq.Record2; @@ -162,16 +162,18 @@ implements */ private static final long serialVersionUID = -929427349071556318L; - final Field[] fields; + final FieldList fields; RowImpl(Field... fields) { super(); - this.fields = fields; + this.fields = new FieldList(fields); } RowImpl(Collection> fields) { - this(fields.toArray(new Field[fields.size()])); + super(); + + this.fields = new FieldList(fields); } // ------------------------------------------------------------------------ @@ -195,7 +197,7 @@ implements @Override public final void bind(BindContext context) { - context.bind(fields); + context.bind((QueryPart) fields); } // ------------------------------------------------------------------------ @@ -204,45 +206,46 @@ implements @Override public final int size() { - return fields.length; + return fields.size(); } @Override public final Field field(Field field) { - return new FieldList(fields).field(field); + return fields.field(field); } @Override public final Field field(String name) { - return new FieldList(fields).field(name); + return fields.field(name); } @Override public final Field field(int index) { - return new FieldList(fields).field(index); + return fields.field(index); } - + @Override public final Field[] fields() { - return fields.clone(); + return fields.fields(); } @Override public final int indexOf(Field field) { - return new FieldList(fields).indexOf(field); + return fields.indexOf(field); } @Override public final int indexOf(String fieldName) { - return new FieldList(fields).indexOf(fieldName); + return fields.indexOf(fieldName); } @Override public final Class[] types() { - Class[] result = new Class[fields.length]; + int size = fields.size(); + Class[] result = new Class[size]; - for (int i = 0; i < fields.length; i++) { - result[i] = fields[i].getType(); + for (int i = 0; i < size; i++) { + result[i] = fields.field(i).getType(); } return result; @@ -250,123 +253,124 @@ implements @Override public final DataType[] dataTypes() { - DataType[] result = new DataType[fields.length]; - - for (int i = 0; i < fields.length; i++) { - result[i] = fields[i].getDataType(); - } - - return result; + int size = fields.size(); + DataType[] result = new DataType[size]; + + for (int i = 0; i < size; i++) { + result[i] = fields.field(i).getDataType(); + } + + return result; } @Override public final Field field1() { - return (Field) fields[0]; + return (Field) fields.field(0); } @Override public final Field field2() { - return (Field) fields[1]; + return (Field) fields.field(1); } @Override public final Field field3() { - return (Field) fields[2]; + return (Field) fields.field(2); } @Override public final Field field4() { - return (Field) fields[3]; + return (Field) fields.field(3); } @Override public final Field field5() { - return (Field) fields[4]; + return (Field) fields.field(4); } @Override public final Field field6() { - return (Field) fields[5]; + return (Field) fields.field(5); } @Override public final Field field7() { - return (Field) fields[6]; + return (Field) fields.field(6); } @Override public final Field field8() { - return (Field) fields[7]; + return (Field) fields.field(7); } @Override public final Field field9() { - return (Field) fields[8]; + return (Field) fields.field(8); } @Override public final Field field10() { - return (Field) fields[9]; + return (Field) fields.field(9); } @Override public final Field field11() { - return (Field) fields[10]; + return (Field) fields.field(10); } @Override public final Field field12() { - return (Field) fields[11]; + return (Field) fields.field(11); } @Override public final Field field13() { - return (Field) fields[12]; + return (Field) fields.field(12); } @Override public final Field field14() { - return (Field) fields[13]; + return (Field) fields.field(13); } @Override public final Field field15() { - return (Field) fields[14]; + return (Field) fields.field(14); } @Override public final Field field16() { - return (Field) fields[15]; + return (Field) fields.field(15); } @Override public final Field field17() { - return (Field) fields[16]; + return (Field) fields.field(16); } @Override public final Field field18() { - return (Field) fields[17]; + return (Field) fields.field(17); } @Override public final Field field19() { - return (Field) fields[18]; + return (Field) fields.field(18); } @Override public final Field field20() { - return (Field) fields[19]; + return (Field) fields.field(19); } @Override public final Field field21() { - return (Field) fields[20]; + return (Field) fields.field(20); } @Override public final Field field22() { - return (Field) fields[21]; + return (Field) fields.field(21); } // ------------------------------------------------------------------------ @@ -9537,8 +9541,9 @@ implements // ------------------------------------------------------------------------ // XXX: Other // ------------------------------------------------------------------------ + @Override public final Iterator> iterator() { - return asList(fields).iterator(); + return fields.iterator(); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java index 70db3ac4cc..90116fd34d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableRecordImpl.java @@ -86,7 +86,7 @@ public class TableRecordImpl> extends AbstractRecord im @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { - return new RowImpl(vals(intoArray(), fields.fields)); + return new RowImpl(vals(intoArray(), fields.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 ed0ae7cec0..a4acb9d93d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTRecordImpl.java @@ -88,7 +88,7 @@ public class UDTRecordImpl> extends AbstractRecord implem @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Row valuesRow() { - return new RowImpl(vals(intoArray(), fields.fields)); + return new RowImpl(vals(intoArray(), fields.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 ab9120eb37..5f69ac012c 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.fields); + refresh(fields.fields.fields()); } @Override