diff --git a/src/main/java/io/ebean/ProfileLocation.java b/src/main/java/io/ebean/ProfileLocation.java index d433f4c3d..7b4b778b8 100644 --- a/src/main/java/io/ebean/ProfileLocation.java +++ b/src/main/java/io/ebean/ProfileLocation.java @@ -40,6 +40,11 @@ public interface ProfileLocation { */ String shortDescription(); + /** + * Return the short label. + */ + String label(); + /** * Add execution time. */ diff --git a/src/main/java/io/ebeaninternal/api/SpiQuery.java b/src/main/java/io/ebeaninternal/api/SpiQuery.java index c951dae39..483749988 100644 --- a/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -197,6 +197,11 @@ public interface SpiQuery extends Query, TxnProfileEventCodes { */ String getLabel(); + /** + * Return the label manually set on the query or from the profile location. + */ + String getPlanLabel(); + /** * Return true if this is a "find by id" query. This includes a check for a single "equal to" expression for the Id. */ diff --git a/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java b/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java index 790bf2128..30d5c0c72 100644 --- a/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java +++ b/src/main/java/io/ebeaninternal/server/profile/BasicProfileLocation.java @@ -5,14 +5,16 @@ import io.ebean.ProfileLocation; /** * Fixed / given location. Used internally for find by id and find all. */ -class BasicProfileLocation implements ProfileLocation { +final class BasicProfileLocation implements ProfileLocation { private final String location; private final String shortDescription; + private final String label; BasicProfileLocation(String location) { this.location = location; this.shortDescription = shortDesc(location); + this.label = UtilLocation.label(shortDescription); } @Override @@ -30,6 +32,11 @@ class BasicProfileLocation implements ProfileLocation { return location; } + @Override + public String label() { + return label; + } + @Override public String shortDescription() { return shortDescription; @@ -38,9 +45,9 @@ class BasicProfileLocation implements ProfileLocation { private String shortDesc(String location) { int lastPer = location.lastIndexOf('.'); if (lastPer > -1) { - lastPer = location.lastIndexOf('.', lastPer-1); + lastPer = location.lastIndexOf('.', lastPer - 1); if (lastPer > -1) { - return location.substring(lastPer+1); + return location.substring(lastPer + 1); } } return location; diff --git a/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java b/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java index 9a4afc62d..03cf36070 100644 --- a/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java +++ b/src/main/java/io/ebeaninternal/server/profile/DProfileLocation.java @@ -15,6 +15,8 @@ class DProfileLocation implements ProfileLocation { private String shortDescription; + private String label; + private final int lineNumber; DProfileLocation() { @@ -42,12 +44,19 @@ class DProfileLocation implements ProfileLocation { public String obtain() { // atomic assignment so happy with this if (location == null) { - location = create(); - shortDescription = shortDesc(location); + final String loc = create(); + shortDescription = shortDesc(loc); + label = UtilLocation.label(shortDescription); + location = loc; } return location; } + @Override + public String label() { + return label; + } + @Override public String shortDescription() { return shortDescription; diff --git a/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java b/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java new file mode 100644 index 000000000..06aedef6d --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/profile/UtilLocation.java @@ -0,0 +1,14 @@ +package io.ebeaninternal.server.profile; + +final class UtilLocation { + + static String label(String shortDescription) { + int pos = shortDescription.indexOf("("); + if (pos == -1) { + return shortDescription; + } else { + return shortDescription.substring(0, pos); + } + } + +} diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index d067a2c46..ef3ea29d0 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -110,7 +110,7 @@ public class CQueryPlan { this.planKey = request.getQueryPlanKey(); SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); - this.label = query.getLabel(); + this.label = query.getPlanLabel(); this.location = location(); this.autoTuned = query.isAutoTuned(); this.asOfTableCount = query.getAsOfTableCount(); @@ -135,7 +135,7 @@ public class CQueryPlan { this.beanType = request.getBeanDescriptor().getBeanType(); SpiQuery query = request.getQuery(); this.profileLocation = query.getProfileLocation(); - this.label = query.getLabel(); + this.label = query.getPlanLabel(); this.location = location(); this.planKey = buildPlanKey(sql, rawSql, rowNumberIncluded, logWhereSql); this.autoTuned = false; diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java index 56653ef95..96fa43e29 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java @@ -164,7 +164,7 @@ public final class CQueryPlanStats { @Override public String toString() { - return "location:" + getLocation() + " metrics:" + metrics + " sql:" + getSql(); + return "label:" + getLabel() + " location:" + getLocation() + " metrics:" + metrics + " sql:" + getSql(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 0f10c5201..d79455f5d 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -361,6 +361,17 @@ public class DefaultOrmQuery implements SpiQuery { return label; } + @Override + public String getPlanLabel() { + if (label != null) { + return label; + } + if (profileLocation != null) { + return profileLocation.label(); + } + return null; + } + @Override public Query setLabel(String label) { this.label = label; diff --git a/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java b/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java index 7ec7e7667..139dc3bf8 100644 --- a/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java +++ b/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java @@ -15,6 +15,8 @@ public class BasicProfileLocationTest { assertThat(loc.obtain()).endsWith(":12)"); assertThat(loc.shortDescription()).isEqualTo("NativeMethodAccessorImpl.invoke0(Native Method:12)"); + assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0"); + } @Test @@ -23,6 +25,7 @@ public class BasicProfileLocationTest { BasicProfileLocation loc = new BasicProfileLocation("com.foo.Bar.all"); assertThat(loc.obtain()).isEqualTo("com.foo.Bar.all"); assertThat(loc.shortDescription()).isEqualTo("Bar.all"); + assertThat(loc.label()).isEqualTo("Bar.all"); } @Test @@ -31,5 +34,6 @@ public class BasicProfileLocationTest { BasicProfileLocation loc = new BasicProfileLocation("foo.Bar.all"); assertThat(loc.obtain()).isEqualTo("foo.Bar.all"); assertThat(loc.shortDescription()).isEqualTo("Bar.all"); + assertThat(loc.label()).isEqualTo("Bar.all"); } } diff --git a/src/test/java/org/tests/profile/ProfileLocationTest.java b/src/test/java/org/tests/profile/ProfileLocationTest.java index ef30d3bfa..8165a76a0 100644 --- a/src/test/java/org/tests/profile/ProfileLocationTest.java +++ b/src/test/java/org/tests/profile/ProfileLocationTest.java @@ -17,6 +17,8 @@ public class ProfileLocationTest { public void test_obtain() { assertThat(doIt()).isEqualTo("org.tests.profile.ProfileLocationTest.doIt(ProfileLocationTest.java:13)"); + assertThat(loc.shortDescription()).isEqualTo("ProfileLocationTest.doIt(ProfileLocationTest.java:13)"); + assertThat(loc.label()).isEqualTo("ProfileLocationTest.doIt"); } @Test