From a04594540c6e354ed4a2283ebc455a43a8d1f993 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 29 Nov 2019 23:35:21 +1300 Subject: [PATCH] #1873 - Refactor metrics reporting and collection, simplify removing MetricOrmQueryNode, MetricOrmQueryOrigin (#1874) * #1873 - Refactor metrics reporting and collection, simplify removing MetricOrmQueryNode, MetricOrmQueryOrigin * #1873 - fix test --- .../java/io/ebean/config/ServerConfig.java | 54 --------- .../io/ebean/meta/BasicMetricVisitor.java | 34 ++---- .../java/io/ebean/meta/MetaInfoManager.java | 12 -- .../io/ebean/meta/MetaOrmQueryMetric.java | 30 ----- .../java/io/ebean/meta/MetaOrmQueryNode.java | 39 ------ .../io/ebean/meta/MetaOrmQueryOrigin.java | 30 ----- .../java/io/ebean/meta/MetricVisitor.java | 5 - .../java/io/ebean/meta/ServerMetrics.java | 9 +- .../io/ebeaninternal/api/SpiEbeanServer.java | 10 -- .../core/CObjectGraphNodeStatistics.java | 94 --------------- .../server/core/DefaultMetaInfoManager.java | 20 ---- .../server/core/DefaultServer.java | 32 ----- .../server/core/DumpMetrics.java | 33 +----- .../server/core/DumpMetricsData.java | 17 +-- .../server/core/DumpMetricsJson.java | 18 +-- .../server/deploy/BeanDescriptor.java | 2 +- .../io/ebeaninternal/server/query/CQuery.java | 2 +- .../query/CQueryFetchSingleAttribute.java | 2 +- .../server/query/CQueryPlan.java | 14 +-- .../server/query/CQueryPlanStats.java | 112 +----------------- .../server/query/CQueryRowCount.java | 2 +- .../server/query/CQueryUpdate.java | 2 +- .../java/io/ebean/DtoQueryFromOrmTest.java | 4 +- src/test/java/io/ebean/DtoQueryTest.java | 6 +- src/test/java/io/ebean/NamedDtoQueryTest.java | 4 +- src/test/java/io/ebean/UpdateQueryTest.java | 6 +- .../ebeaninternal/api/TDSpiEbeanServer.java | 10 -- .../query/finder/TestCustomerFinder.java | 8 +- .../TestObjectGraphNodeStatsCollection.java | 103 ---------------- 29 files changed, 51 insertions(+), 663 deletions(-) delete mode 100644 src/main/java/io/ebean/meta/MetaOrmQueryMetric.java delete mode 100644 src/main/java/io/ebean/meta/MetaOrmQueryNode.java delete mode 100644 src/main/java/io/ebean/meta/MetaOrmQueryOrigin.java delete mode 100644 src/main/java/io/ebeaninternal/server/core/CObjectGraphNodeStatistics.java delete mode 100644 src/test/java/org/tests/query/other/TestObjectGraphNodeStatsCollection.java diff --git a/src/main/java/io/ebean/config/ServerConfig.java b/src/main/java/io/ebean/config/ServerConfig.java index 43fda49a1..625c6e3dd 100644 --- a/src/main/java/io/ebean/config/ServerConfig.java +++ b/src/main/java/io/ebean/config/ServerConfig.java @@ -28,7 +28,6 @@ import io.ebean.event.changelog.ChangeLogPrepare; import io.ebean.event.changelog.ChangeLogRegister; import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditPrepare; -import io.ebean.meta.MetaInfoManager; import io.ebean.migration.MigrationRunner; import io.ebean.util.StringHelper; @@ -415,10 +414,6 @@ public class ServerConfig { private ServerCachePlugin serverCachePlugin; - private boolean collectQueryStatsByNode = true; - - private boolean collectQueryOrigins = true; - /** * The default PersistenceContextScope used if one is not explicitly set on a query. */ @@ -2418,52 +2413,6 @@ public class ServerConfig { this.updateAllPropertiesInBatch = updateAllPropertiesInBatch; } - /** - * Return true if query statistics should be collected by ObjectGraphNode. - */ - public boolean isCollectQueryStatsByNode() { - return collectQueryStatsByNode; - } - - /** - * Set to true to collection query execution statistics by ObjectGraphNode. - *

- * These statistics can be used to highlight code/query 'origin points' that result in lots of lazy loading. - *

- *

- * It is considered safe/fine to have this set to true for production. - *

- *

- * This information can be later retrieved via {@link MetaInfoManager}. - *

