From 365b7c46000874b128c0ff466147b87586a8df66 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 4 Dec 2020 20:41:40 +1300 Subject: [PATCH] #2122 - Metrics for ElementCollection query not included in reporting (via MetaInfoManager) --- .../server/deploy/BeanDescriptor.java | 7 +++++++ .../server/deploy/BeanDescriptorElement.java | 19 ++++++++++++++++++ .../server/deploy/BeanDescriptorManager.java | 9 +++++++++ .../server/deploy/BeanPropertyAssocMany.java | 7 +++++++ .../server/query/CQueryPlan.java | 20 ++++++++++++------- .../TestElementCollectionBasic.java | 6 +++++- 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index e5b8c10f2..bfb32c8fe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -2087,6 +2087,13 @@ public class BeanDescriptor implements BeanType, STreeType { return name; } + /** + * Return the simple name of the entity bean. + */ + public String getSimpleName() { + return beanType.getSimpleName(); + } + /** * Summary description. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java index 6553a28d2..1d541377d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java @@ -14,13 +14,32 @@ import java.util.Arrays; */ abstract class BeanDescriptorElement extends BeanDescriptor { + private final String simpleName; + final ElementHelp elementHelp; BeanDescriptorElement(BeanDescriptorMap owner, DeployBeanDescriptor deploy, ElementHelp elementHelp) { super(owner, deploy); + this.simpleName = shortName(deploy.getName()); this.elementHelp = elementHelp; } + private String shortName(String name) { + int pos = name.lastIndexOf('.'); + if (pos > 1) { + pos = name.lastIndexOf('.', pos - 1); + if (pos > 1) { + return name.substring(pos + 1); + } + } + return name; + } + + @Override + public String getSimpleName() { + return simpleName; + } + @Override public boolean isJsonReadCollection() { return true; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 15d2bcdc4..9a8c7a233 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -117,6 +117,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private final TypeManager typeManager; private final BootupClasses bootupClasses; private final String serverName; + private final List elementDescriptors = new ArrayList<>(); private final Map, BeanTable> beanTableMap = new HashMap<>(); private final Map> descMap = new HashMap<>(); private final Map> descQueueMap = new HashMap<>(); @@ -644,6 +645,11 @@ public class BeanDescriptorManager implements BeanDescriptorMap { if (desc.isDocStoreMapped()) { descQueueMap.put(desc.getDocStoreQueueId(), desc); } + for (BeanPropertyAssocMany many : desc.propertiesMany()) { + if (many.isElementCollection()) { + elementDescriptors.add(many.getElementDescriptor()); + } + } } /** @@ -1619,6 +1625,9 @@ public class BeanDescriptorManager implements BeanDescriptorMap { for (BeanDescriptor desc : immutableDescriptorList) { desc.visitMetrics(visitor); } + for (BeanDescriptor desc : elementDescriptors) { + desc.visitMetrics(visitor); + } } public List queryPlanInit(QueryPlanInit request) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index 8b98e1679..8e1ac1a14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -569,6 +569,13 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST return elementCollection; } + /** + * Return the element bean descriptor (for an element collection only). + */ + public BeanDescriptor getElementDescriptor() { + return elementDescriptor; + } + /** * ManyToMany only, join from local table to intersection table. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index af4ad9c48..86e8d209d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -13,6 +13,7 @@ import io.ebeaninternal.api.SpiQueryBindCapture; import io.ebeaninternal.api.SpiQueryPlan; import io.ebeaninternal.server.core.OrmQueryRequest; import io.ebeaninternal.server.core.timezone.DataTimeZone; +import io.ebeaninternal.server.lib.Str; import io.ebeaninternal.server.query.CQueryPlanStats.Snapshot; import io.ebeaninternal.server.type.DataBind; import io.ebeaninternal.server.type.DataBindCapture; @@ -106,7 +107,7 @@ public class CQueryPlan implements SpiQueryPlan { SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); this.label = query.getPlanLabel(); - this.name = deriveName(label, query.getType()); + this.name = deriveName(label, query.getType(), request.getBeanDescriptor().getSimpleName()); this.location = location(); this.asOfTableCount = query.getAsOfTableCount(); this.sql = sqlRes.getSql(); @@ -130,7 +131,7 @@ public class CQueryPlan implements SpiQueryPlan { SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); this.label = query.getPlanLabel(); - this.name = deriveName(label, query.getType()); + this.name = deriveName(label, query.getType(), request.getBeanDescriptor().getSimpleName()); this.location = location(); this.planKey = buildPlanKey(sql, logWhereSql); this.asOfTableCount = 0; @@ -145,14 +146,19 @@ public class CQueryPlan implements SpiQueryPlan { this.hash = md5Hash(); } - private String deriveName(String label, SpiQuery.Type type) { + private String deriveName(String label, SpiQuery.Type type, String simpleName) { if (label == null) { - return "orm." + beanType.getSimpleName() + "." + type.label(); + return Str.add("orm.", simpleName, ".", type.label()); } - if (label.startsWith(beanType.getSimpleName())) { - return "orm." + label; + int pos = simpleName.indexOf('.'); + if (pos > 1) { + // element collection and label + return Str.add("orm.", simpleName.substring(0, pos), "_", label); } - return "orm." + beanType.getSimpleName() + "_" + label; + if (label.startsWith(simpleName)) { + return Str.add("orm.", label); + } + return Str.add("orm.", simpleName, "_", label); } private SpiQueryBindCapture initBindCapture(SpiQuery query) { diff --git a/ebean-core/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java b/ebean-core/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java index 9b304bafc..78562fb6d 100644 --- a/ebean-core/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java +++ b/ebean-core/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasic.java @@ -30,7 +30,11 @@ public class TestElementCollectionBasic extends BaseTestCase { assertThat(eventLog()).containsOnly("preInsert", "postInsert"); assertThat(sql).hasSize(4); - final EcPerson found = Ebean.find(EcPerson.class, person.getId()); + final EcPerson found = Ebean.find(EcPerson.class) + .setId(person.getId()) + //.setLabel("findById") + .findOne(); + found.getPhoneNumbers().size(); sql = LoggedSqlCollector.current();