Provide a fast path for key construction in the rather common case of a

non-composite key (where ordering cannot be a problem). Boy I really wish I had
unit tests...
This commit is contained in:
Michael Bayne
2010-03-04 02:45:42 +00:00
parent 57e3cce8d0
commit c017ec5bd1
+17 -9
View File
@@ -135,36 +135,44 @@ public class Key<T extends PersistentRecord> extends WhereClause
// keep this for posterity // keep this for posterity
_pClass = pClass; _pClass = pClass;
// build a local map of field name -> field value
Map<ColumnExp, Comparable<?>> map = Maps.newHashMap();
for (int i = 0; i < fields.length; i ++) {
map.put(fields[i], values[i]);
}
// look up the cached primary key fields for this object // look up the cached primary key fields for this object
ColumnExp[] keyFields = DepotUtil.getKeyFields(pClass); ColumnExp[] keyFields = DepotUtil.getKeyFields(pClass);
// fast path!
if (fields.length == 1 && keyFields.length == 1 && keyFields[0].equals(fields[0])) {
_values = new Comparable<?>[] { values[0] };
} else {
// build a local map of field name -> field value
Map<ColumnExp, Comparable<?>> map = Maps.newHashMap();
for (int ii = 0; ii < fields.length; ii++) {
map.put(fields[ii], values[ii]);
}
// now extract the values in field order and ensure none are extra or missing // now extract the values in field order and ensure none are extra or missing
_values = new Comparable<?>[values.length]; _values = new Comparable<?>[values.length];
for (int ii = 0; ii < keyFields.length; ii++) { for (int ii = 0; ii < keyFields.length; ii++) {
Comparable<?> value = map.remove(keyFields[ii]); Comparable<?> value = map.remove(keyFields[ii]);
if (value == null) { if (value == null) {
// make sure we were provided with a value for this primary key field // make sure we were provided with a value for this primary key field
throw new IllegalArgumentException("Missing value for key field: " + keyFields[ii]); throw new IllegalArgumentException(
"Missing value for key field: " + keyFields[ii]);
} }
if (!(value instanceof Serializable)) { if (!(value instanceof Serializable)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Non-serializable argument [key=" + keyFields[ii] + ", value=" + value + "]"); "Non-serializable argument [key=" + keyFields[ii] +
", value=" + value + "]");
} }
_values[ii] = value; _values[ii] = value;
} }
// finally make sure we were not given any fields that are not in fact primary key fields // finally make sure we were not given any fields that are not primary key fields
if (map.size() > 0) { if (map.size() > 0) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Non-key columns given: " + StringUtil.join(map.keySet().toArray(), ", ")); "Non-key columns given: " + StringUtil.join(map.keySet().toArray(), ", "));
} }
} }
}
/** /**
* Used to create a key when you know you have the canonical values array. Don't call this * Used to create a key when you know you have the canonical values array. Don't call this