- * - * @see MetaInfoManager - */ - public void setCollectQueryStatsByNode(boolean collectQueryStatsByNode) { - this.collectQueryStatsByNode = collectQueryStatsByNode; - } - - /** - * Return true if query plans should also collect their 'origins'. This means for a given query plan you - * can identify the code/origin points where this query resulted from including lazy loading origins. - */ - public boolean isCollectQueryOrigins() { - return collectQueryOrigins; - } - - /** - * Set to true if query plans should collect their 'origin' points. This means for a given query plan you - * can identify the code/origin points where this query resulted from including lazy loading origins. - *

- * This information can be later retrieved via {@link MetaInfoManager}. - *

- * - * @see MetaInfoManager - */ - public void setCollectQueryOrigins(boolean collectQueryOrigins) { - this.collectQueryOrigins = collectQueryOrigins; - } - /** * Returns the resource directory. */ @@ -2921,9 +2870,6 @@ public class ServerConfig { String packagesProp = p.get("search.packages", p.get("packages", null)); packages = getSearchList(packagesProp, packages); - collectQueryStatsByNode = p.getBoolean("collectQueryStatsByNode", collectQueryStatsByNode); - collectQueryOrigins = p.getBoolean("collectQueryOrigins", collectQueryOrigins); - skipCacheAfterWrite = p.getBoolean("skipCacheAfterWrite", skipCacheAfterWrite); updateAllPropertiesInBatch = p.getBoolean("updateAllPropertiesInBatch", updateAllPropertiesInBatch); diff --git a/src/main/java/io/ebean/meta/BasicMetricVisitor.java b/src/main/java/io/ebean/meta/BasicMetricVisitor.java index 7e1d77909..c821c63a7 100644 --- a/src/main/java/io/ebean/meta/BasicMetricVisitor.java +++ b/src/main/java/io/ebean/meta/BasicMetricVisitor.java @@ -9,9 +9,8 @@ import java.util.List; public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerMetrics { private final List timed = new ArrayList<>(); - private final List dtoQuery = new ArrayList<>(); - private final List ormQuery = new ArrayList<>(); - private final List countMetrics = new ArrayList<>(); + private final List query = new ArrayList<>(); + private final List count = new ArrayList<>(); /** * Construct to reset and collect everything. @@ -27,33 +26,19 @@ public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerM super(reset, collectTransactionMetrics, collectQueryMetrics, collectL2Metrics); } - /** - * Return timed metrics for Transactions, labelled SqlQuery, labelled SqlUpdate. - */ @Override public List getTimedMetrics() { return timed; } - /** - * Return the DTO query metrics. - */ @Override - public List getDtoQueryMetrics() { - return dtoQuery; - } - - /** - * Return the ORM query metrics. - */ - @Override - public List getOrmQueryMetrics() { - return ormQuery; + public List getQueryMetrics() { + return query; } @Override public List getCountMetrics() { - return countMetrics; + return count; } @Override @@ -63,16 +48,11 @@ public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerM @Override public void visitQuery(MetaQueryMetric metric) { - dtoQuery.add(metric); - } - - @Override - public void visitOrmQuery(MetaOrmQueryMetric metric) { - ormQuery.add(metric); + query.add(metric); } @Override public void visitCount(MetaCountMetric metric) { - countMetrics.add(metric); + count.add(metric); } } diff --git a/src/main/java/io/ebean/meta/MetaInfoManager.java b/src/main/java/io/ebean/meta/MetaInfoManager.java index 285f25135..cf51d47e0 100644 --- a/src/main/java/io/ebean/meta/MetaInfoManager.java +++ b/src/main/java/io/ebean/meta/MetaInfoManager.java @@ -54,16 +54,4 @@ public interface MetaInfoManager { */ void resetAllMetrics(); - /** - * Collect and return the ObjectGraphNode statistics. - *

- * These show query executions based on an origin point and relative path. - * This is used to look at the amount of lazy loading occurring for a given - * query origin point and highlight potential for tuning a query. - *

- * - * @param reset Set to true to reset the underlying statistics after collection. - */ - List collectNodeStatistics(boolean reset); - } diff --git a/src/main/java/io/ebean/meta/MetaOrmQueryMetric.java b/src/main/java/io/ebean/meta/MetaOrmQueryMetric.java deleted file mode 100644 index 6a817b037..000000000 --- a/src/main/java/io/ebean/meta/MetaOrmQueryMetric.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.ebean.meta; - -import java.util.List; - -/** - * Query execution statistics for Orm queries. - */ -public interface MetaOrmQueryMetric extends MetaQueryMetric { - - /** - * Return true if this query plan was tuned by AutoTune. - */ - boolean isAutoTuned(); - - /** - * Return the time of the last query executed using this plan. - */ - long getLastQueryTime(); - - /** - * Return the 'origin' points and paths that resulted in the query being - * executed and the associated number of times the query was executed via that - * path. - *

- * This includes direct and lazy loading paths. - *

- */ - List getOrigins(); - -} diff --git a/src/main/java/io/ebean/meta/MetaOrmQueryNode.java b/src/main/java/io/ebean/meta/MetaOrmQueryNode.java deleted file mode 100644 index 0f1d6bd24..000000000 --- a/src/main/java/io/ebean/meta/MetaOrmQueryNode.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.ebean.meta; - -import io.ebean.bean.ObjectGraphNode; - -/** - * Statistics for query execution based on object graph origin and paths. - *

- * These statistics can be used to identify origin queries that result in lots - * of lazy loading. - *

- */ -public interface MetaOrmQueryNode { - - /** - * Return the ObjectGraphNode which has the origin point and relative path. - */ - ObjectGraphNode getNode(); - - /** - * Return the startTime of statistics collection. - */ - long getStartTime(); - - /** - * Return the total count of queries executed for this node. - */ - long getCount(); - - /** - * Return the total time of queries executed for this node. - */ - long getTotalTime(); - - /** - * Return the total beans loaded by queries for this node. - */ - long getTotalBeans(); - -} diff --git a/src/main/java/io/ebean/meta/MetaOrmQueryOrigin.java b/src/main/java/io/ebean/meta/MetaOrmQueryOrigin.java deleted file mode 100644 index 9f4d2f096..000000000 --- a/src/main/java/io/ebean/meta/MetaOrmQueryOrigin.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.ebean.meta; - -import io.ebean.bean.ObjectGraphNode; - -/** - * Holds a query 'origin' point and count for the number of queries executed for - * this 'origin'. - *

- * This basically points to the bit of original code and query that results in - * this query directly or via lazy loading. - *

- */ -public interface MetaOrmQueryOrigin { - - /** - * The 'origin' and path which this query belongs to. - *

- * For lazy loading queries this points to the original query and associated - * navigation path that resulted in this query being executed. - *

- */ - ObjectGraphNode getObjectGraphNode(); - - /** - * The number of times a query was fired for this node since the counter was - * last reset. - */ - long getCount(); - -} diff --git a/src/main/java/io/ebean/meta/MetricVisitor.java b/src/main/java/io/ebean/meta/MetricVisitor.java index 139e7b9f6..18c7a72dc 100644 --- a/src/main/java/io/ebean/meta/MetricVisitor.java +++ b/src/main/java/io/ebean/meta/MetricVisitor.java @@ -40,11 +40,6 @@ public interface MetricVisitor { */ void visitQuery(MetaQueryMetric metric); - /** - * Visit ORM query metrics. - */ - void visitOrmQuery(MetaOrmQueryMetric metric); - /** * Visit a Counter metric. */ diff --git a/src/main/java/io/ebean/meta/ServerMetrics.java b/src/main/java/io/ebean/meta/ServerMetrics.java index c00518715..8f0488d62 100644 --- a/src/main/java/io/ebean/meta/ServerMetrics.java +++ b/src/main/java/io/ebean/meta/ServerMetrics.java @@ -13,14 +13,9 @@ public interface ServerMetrics { List getTimedMetrics(); /** - * Return the DTO query metrics. + * Return the query metrics. */ - List getDtoQueryMetrics(); - - /** - * Return the ORM query metrics. - */ - List getOrmQueryMetrics(); + List getQueryMetrics(); /** * Return the Counter metrics. diff --git a/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java b/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java index e594395d2..0afa7726e 100644 --- a/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java +++ b/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java @@ -49,11 +49,6 @@ public interface SpiEbeanServer extends ExtendedServer, EbeanServer, BeanLoader, */ void shutdownManaged(); - /** - * Return true if query origins should be collected. - */ - boolean isCollectQueryOrigins(); - /** * Return true if updates in JDBC batch should include all columns if unspecified on the transaction. */ @@ -201,11 +196,6 @@ public interface SpiEbeanServer extends ExtendedServer, EbeanServer, BeanLoader, */ boolean isSupportedType(java.lang.reflect.Type genericType); - /** - * Collect query statistics by ObjectGraphNode. Used for Lazy loading reporting. - */ - void collectQueryStats(ObjectGraphNode objectGraphNode, long loadedBeanCount, long timeMicros); - /** * Return the ReadAuditLogger to use for logging all read audit events. */ diff --git a/src/main/java/io/ebeaninternal/server/core/CObjectGraphNodeStatistics.java b/src/main/java/io/ebeaninternal/server/core/CObjectGraphNodeStatistics.java deleted file mode 100644 index 8b53a86aa..000000000 --- a/src/main/java/io/ebeaninternal/server/core/CObjectGraphNodeStatistics.java +++ /dev/null @@ -1,94 +0,0 @@ -package io.ebeaninternal.server.core; - -import io.ebean.bean.ObjectGraphNode; -import io.ebean.meta.MetaOrmQueryNode; - -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.LongAdder; - -/** - * Helper to collect the query execution statistics for a given node. - */ -public class CObjectGraphNodeStatistics { - - private final ObjectGraphNode node; - - private final LongAdder count = new LongAdder(); - - private final LongAdder totalTime = new LongAdder(); - - private final LongAdder totalBeans = new LongAdder(); - - private final AtomicLong startTime = new AtomicLong(System.currentTimeMillis()); - - CObjectGraphNodeStatistics(ObjectGraphNode node) { - this.node = node; - } - - public boolean isEmpty() { - return count.sum() == 0; - } - - public void add(long beanCount, long exeMicros) { - count.increment(); - totalTime.add(exeMicros); - totalBeans.add(beanCount); - } - - public MetaOrmQueryNode get(boolean reset) { - if (reset) { - return new Snapshot(node, startTime.getAndSet(System.currentTimeMillis()), count.sumThenReset(), - totalTime.sumThenReset(), totalBeans.sumThenReset()); - } else { - return new Snapshot(node, startTime.get(), count.sum(), totalTime.sum(), totalBeans.sum()); - } - } - - private static class Snapshot implements MetaOrmQueryNode { - - private final ObjectGraphNode node; - private final long startTime; - private final long count; - private final long totalTime; - private final long totalBeans; - - public Snapshot(ObjectGraphNode node, long startTime, long count, long totalTime, long totalBeans) { - this.node = node; - this.startTime = startTime; - this.count = count; - this.totalTime = totalTime; - this.totalBeans = totalBeans; - } - - @Override - public String toString() { - return node + " count[" + count + "] time[" + totalTime + "] beans[" + totalBeans + "]"; - } - - @Override - public ObjectGraphNode getNode() { - return node; - } - - @Override - public long getStartTime() { - return startTime; - } - - @Override - public long getCount() { - return count; - } - - @Override - public long getTotalTime() { - return totalTime; - } - - @Override - public long getTotalBeans() { - return totalBeans; - } - } - -} diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java b/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java index cee385241..89fb45220 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultMetaInfoManager.java @@ -4,8 +4,6 @@ import io.ebean.meta.AbstractMetricVisitor; import io.ebean.meta.BasicMetricVisitor; import io.ebean.meta.MetaCountMetric; import io.ebean.meta.MetaInfoManager; -import io.ebean.meta.MetaOrmQueryMetric; -import io.ebean.meta.MetaOrmQueryNode; import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetaQueryPlan; import io.ebean.meta.MetaTimedMetric; @@ -15,7 +13,6 @@ import io.ebean.meta.QueryPlanRequest; import io.ebean.meta.ServerMetrics; import io.ebean.meta.ServerMetricsAsJson; -import java.util.ArrayList; import java.util.List; /** @@ -66,18 +63,6 @@ public class DefaultMetaInfoManager implements MetaInfoManager { server.visitMetrics(new ResetVisitor()); } - @Override - public List collectNodeStatistics(boolean reset) { - - List list = new ArrayList<>(); - for (CObjectGraphNodeStatistics nodeStatistics : server.objectGraphStats.values()) { - if (!nodeStatistics.isEmpty()) { - list.add(nodeStatistics.get(reset)); - } - } - return list; - } - /** * Visitor that resets the statistics but doesn't collect them. */ @@ -97,11 +82,6 @@ public class DefaultMetaInfoManager implements MetaInfoManager { // ignore } - @Override - public void visitOrmQuery(MetaOrmQueryMetric metric) { - // ignore - } - @Override public void visitCount(MetaCountMetric metric) { // ignore diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index d2498dba5..227b805d0 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -240,19 +240,10 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { private final boolean updateAllPropertiesInBatch; - private final boolean collectQueryOrigins; - - private final boolean collectQueryStatsByNode; - private final long slowQueryMicros; private final SlowQueryListener slowQueryListener; - /** - * Cache used to collect statistics based on ObjectGraphNode (used to highlight lazy loading origin points). - */ - protected final ConcurrentHashMap objectGraphStats; - /** * Create the DefaultServer. */ @@ -261,7 +252,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { this.logManager = config.getLogManager(); this.dtoBeanManager = config.getDtoBeanManager(); this.serverConfig = config.getServerConfig(); - this.objectGraphStats = new ConcurrentHashMap<>(); this.metaInfoManager = new DefaultMetaInfoManager(this); this.serverCacheManager = cache; this.databasePlatform = config.getDatabasePlatform(); @@ -282,8 +272,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { beanDescriptorManager.setEbeanServer(this); this.updateAllPropertiesInBatch = serverConfig.isUpdateAllPropertiesInBatch(); - this.collectQueryOrigins = serverConfig.isCollectQueryOrigins(); - this.collectQueryStatsByNode = serverConfig.isCollectQueryStatsByNode(); this.callStackFactory = initCallStackFactory(serverConfig); this.persister = config.createPersister(this); @@ -352,11 +340,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return logManager; } - @Override - public boolean isCollectQueryOrigins() { - return collectQueryOrigins; - } - @Override public boolean isUpdateAllPropertiesInBatch() { return updateAllPropertiesInBatch; @@ -2357,21 +2340,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return jsonContext; } - @Override - public void collectQueryStats(ObjectGraphNode node, long loadedBeanCount, long timeMicros) { - - if (collectQueryStatsByNode) { - CObjectGraphNodeStatistics nodeStatistics = objectGraphStats.get(node); - if (nodeStatistics == null) { - // race condition here but I actually don't care too much if we miss a - // few early statistics - especially when the server is warming up etc - nodeStatistics = new CObjectGraphNodeStatistics(node); - objectGraphStats.put(node, nodeStatistics); - } - nodeStatistics.add(loadedBeanCount, timeMicros); - } - } - @Override public void slowQueryCheck(long timeMicros, int rowCount, SpiQuery query) { if (timeMicros > slowQueryMicros && slowQueryListener != null) { diff --git a/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java b/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java index 55dc9e6ca..972ee2754 100644 --- a/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java +++ b/src/main/java/io/ebeaninternal/server/core/DumpMetrics.java @@ -1,7 +1,6 @@ package io.ebeaninternal.server.core; import io.ebean.meta.MetaCountMetric; -import io.ebean.meta.MetaOrmQueryMetric; import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetaTimedMetric; import io.ebean.meta.ServerMetrics; @@ -92,23 +91,14 @@ class DumpMetrics { } } - List ormQueryMetrics = serverMetrics.getOrmQueryMetrics(); - if (!ormQueryMetrics.isEmpty()) { - out("\n-- ORM queries --"); - ormQueryMetrics.sort(sortBy); - for (MetaOrmQueryMetric metric : ormQueryMetrics) { + List queryMetrics = serverMetrics.getQueryMetrics(); + if (!queryMetrics.isEmpty()) { + out("\n-- Queries --"); + queryMetrics.sort(sortBy); + for (MetaQueryMetric metric : queryMetrics) { logQuery(metric); } } - - List dtoQueryMetrics = serverMetrics.getDtoQueryMetrics(); - if (!dtoQueryMetrics.isEmpty()) { - out("\n-- DTO queries --"); - dtoQueryMetrics.sort(sortBy); - for (MetaQueryMetric metric : dtoQueryMetrics) { - logDtoQuery(metric); - } - } } private void logCount(MetaCountMetric metric) { @@ -123,7 +113,7 @@ class DumpMetrics { System.out.println(sb); } - private void logQuery(MetaOrmQueryMetric metric) { + private void logQuery(MetaQueryMetric metric) { StringBuilder sb = new StringBuilder(); @@ -136,17 +126,6 @@ class DumpMetrics { out(sb.toString()); } - - private void logDtoQuery(MetaQueryMetric metric) { - - StringBuilder sb = new StringBuilder(); - - appendQueryName(metric, sb); - appendCounters(metric, sb); - appendProfileAndSql(metric, sb); - out(sb.toString()); - } - private void appendQueryName(MetaQueryMetric metric, StringBuilder sb) { sb.append("query:").append(padName(metric.getName())).append(" "); } diff --git a/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java b/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java index bd4d3ecae..375e3d722 100644 --- a/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java +++ b/src/main/java/io/ebeaninternal/server/core/DumpMetricsData.java @@ -3,7 +3,6 @@ package io.ebeaninternal.server.core; import io.ebean.Database; import io.ebean.meta.MetaCountMetric; import io.ebean.meta.MetaMetric; -import io.ebean.meta.MetaOrmQueryMetric; import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetaTimedMetric; import io.ebean.meta.MetricData; @@ -34,8 +33,7 @@ class DumpMetricsData { final List timedMetrics = serverMetrics.getTimedMetrics(); final List countMetrics = serverMetrics.getCountMetrics(); - final List ormQueryMetrics = serverMetrics.getOrmQueryMetrics(); - final List dtoQueryMetrics = serverMetrics.getDtoQueryMetrics(); + final List queryMetrics = serverMetrics.getQueryMetrics(); for (MetaTimedMetric metric : timedMetrics) { add(metric); @@ -43,12 +41,9 @@ class DumpMetricsData { for (MetaCountMetric metric : countMetrics) { addCount(metric); } - for (MetaOrmQueryMetric metric : ormQueryMetrics) { + for (MetaQueryMetric metric : queryMetrics) { addQuery(metric); } - for (MetaQueryMetric metric : dtoQueryMetrics) { - addDtoQuery(metric); - } } private MetricData create(MetaMetric metric) { @@ -68,19 +63,13 @@ class DumpMetricsData { data.setCount(metric.getCount()); } - private void addQuery(MetaOrmQueryMetric metric) { + private void addQuery(MetaQueryMetric metric) { final MetricData data = create(metric); appendCounters(data, metric); appendLocationAndSql(data, metric); data.setHash(metric.getHash()); } - private void addDtoQuery(MetaQueryMetric metric) { - final MetricData data = create(metric); - appendCounters(data, metric); - appendLocationAndSql(data, metric); - } - private void appendLocationAndSql(MetricData data, MetaQueryMetric metric) { data.setLoc(metric.getLocation()); data.setSql(metric.getSql()); diff --git a/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java b/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java index cfb0d9de1..732c4a23c 100644 --- a/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java +++ b/src/main/java/io/ebeaninternal/server/core/DumpMetricsJson.java @@ -3,7 +3,6 @@ package io.ebeaninternal.server.core; import io.ebean.Database; import io.ebean.meta.MetaCountMetric; import io.ebean.meta.MetaMetric; -import io.ebean.meta.MetaOrmQueryMetric; import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetaTimedMetric; import io.ebean.meta.ServerMetrics; @@ -110,25 +109,16 @@ class DumpMetricsJson implements ServerMetricsAsJson { } } - List ormQueryMetrics = serverMetrics.getOrmQueryMetrics(); - if (!ormQueryMetrics.isEmpty()) { + List queryMetrics = serverMetrics.getQueryMetrics(); + if (!queryMetrics.isEmpty()) { if (sortBy != null) { - ormQueryMetrics.sort(sortBy); + queryMetrics.sort(sortBy); } - for (MetaOrmQueryMetric metric : ormQueryMetrics) { + for (MetaQueryMetric metric : queryMetrics) { logQuery(metric); } } - List dtoQueryMetrics = serverMetrics.getDtoQueryMetrics(); - if (!dtoQueryMetrics.isEmpty()) { - if (sortBy != null) { - dtoQueryMetrics.sort(sortBy); - } - for (MetaQueryMetric metric : dtoQueryMetrics) { - logQuery(metric); - } - } end(); } catch (IOException e) { throw new RuntimeException("Error writing metrics as JSON", e); diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index baa4e4caa..32b8294e6 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1697,7 +1697,7 @@ public class BeanDescriptor implements BeanType, STreeType { iudMetrics.visit(visitor); for (CQueryPlan queryPlan : queryPlanCache.values()) { if (!queryPlan.isEmptyStats()) { - visitor.visitOrmQuery(queryPlan.getSnapshot(visitor.isReset())); + visitor.visitQuery(queryPlan.getSnapshot(visitor.isReset())); } } } diff --git a/src/main/java/io/ebeaninternal/server/query/CQuery.java b/src/main/java/io/ebeaninternal/server/query/CQuery.java index 7ebcc9d86..ce198e7c1 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -601,7 +601,7 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran if (autoTuneProfiling) { profilingListener.collectQueryInfo(objectGraphNode, loadedBeanCount, executionTimeMicros); } - if (queryPlan.executionTime(loadedBeanCount, executionTimeMicros, objectGraphNode)) { + if (queryPlan.executionTime(loadedBeanCount, executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } getTransaction().profileEvent(this); diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java b/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java index 31c7a6602..16560b7cf 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryFetchSingleAttribute.java @@ -117,7 +117,7 @@ class CQueryFetchSingleAttribute implements SpiProfileTransactionEvent { executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); - if (queryPlan.executionTime(rowCount, executionTimeMicros, null)) { + if (queryPlan.executionTime(rowCount, executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } getTransaction().profileEvent(this); diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index 25e10c9ca..8e24c8f4b 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -123,7 +123,7 @@ public class CQueryPlan { this.rawSql = rawSql; this.logWhereSql = logWhereSql; this.encryptedProps = sqlTree.getEncryptedProps(); - this.stats = new CQueryPlanStats(this, server.isCollectQueryOrigins()); + this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCapture(server.getServerConfig(), query); this.hash = md5Hash(); @@ -151,7 +151,7 @@ public class CQueryPlan { this.rowNumberIncluded = rowNumberIncluded; this.logWhereSql = logWhereSql; this.encryptedProps = sqlTree.getEncryptedProps(); - this.stats = new CQueryPlanStats(this, server.isCollectQueryOrigins()); + this.stats = new CQueryPlanStats(this); this.dependentTables = sqlTree.dependentTables(); this.bindCapture = initBindCapture(server.getServerConfig(), query); this.hash = md5Hash(); @@ -312,14 +312,8 @@ public class CQueryPlan { /** * Register an execution time against this query plan; */ - boolean executionTime(long loadedBeanCount, long timeMicros, ObjectGraphNode objectGraphNode) { - - stats.add(loadedBeanCount, timeMicros, objectGraphNode); - if (objectGraphNode != null) { - // collect stats based on objectGraphNode for lazy loading reporting - server.collectQueryStats(objectGraphNode, loadedBeanCount, timeMicros); - } - + boolean executionTime(long loadedBeanCount, long timeMicros) { + stats.add(loadedBeanCount, timeMicros); return bindCapture != null && bindCapture.collectFor(timeMicros); } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java index a45d04718..cbe9d0f00 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java @@ -1,19 +1,10 @@ package io.ebeaninternal.server.query; -import io.ebean.bean.ObjectGraphNode; -import io.ebean.meta.MetaOrmQueryMetric; -import io.ebean.meta.MetaOrmQueryOrigin; +import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetricType; import io.ebean.metric.TimedMetric; import io.ebean.metric.TimedMetricStats; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.LongAdder; - /** * Statistics for a specific query plan that can accumulate. */ @@ -27,14 +18,11 @@ public final class CQueryPlanStats { private long lastQueryTime; - private final ConcurrentHashMap origins; - /** * Construct for a given query plan. */ - CQueryPlanStats(CQueryPlan queryPlan, boolean collectQueryOrigins) { + CQueryPlanStats(CQueryPlan queryPlan) { this.queryPlan = queryPlan; - this.origins = !collectQueryOrigins ? null : new ConcurrentHashMap<>(); this.timedMetric = queryPlan.createTimedMetric(); } @@ -48,25 +36,10 @@ public final class CQueryPlanStats { /** * Add a query execution to the statistics. */ - public void add(long loadedBeanCount, long timeMicros, ObjectGraphNode objectGraphNode) { - + public void add(long loadedBeanCount, long timeMicros) { timedMetric.add(timeMicros, loadedBeanCount); - // not safe but should be atomic lastQueryTime = System.currentTimeMillis(); - - if (origins != null && objectGraphNode != null) { - // Maintain the origin points this query fires from - // with a simple counter - LongAdder counter = origins.get(objectGraphNode); - if (counter == null) { - // race condition - we can miss counters here but going - // to live with that. Don't want to lock/synchronize etc - counter = new LongAdder(); - origins.put(objectGraphNode, counter); - } - counter.increment(); - } } /** @@ -74,11 +47,6 @@ public final class CQueryPlanStats { */ public void reset() { timedMetric.reset(); - if (origins != null) { - for (LongAdder counter : origins.values()) { - counter.reset(); - } - } } /** @@ -94,77 +62,24 @@ public final class CQueryPlanStats { Snapshot getSnapshot(boolean reset) { TimedMetricStats collect = timedMetric.collect(reset); - List origins = getOrigins(reset); - Snapshot snapshot = new Snapshot(collected, queryPlan, collect, lastQueryTime, origins); + Snapshot snapshot = new Snapshot(collected, queryPlan, collect); collected = true; return snapshot; } - /** - * Return the list/snapshot of the origins and their counter value. - */ - private List getOrigins(boolean reset) { - if (origins == null) { - return Collections.emptyList(); - } - - List list = new ArrayList<>(origins.size()); - - for (Entry entry : origins.entrySet()) { - if (reset) { - list.add(new OriginSnapshot(entry.getKey(), entry.getValue().sumThenReset())); - } else { - list.add(new OriginSnapshot(entry.getKey(), entry.getValue().sum())); - } - } - return list; - } - - /** - * Snapshot of the origin ObjectGraphNode and counter value. - */ - private static class OriginSnapshot implements MetaOrmQueryOrigin { - private final ObjectGraphNode objectGraphNode; - private final long count; - - OriginSnapshot(ObjectGraphNode objectGraphNode, long count) { - this.objectGraphNode = objectGraphNode; - this.count = count; - } - - @Override - public String toString() { - return "node[" + objectGraphNode + "] count[" + count + "]"; - } - - @Override - public ObjectGraphNode getObjectGraphNode() { - return objectGraphNode; - } - - @Override - public long getCount() { - return count; - } - } - /** * A snapshot of the current statistics for a query plan. */ - static class Snapshot implements MetaOrmQueryMetric { + static class Snapshot implements MetaQueryMetric { private final boolean collected; private final CQueryPlan queryPlan; private final TimedMetricStats metrics; - private final long lastQueryTime; - private final List origins; - Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics, long lastQueryTime, List origins) { + Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics) { this.collected = collected; this.queryPlan = queryPlan; this.metrics = metrics; - this.lastQueryTime = lastQueryTime; - this.origins = origins; } @Override @@ -227,16 +142,6 @@ public final class CQueryPlanStats { return metrics.getStartTime(); } - @Override - public long getLastQueryTime() { - return lastQueryTime; - } - - @Override - public boolean isAutoTuned() { - return queryPlan.isAutoTuned(); - } - @Override public String getHash() { return queryPlan.getHash(); @@ -252,11 +157,6 @@ public final class CQueryPlanStats { return !collected; } - @Override - public List getOrigins() { - return origins; - } - } } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java b/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java index 3ff0c4613..d9b1969df 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryRowCount.java @@ -126,7 +126,7 @@ class CQueryRowCount implements SpiProfileTransactionEvent { executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); - if (queryPlan.executionTime(rowCount, executionTimeMicros, query.getParentNode())) { + if (queryPlan.executionTime(rowCount, executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } t.profileEvent(this); diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java b/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java index cc502d716..9b7092ae0 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryUpdate.java @@ -93,7 +93,7 @@ class CQueryUpdate implements SpiProfileTransactionEvent { long executionTimeMicros = (System.nanoTime() - startNano) / 1000L; request.slowQueryCheck(executionTimeMicros, rowCount); - if (queryPlan.executionTime(rowCount, executionTimeMicros, null)) { + if (queryPlan.executionTime(rowCount, executionTimeMicros)) { queryPlan.captureBindForQueryPlan(predicates, executionTimeMicros); } t.profileEvent(this); diff --git a/src/test/java/io/ebean/DtoQueryFromOrmTest.java b/src/test/java/io/ebean/DtoQueryFromOrmTest.java index 3cc969100..818eb6906 100644 --- a/src/test/java/io/ebean/DtoQueryFromOrmTest.java +++ b/src/test/java/io/ebean/DtoQueryFromOrmTest.java @@ -27,7 +27,7 @@ public class DtoQueryFromOrmTest extends BaseTestCase { @AfterClass public static void reportStats() { ServerMetrics metrics = DB.getDefault().getMetaInfoManager().collectMetrics(); - for (MetaQueryMetric metric : metrics.getDtoQueryMetrics()) { + for (MetaQueryMetric metric : metrics.getQueryMetrics()) { System.out.println(metric); } @@ -59,7 +59,7 @@ public class DtoQueryFromOrmTest extends BaseTestCase { ServerMetrics metrics = collectMetrics(); - List stats = metrics.getDtoQueryMetrics(); + List stats = metrics.getQueryMetrics(); for (MetaQueryMetric stat : stats) { long meanMicros = stat.getMean(); assertThat(meanMicros).isLessThan(900_000); diff --git a/src/test/java/io/ebean/DtoQueryTest.java b/src/test/java/io/ebean/DtoQueryTest.java index 651402398..12c860a23 100644 --- a/src/test/java/io/ebean/DtoQueryTest.java +++ b/src/test/java/io/ebean/DtoQueryTest.java @@ -36,7 +36,7 @@ public class DtoQueryTest extends BaseTestCase { ServerMetrics metrics = collectMetrics(); - List stats = metrics.getDtoQueryMetrics(); + List stats = metrics.getQueryMetrics(); for (MetaQueryMetric stat : stats) { long meanMicros = stat.getMean(); assertThat(meanMicros).isLessThan(900_000); @@ -195,7 +195,7 @@ public class DtoQueryTest extends BaseTestCase { BasicMetricVisitor basic = new BasicMetricVisitor(false, true, true, true); server().getMetaInfoManager().visitMetrics(basic); - List stats = basic.getDtoQueryMetrics(); + List stats = basic.getQueryMetrics(); assertThat(stats).hasSize(1); MetaQueryMetric queryMetric = stats.get(0); @@ -211,7 +211,7 @@ public class DtoQueryTest extends BaseTestCase { ServerMetrics metric2 = server().getMetaInfoManager().collectMetrics(); - stats = metric2.getDtoQueryMetrics(); + stats = metric2.getQueryMetrics(); assertThat(stats).hasSize(2); log.info("stats " + stats); diff --git a/src/test/java/io/ebean/NamedDtoQueryTest.java b/src/test/java/io/ebean/NamedDtoQueryTest.java index 0d24a7ae4..e0d110bb8 100644 --- a/src/test/java/io/ebean/NamedDtoQueryTest.java +++ b/src/test/java/io/ebean/NamedDtoQueryTest.java @@ -121,7 +121,7 @@ public class NamedDtoQueryTest extends BaseTestCase { BasicMetricVisitor basic = new BasicMetricVisitor(false, true, true, true); server().getMetaInfoManager().visitMetrics(basic); - List stats = basic.getDtoQueryMetrics(); + List stats = basic.getQueryMetrics(); assertThat(stats).hasSize(1); MetaQueryMetric queryMetric = stats.get(0); @@ -137,7 +137,7 @@ public class NamedDtoQueryTest extends BaseTestCase { BasicMetricVisitor metric2 = server().getMetaInfoManager().visitBasic(); - stats = metric2.getDtoQueryMetrics(); + stats = metric2.getQueryMetrics(); assertThat(stats).hasSize(2); log.info("stats " + stats); diff --git a/src/test/java/io/ebean/UpdateQueryTest.java b/src/test/java/io/ebean/UpdateQueryTest.java index 7e945a2d5..f1b9cd224 100644 --- a/src/test/java/io/ebean/UpdateQueryTest.java +++ b/src/test/java/io/ebean/UpdateQueryTest.java @@ -3,7 +3,7 @@ package io.ebean; import io.ebean.annotation.ForPlatform; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; -import io.ebean.meta.MetaOrmQueryMetric; +import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.ServerMetrics; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; @@ -39,7 +39,7 @@ public class UpdateQueryTest extends BaseTestCase { assertThat(query.getGeneratedSql()).contains("update o_customer set status=?, updtime=? where status = ? and id > ?"); ServerMetrics metrics = collectMetrics(); - List ormQueryMetrics = metrics.getOrmQueryMetrics(); + List ormQueryMetrics = metrics.getQueryMetrics(); assertThat(ormQueryMetrics).hasSize(1); assertThat(ormQueryMetrics.get(0).getType()).isEqualTo(Customer.class); assertThat(ormQueryMetrics.get(0).getLabel()).isEqualTo("updateActive"); @@ -69,7 +69,7 @@ public class UpdateQueryTest extends BaseTestCase { assertThat(sql.get(0)).contains("update o_customer set status = status"); ServerMetrics metrics = collectMetrics(); - List ormQueryMetrics = metrics.getOrmQueryMetrics(); + List ormQueryMetrics = metrics.getQueryMetrics(); assertThat(ormQueryMetrics).hasSize(1); assertThat(ormQueryMetrics.get(0).getType()).isEqualTo(Customer.class); assertThat(ormQueryMetrics.get(0).getLabel()).isEqualTo("updateAll"); diff --git a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java index 6e8f93486..0009d202f 100644 --- a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java @@ -34,7 +34,6 @@ import io.ebean.annotation.TxIsolation; import io.ebean.bean.BeanCollection; import io.ebean.bean.CallOrigin; import io.ebean.bean.EntityBeanIntercept; -import io.ebean.bean.ObjectGraphNode; import io.ebean.cache.ServerCacheManager; import io.ebean.config.ServerConfig; import io.ebean.config.dbplatform.DatabasePlatform; @@ -143,11 +142,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } - @Override - public boolean isCollectQueryOrigins() { - return false; - } - @Override public boolean isUpdateAllPropertiesInBatch() { return false; @@ -321,10 +315,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return false; } - @Override - public void collectQueryStats(ObjectGraphNode objectGraphNode, long loadedBeanCount, long timeMicros) { - } - @Override public void visitMetrics(MetricVisitor visitor) { } diff --git a/src/test/java/org/tests/query/finder/TestCustomerFinder.java b/src/test/java/org/tests/query/finder/TestCustomerFinder.java index 276c780b6..129650dfb 100644 --- a/src/test/java/org/tests/query/finder/TestCustomerFinder.java +++ b/src/test/java/org/tests/query/finder/TestCustomerFinder.java @@ -3,7 +3,7 @@ package org.tests.query.finder; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Transaction; -import io.ebean.meta.MetaOrmQueryMetric; +import io.ebean.meta.MetaQueryMetric; import io.ebean.meta.MetaQueryPlan; import io.ebean.meta.MetaTimedMetric; import io.ebean.meta.QueryPlanRequest; @@ -178,10 +178,10 @@ public class TestCustomerFinder extends BaseTestCase { ServerMetrics metrics = server().getMetaInfoManager().collectMetrics(); - List planStats = metrics.getOrmQueryMetrics(); + List planStats = metrics.getQueryMetrics(); assertThat(planStats.size()).isGreaterThan(4); - for (MetaOrmQueryMetric planStat : planStats) { + for (MetaQueryMetric planStat : planStats) { System.out.println(planStat); } @@ -275,7 +275,7 @@ public class TestCustomerFinder extends BaseTestCase { .write(buffer); String metricsJson = buffer.toString(); - assertThat(metricsJson).contains("{\"db\":\"h2\", \"metrics\":["); + assertThat(metricsJson).contains(" \"metrics\":["); assertThat(metricsJson).contains("\"name\":\"txn.main\""); assertThat(metricsJson).contains("\"name\":\"Customer.findList\""); } diff --git a/src/test/java/org/tests/query/other/TestObjectGraphNodeStatsCollection.java b/src/test/java/org/tests/query/other/TestObjectGraphNodeStatsCollection.java deleted file mode 100644 index a7c26b691..000000000 --- a/src/test/java/org/tests/query/other/TestObjectGraphNodeStatsCollection.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.tests.query.other; - -import io.ebean.BaseTestCase; -import io.ebean.Ebean; -import io.ebean.EbeanServer; -import io.ebean.meta.BasicMetricVisitor; -import io.ebean.meta.MetaInfoManager; -import io.ebean.meta.MetaOrmQueryMetric; -import io.ebean.meta.MetaOrmQueryNode; -import org.junit.Assert; -import org.junit.Test; -import org.tests.model.basic.Address; -import org.tests.model.basic.Customer; -import org.tests.model.basic.Order; -import org.tests.model.basic.OrderDetail; -import org.tests.model.basic.ResetBasicData; - -import java.util.List; - -public class TestObjectGraphNodeStatsCollection extends BaseTestCase { - - @Test - public void test() { - - ResetBasicData.reset(); - - EbeanServer server = Ebean.getServer(null); - - MetaInfoManager infoManager = server.getMetaInfoManager(); - - server.find(Order.class).findCount(); - - infoManager.collectNodeStatistics(true); - infoManager.resetAllMetrics(); - - runFindOrderQuery(server); - runFindCustomerQuery(server); - - List nodeStatistics = infoManager.collectNodeStatistics(true); - for (MetaOrmQueryNode stat : nodeStatistics) { - System.out.println(stat); - } - - BasicMetricVisitor basic = infoManager.visitBasic(); - for (MetaOrmQueryMetric queryMetric : basic.getOrmQueryMetrics()) { - System.out.println(queryMetric); - } - - } - - private void runFindCustomerQuery(EbeanServer server) { - - List customers = server.find(Customer.class) - .select("name") - .fetch("contacts") - .findList(); - - Assert.assertTrue(!customers.isEmpty()); - - List custs = server.find(Customer.class).select("name").findList(); - for (Customer customer : custs) { - customer.getShippingAddress(); - } - } - - private void runFindOrderQuery(EbeanServer server) { - List orders = server.find(Order.class) - .where().gt("id", 0) - .order().asc("orderDate") - .setMaxRows(40) - .findList(); - - for (Order order : orders) { - Customer customer = order.getCustomer(); - Address billingAddress = customer.getBillingAddress(); - if (billingAddress != null) { - billingAddress.getCity(); - } - Address shippingAddress = customer.getShippingAddress(); - if (shippingAddress != null) { - shippingAddress.getCity(); - } - List details = order.getDetails(); - for (OrderDetail orderDetail : details) { - orderDetail.getUnitPrice(); - orderDetail.getProduct().getName(); - } - - } - - } - - @Test - public void testFindByIds() { - - ResetBasicData.reset(); - - List ids = Ebean.find(Order.class).findIds(); - Assert.assertTrue(!ids.isEmpty()); - - } - -}