Performance - cache the path maps used for load context

- Cache the path maps
- Include the ToOne paths
- Use empty map for null prefix
This commit is contained in:
Rob Bygrave
2022-02-02 12:10:02 +13:00
parent 886f539fc4
commit 43af5343a4
4 changed files with 31 additions and 20 deletions
@@ -86,6 +86,8 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
private final ConcurrentHashMap<String, ElPropertyDeploy> elDeployCache = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, ElComparator<T>> comparatorCache = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, STreeProperty> dynamicProperty = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, Map<String,String>> pathMaps = new ConcurrentHashMap<>();
private final Map<String, SpiRawSql> namedRawSql;
private final Map<String, String> namedQuery;
private final boolean multiValueSupported;
@@ -2775,6 +2777,22 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
return draftableElement;
}
@Override
public Map<String, String> pathMap(String prefix) {
return pathMaps.computeIfAbsent(prefix, s -> {
HashMap<String, String> m = new HashMap<>();
for (STreePropertyAssocMany many : propsMany()) {
String name = many.name();
m.put(name, prefix + "." + name);
}
for (STreePropertyAssocOne one : propsOne()) {
String name = one.name();
m.put(name, prefix + "." + name);
}
return m.isEmpty() ? Collections.emptyMap() : m;
});
}
@Override
public boolean isEmbeddedPath(String propertyPath) {
ElPropertyDeploy elProp = elPropertyDeploy(propertyPath);
@@ -581,19 +581,19 @@ public final class CQuery<T> implements DbReadContext, CancelableQuery, SpiProfi
@Override
public void registerBeanInherit(BeanPropertyAssocOne<?> property, EntityBeanIntercept ebi) {
String path = getPath(property.name());
String path = path(property.name());
request.loadContext().register(path, ebi, property);
}
@Override
public void register(String path, EntityBeanIntercept ebi) {
path = getPath(path);
path = path(path);
request.loadContext().register(path, ebi);
}
@Override
public void register(BeanPropertyAssocMany<?> many, BeanCollection<?> bc) {
String path = getPath(many.name());
String path = path(many.name());
request.loadContext().register(path, many, bc);
}
@@ -663,18 +663,14 @@ public final class CQuery<T> implements DbReadContext, CancelableQuery, SpiProfi
return autoTuneProfiling && query.isUsageProfiling();
}
private String getPath(String propertyName) {
private String path(String propertyName) {
if (currentPrefix == null) {
return propertyName;
} else if (propertyName == null) {
return currentPrefix;
}
String path = currentPathMap.get(propertyName);
if (path != null) {
return path;
} else {
return currentPrefix + "." + propertyName;
}
return path != null ? path : currentPrefix + "." + propertyName;
}
@Override
@@ -7,6 +7,8 @@ import io.ebeaninternal.server.deploy.DbReadContext;
import io.ebeaninternal.server.deploy.InheritInfo;
import io.ebeaninternal.server.deploy.id.IdBinder;
import java.util.Map;
/**
* Bean type interface for Sql query tree.
*/
@@ -136,4 +138,8 @@ public interface STreeType {
*/
void markAsDeleted(EntityBean bean);
/**
* Return the "path map" to toMany or toOne properties using the given prefix.
*/
Map<String, String> pathMap(String prefix);
}
@@ -122,20 +122,11 @@ class SqlTreeNodeBean implements SqlTreeNode {
}
private Map<String, String> createPathMap(String prefix, STreeType desc) {
HashMap<String, String> m = new HashMap<>();
for (STreePropertyAssocMany many : desc.propsMany()) {
String name = many.name();
m.put(name, path(prefix, name));
}
return m;
return prefix == null ? Collections.emptyMap() : desc.pathMap(prefix);
}
private String path(String prefix, String propertyName) {
if (prefix == null) {
return propertyName;
} else {
return prefix + "." + propertyName;
}
return prefix == null ? propertyName : prefix + "." + propertyName;
}
@Override