Browse Source

DATACMNS-743 - Optimizations in TypeDiscoverer getProperty(…) in case if invalid property names.

We now also cache a failed property lookup so that we can return null on a subsequent call for the same invalid property name right away and don't have to reattempt the lookup unnecessarily.
pull/163/merge
Oliver Gierke 10 years ago
parent
commit
65bfd5b33a
  1. 30
      src/main/java/org/springframework/data/util/TypeDiscoverer.java

30
src/main/java/org/springframework/data/util/TypeDiscoverer.java

@ -15,9 +15,11 @@
*/ */
package org.springframework.data.util; package org.springframework.data.util;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Value;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
@ -51,7 +53,7 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
private final Type type; private final Type type;
private final Map<TypeVariable<?>, Type> typeVariableMap; private final Map<TypeVariable<?>, Type> typeVariableMap;
private final Map<String, TypeInformation<?>> fieldTypes = new ConcurrentHashMap<String, TypeInformation<?>>(); private final Map<String, ValueHolder> fieldTypes = new ConcurrentHashMap<String, ValueHolder>();
private final int hashCode; private final int hashCode;
private boolean componentTypeResolved = false; private boolean componentTypeResolved = false;
@ -192,14 +194,14 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
int separatorIndex = fieldname.indexOf('.'); int separatorIndex = fieldname.indexOf('.');
if (separatorIndex == -1) { if (separatorIndex == -1) {
if (fieldTypes.containsKey(fieldname)) { if (fieldTypes.containsKey(fieldname)) {
return fieldTypes.get(fieldname); return fieldTypes.get(fieldname).getType();
} }
TypeInformation<?> propertyInformation = getPropertyInformation(fieldname); TypeInformation<?> propertyInformation = getPropertyInformation(fieldname);
if (propertyInformation != null) { fieldTypes.put(fieldname, ValueHolder.of(propertyInformation));
fieldTypes.put(fieldname, propertyInformation);
}
return propertyInformation; return propertyInformation;
} }
@ -603,4 +605,22 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
return result; return result;
} }
} }
/**
* Simple wrapper to be able to store {@literal null} values in a {@link ConcurrentHashMap}.
*
* @author Oliver Gierke
*/
@Value
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
private static class ValueHolder {
static ValueHolder NULL_HOLDER = new ValueHolder(null);
TypeInformation<?> type;
public static ValueHolder of(TypeInformation<?> type) {
return null == type ? NULL_HOLDER : new ValueHolder(type);
}
}
} }

Loading…
Cancel
Save