diff --git a/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java b/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java index 4258b7c9ca..d6a4e18df5 100644 --- a/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java +++ b/ebean-api/src/main/java/io/ebean/meta/MetaQueryPlan.java @@ -9,6 +9,11 @@ */ public interface MetaQueryPlan { + /** + * Return the name of the database for the query. + */ + String dbName(); + /** * Return the bean type for the query. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java index 6241fc9747..79b5fe9e55 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMappingRequest.java @@ -80,6 +80,10 @@ public String name() { return name; } + public String dbName() { + return server.name(); + } + public String hash() { return hash; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanBase.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanBase.java index 47e38c535b..d5e9cd9d54 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanBase.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoQueryPlanBase.java @@ -15,6 +15,7 @@ abstract class DtoQueryPlanBase implements DtoQueryPlan, SpiQueryPlan { private final QueryPlanMetric planMetric; private final TimedMetric metric; private final Class beanType; + private final String dbName; private final String name; private final String hash; private final String sql; @@ -26,6 +27,7 @@ abstract class DtoQueryPlanBase implements DtoQueryPlan, SpiQueryPlan { this.planMetric = request.createMetric(); this.metric = planMetric.metric(); this.beanType = request.type(); + this.dbName = request.dbName(); this.name = request.name(); this.hash = request.hash(); this.sql = request.sql(); @@ -91,6 +93,6 @@ public void queryPlanInit(long thresholdMicros) { @Override public SpiDbQueryPlan createMeta(String bind, String planString) { - return new DQueryPlanOutput(beanType, name, hash, sql, profileLocation, bind, planString); + return new DQueryPlanOutput(beanType, dbName, name, hash, sql, profileLocation, bind, planString); } } 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 e5aad3e6e6..e44dffb02b 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 @@ -274,7 +274,7 @@ public final void queryPlanInit(long thresholdMicros) { @Override public final DQueryPlanOutput createMeta(String bind, String planString) { - return new DQueryPlanOutput(beanType(), name, hash, sql, profileLocation, bind, planString); + return new DQueryPlanOutput(beanType(), server.name(), name, hash, sql, profileLocation, bind, planString); } public DataReader createDataReader(boolean unmodifiable, ResultSet rset) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java index 3a28caca42..16a1dfd828 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/DQueryPlanOutput.java @@ -12,6 +12,7 @@ public final class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { private final Class beanType; + private final String dbName; private final String label; private final ProfileLocation profileLocation; @@ -25,8 +26,9 @@ public final class DQueryPlanOutput implements MetaQueryPlan, SpiDbQueryPlan { private Instant whenCaptured; private Object tenantId; - public DQueryPlanOutput(Class beanType, String label, String hash, String sql, ProfileLocation profileLocation, String bind, String plan) { + public DQueryPlanOutput(Class beanType, String dbName, String label, String hash, String sql, ProfileLocation profileLocation, String bind, String plan) { this.beanType = beanType; + this.dbName = dbName; this.label = label; this.hash = hash; this.sql = sql; @@ -35,6 +37,11 @@ public DQueryPlanOutput(Class beanType, String label, String hash, String sql this.plan = plan; } + @Override + public String dbName() { + return dbName; + } + @Override public String hash() { return hash; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlQueryPlan.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlQueryPlan.java index ee3b4bf75e..84c3bf8ec9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlQueryPlan.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/SqlQueryPlan.java @@ -21,11 +21,13 @@ public final class SqlQueryPlan implements SpiQueryPlan { private final String name; private final String hash; private final String sql; + private final String dbName; private final SpiQueryBindCapture bindCapture; SqlQueryPlan(SpiEbeanServer server, String name, String sql) { this.name = name; this.sql = sql; + this.dbName = server.name(); this.hash = Md5.hash(sql, name); this.bindCapture = server.createQueryBindCapture(this); } @@ -77,6 +79,6 @@ public void queryPlanInit(long thresholdMicros) { @Override public SpiDbQueryPlan createMeta(String bind, String planString) { - return new DQueryPlanOutput(null, name, hash, sql, null, bind, planString); + return new DQueryPlanOutput(null, dbName, name, hash, sql, null, bind, planString); } } diff --git a/ebean-test/src/test/java/io/ebean/xtest/base/DtoQueryPlanCaptureTest.java b/ebean-test/src/test/java/io/ebean/xtest/base/DtoQueryPlanCaptureTest.java index 42774152b0..abe2002500 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/base/DtoQueryPlanCaptureTest.java +++ b/ebean-test/src/test/java/io/ebean/xtest/base/DtoQueryPlanCaptureTest.java @@ -125,6 +125,7 @@ void nativeDtoQuery_capturesQueryPlan() { .orElse(null); assertThat(dtoPlan).as("captured a native DTO query plan").isNotNull(); + assertThat(dtoPlan.dbName()).isEqualTo(DB.getDefault().name()); assertThat(dtoPlan.sql()).contains("from o_customer where id > ?"); assertThat(dtoPlan.plan()).isNotEmpty(); } diff --git a/ebean-test/src/test/java/io/ebean/xtest/base/SqlQueryPlanCaptureTest.java b/ebean-test/src/test/java/io/ebean/xtest/base/SqlQueryPlanCaptureTest.java index ef9f7b728d..26f698d21d 100644 --- a/ebean-test/src/test/java/io/ebean/xtest/base/SqlQueryPlanCaptureTest.java +++ b/ebean-test/src/test/java/io/ebean/xtest/base/SqlQueryPlanCaptureTest.java @@ -71,6 +71,7 @@ void sqlQuery_capturesQueryPlan() { .orElse(null); assertThat(sqlPlan).as("captured a SqlQuery query plan").isNotNull(); + assertThat(sqlPlan.dbName()).isEqualTo(DB.getDefault().name()); assertThat(sqlPlan.sql()).contains("from o_customer where id > ?"); assertThat(sqlPlan.plan()).isNotEmpty(); } diff --git a/ebean-test/src/test/java/org/tests/query/finder/TestCustomerFinder.java b/ebean-test/src/test/java/org/tests/query/finder/TestCustomerFinder.java index 924f5f25a6..4400729e43 100644 --- a/ebean-test/src/test/java/org/tests/query/finder/TestCustomerFinder.java +++ b/ebean-test/src/test/java/org/tests/query/finder/TestCustomerFinder.java @@ -191,6 +191,7 @@ public void test_finders_queryPlans() { request.maxTimeMillis(10_000); List plans0 = server().metaInfo().queryPlanCollectNow(request); assertThat(plans0).isNotEmpty(); + assertThat(plans0).extracting(MetaQueryPlan::dbName).containsOnly(server().name()); for (MetaQueryPlan plan : plans0) { logger.info("queryPlan label:{}, queryTimeMicros:{} captureMicros:{} whenCaptured:{} captureCount:{} loc:{} sql:{} bind:{} plan:{}",