From 40d9c88e34d024d37c8957dd293c8244f1ef9882 Mon Sep 17 00:00:00 2001
From: Rob Bygrave
Date: Mon, 25 Mar 2024 22:52:04 +1300
Subject: [PATCH] #1857 Add bind values capture for SlowQueryEvent /
SlowQueryListener
- changes SqlQueryEvent into an interface.
- captures the bind values the slow query used and makes those available via SlowQueryEvent
- also makes the query label and profileLocation available via SlowQueryEvent
---
.../java/io/ebean/config/SlowQueryEvent.java | 56 ++++++--------
.../io/ebeaninternal/api/SpiExpression.java | 2 +-
.../ebeaninternal/api/SpiExpressionBind.java | 29 ++++++++
.../api/SpiExpressionRequest.java | 23 +-----
.../server/core/DSlowQueryEvent.java | 70 ++++++++++++++++++
.../server/core/DefaultServer.java | 4 +-
.../server/core/DefaultSlowQueryListener.java | 15 ++--
.../server/core/SlowQueryBindCapture.java | 71 ++++++++++++++++++
.../server/deploy/id/IdBinder.java | 3 +-
.../server/deploy/id/IdBinderEmbedded.java | 3 +-
.../server/deploy/id/IdBinderEmpty.java | 3 +-
.../server/deploy/id/IdBinderSimple.java | 3 +-
.../server/expression/AbstractExpression.java | 2 +-
.../expression/AbstractTextExpression.java | 3 +-
.../expression/AllEqualsExpression.java | 2 +-
.../expression/ArrayContainsExpression.java | 3 +-
.../expression/ArrayIsEmptyExpression.java | 3 +-
.../server/expression/BetweenExpression.java | 3 +-
.../expression/BetweenPropertyExpression.java | 2 +-
.../server/expression/BitwiseExpression.java | 3 +-
.../CaseInsensitiveEqualExpression.java | 3 +-
.../expression/DefaultExampleExpression.java | 10 +--
.../expression/DefaultExpressionList.java | 2 +-
.../expression/ExistsQueryExpression.java | 2 +-
.../expression/ExistsSqlQueryExpression.java | 2 +-
.../server/expression/IdExpression.java | 2 +-
.../server/expression/IdInExpression.java | 2 +-
.../server/expression/InExpression.java | 7 +-
.../server/expression/InPairsExpression.java | 8 +-
.../server/expression/InRangeExpression.java | 3 +-
.../server/expression/InTuplesExpression.java | 7 +-
.../server/expression/IsEmptyExpression.java | 7 +-
.../server/expression/JsonPathExpression.java | 3 +-
.../server/expression/JunctionExpression.java | 2 +-
.../server/expression/LikeExpression.java | 5 +-
.../server/expression/LogicExpression.java | 9 +--
.../expression/NativeILikeExpression.java | 4 +-
.../NestedPathWrapperExpression.java | 9 +--
.../server/expression/NoopExpression.java | 2 +-
.../server/expression/NotExpression.java | 9 +--
.../server/expression/NullExpression.java | 7 +-
.../server/expression/RawExpression.java | 2 +-
.../server/expression/SimpleExpression.java | 8 +-
.../server/expression/SubQueryExpression.java | 2 +-
.../expression/SubQueryRawExpression.java | 3 +-
.../server/core/SlowQueryBindCaptureTest.java | 74 +++++++++++++++++++
ebean-core/src/test/resources/h2-init.sql | 6 +-
.../resources/application-test.properties | 1 +
.../src/test/resources/ebean.properties | 1 +
49 files changed, 349 insertions(+), 156 deletions(-)
create mode 100644 ebean-core/src/main/java/io/ebeaninternal/api/SpiExpressionBind.java
create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/core/DSlowQueryEvent.java
create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/core/SlowQueryBindCapture.java
create mode 100644 ebean-core/src/test/java/io/ebeaninternal/server/core/SlowQueryBindCaptureTest.java
diff --git a/ebean-api/src/main/java/io/ebean/config/SlowQueryEvent.java b/ebean-api/src/main/java/io/ebean/config/SlowQueryEvent.java
index 6afd71502..fc6413059 100644
--- a/ebean-api/src/main/java/io/ebean/config/SlowQueryEvent.java
+++ b/ebean-api/src/main/java/io/ebean/config/SlowQueryEvent.java
@@ -1,50 +1,29 @@
package io.ebean.config;
+import io.ebean.ProfileLocation;
import io.ebean.bean.ObjectGraphNode;
+import java.util.List;
+
/**
- * Slow query event.
+ * The data for the slow query.
*/
-public class SlowQueryEvent {
-
- private final String sql;
-
- private final long timeMillis;
-
- private final int rowCount;
-
- private final ObjectGraphNode originNode;
-
- /**
- * Construct with the SQL and execution time in millis.
- */
- public SlowQueryEvent(String sql, long timeMillis, int rowCount, ObjectGraphNode originNode) {
- this.sql = sql;
- this.timeMillis = timeMillis;
- this.rowCount = rowCount;
- this.originNode = originNode;
- }
+public interface SlowQueryEvent {
/**
* Return the SQL for the slow query.
*/
- public String getSql() {
- return sql;
- }
+ String getSql();
/**
* Return the execution time in millis.
*/
- public long getTimeMillis() {
- return timeMillis;
- }
+ long getTimeMillis();
/**
* Return the total row count associated with the query.
*/
- public int getRowCount() {
- return rowCount;
- }
+ int getRowCount();
/**
* Return the origin point for the root query.
@@ -53,7 +32,20 @@ public class SlowQueryEvent {
* shows the code that invoked the query.
*
*/
- public ObjectGraphNode getOriginNode() {
- return originNode;
- }
+ ObjectGraphNode getOriginNode();
+
+ /**
+ * Return the bind parameters.
+ */
+ List