From f06f21cf5eca8c09a66da51c9f56ee9d10c5cdc0 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 27 Mar 2019 16:12:09 +1300 Subject: [PATCH] #1660 - Modify MetaOrmQueryMetric getQueryPlanHash to return hash of sql --- .../io/ebeaninternal/server/query/CQueryPlan.java | 15 +++++++++++---- .../server/query/CQueryPlanStats.java | 2 +- .../java/io/ebeaninternal/server/util/Md5.java | 5 ++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java index ef3ea29d0..5680b3135 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlan.java @@ -72,6 +72,7 @@ public class CQueryPlan { private final boolean rowNumberIncluded; private final String sql; + private final String sqlHash; private final String logWhereSql; @@ -115,6 +116,7 @@ public class CQueryPlan { this.autoTuned = query.isAutoTuned(); this.asOfTableCount = query.getAsOfTableCount(); this.sql = sqlRes.getSql(); + this.sqlHash = md5Hash(sql); this.rowNumberIncluded = sqlRes.isIncludesRowNumberColumn(); this.sqlTree = sqlTree; this.rawSql = rawSql; @@ -141,6 +143,7 @@ public class CQueryPlan { this.autoTuned = false; this.asOfTableCount = 0; this.sql = sql; + this.sqlHash = md5Hash(sql); this.sqlTree = sqlTree; this.rawSql = rawSql; this.rowNumberIncluded = rowNumberIncluded; @@ -245,21 +248,25 @@ public class CQueryPlan { private String calcAuditQueryKey() { // rawSql needs to include the MD5 hash of the sql - return rawSql ? planKey.getPartialKey() + "_" + getSqlMd5Hash() : planKey.getPartialKey(); + return rawSql ? planKey.getPartialKey() + "_" + sqlHash : planKey.getPartialKey(); } /** - * Return the MD5 hash of the underlying sql. + * Return the MD5 hash of the sql. */ - private String getSqlMd5Hash() { + private String md5Hash(String sql) { try { return Md5.hash(sql); } catch (Exception e) { - logger.error("Failed to MD5 hash the rawSql query", e); + logger.error("Failed to MD5 hash the query", e); return "error"; } } + public String getSqlHash() { + return sqlHash; + } + public String getSql() { return sql; } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java index 96fa43e29..8498b3280 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryPlanStats.java @@ -239,7 +239,7 @@ public final class CQueryPlanStats { @Override public String getQueryPlanHash() { - return queryPlan.getPlanKey().toString(); + return queryPlan.getSqlHash(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/util/Md5.java b/src/main/java/io/ebeaninternal/server/util/Md5.java index 3ddddb681..ff8983e1e 100644 --- a/src/main/java/io/ebeaninternal/server/util/Md5.java +++ b/src/main/java/io/ebeaninternal/server/util/Md5.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.util; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -public class Md5 { +public final class Md5 { /** * Return the MD5 hash of the underlying sql. @@ -12,8 +12,7 @@ public class Md5 { try { MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] digest = md.digest(content.getBytes(StandardCharsets.UTF_8)); - return digestToHex(digest); + return digestToHex(md.digest(content.getBytes(StandardCharsets.UTF_8))); } catch (Exception e) { throw new RuntimeException("MD5 hashing failed", e); }