diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java index b96a08987..a03634ff0 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java @@ -466,16 +466,6 @@ public interface SpiQuery extends Query { */ String getName(); - /** - * Calculate a hash used by AutoTune to identify when a query has changed - * (and hence potentially needs a new tuned query plan to be developed). - *

- * Excludes bind values and occurs prior to AutoTune potentially - * tuning/modifying the query. - *

- */ - HashQueryPlan queryAutoTuneHash(HashQueryPlanBuilder builder); - /** * Identifies queries that are the same bar the bind variables. *

diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java index f21eae234..7f3dea20d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -759,13 +759,10 @@ public class DefaultOrmQuery implements SpiQuery { /** * Calculate the query hash for either AutoTune query tuning or Query Plan caching. */ - private HashQueryPlan calculateHash(HashQueryPlanBuilder builder) { + HashQueryPlan calculateQueryPlanHash() { // exclude bind values and things unrelated to the sql being generated - - if (builder == null) { - builder = new HashQueryPlanBuilder(); - } + HashQueryPlanBuilder builder = new HashQueryPlanBuilder(); builder.add((type == null ? 0 : type.ordinal() + 1)); builder.add(autoTuned).add(distinct).add(sqlDistinct).add(query); @@ -796,15 +793,6 @@ public class DefaultOrmQuery implements SpiQuery { return builder.build(); } - /** - * Calculate a hash used by AutoTune to identify when a query has changed (and hence potentially - * needs a new tuned query plan to be developed). - */ - public HashQueryPlan queryAutoTuneHash(HashQueryPlanBuilder builder) { - - return calculateHash(builder); - } - /** * Calculate a hash that should be unique for the generated SQL across a given bean type. *

@@ -818,7 +806,7 @@ public class DefaultOrmQuery implements SpiQuery { prepareExpressions(request); - queryPlanHash = calculateHash(null); + queryPlanHash = calculateQueryPlanHash(); return queryPlanHash; } diff --git a/src/test/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java b/src/test/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java index 6539e9b3c..e3c5dbf9a 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java @@ -3,9 +3,6 @@ package com.avaje.ebeaninternal.server.querydefn; import com.avaje.ebean.Ebean; import com.avaje.ebean.FetchConfig; -import com.avaje.ebeaninternal.api.HashQueryPlan; -import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; -import com.avaje.ebeaninternal.api.SpiQuery; import com.avaje.tests.model.basic.Order; import org.junit.Test; @@ -14,51 +11,65 @@ import static org.assertj.core.api.Assertions.assertThat; public class DefaultOrmQueryTest { @Test - public void testQueryAutofetchHash() throws Exception { + public void when_addWhere_then_planChanges() { - SpiQuery query1 = (SpiQuery)Ebean.find(Order.class) + DefaultOrmQuery q1 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("name", "a","b","c").query(); + DefaultOrmQuery q2 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("id", 2,2,3).query(); + + assertThat(q1.calculateQueryPlanHash()).isNotEqualTo(q2.calculateQueryPlanHash()); + assertThat(q1.queryBindHash()).isNotEqualTo(q2.queryBindHash()); + } + + @Test + public void when_sameWhereWithDiffBindValues_then_planSame_bindDiff() { + + DefaultOrmQuery q1 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("id", 1,2,3).query(); + DefaultOrmQuery q2 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("id", 2,2,3).query(); + + assertThat(q1.calculateQueryPlanHash()).isEqualTo(q2.calculateQueryPlanHash()); + assertThat(q1.queryBindHash()).isNotEqualTo(q2.queryBindHash()); + } + + @Test + public void when_sameWhereAndBindValues_then_planSameAndBind() { + + DefaultOrmQuery q1 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("id", 1,2,3).query(); + DefaultOrmQuery q2 = (DefaultOrmQuery)Ebean.find(Order.class).where().in("id", 1,2,3).query(); + + assertThat(q1.calculateQueryPlanHash()).isEqualTo(q2.calculateQueryPlanHash()); + assertThat(q1.queryBindHash()).isEqualTo(q2.queryBindHash()); + } + + + @Test + public void when_FetchConfig_then_differentPlan() throws Exception { + + DefaultOrmQuery query1 = (DefaultOrmQuery)Ebean.find(Order.class) .select("status, shipDate") .fetch("details", "orderQty, unitPrice", new FetchConfig().query()) .fetch("details.product", "sku, name"); - HashQueryPlanBuilder b1 = new HashQueryPlanBuilder(); - query1.queryAutoTuneHash(b1); - HashQueryPlan hash1 = b1.build(); - SpiQuery query2 = (SpiQuery)Ebean.find(Order.class) + DefaultOrmQuery query2 = (DefaultOrmQuery)Ebean.find(Order.class) .select("status, shipDate") .fetch("details", "orderQty, unitPrice") .fetch("details.product", "sku, name"); - HashQueryPlanBuilder b2 = new HashQueryPlanBuilder(); - query2.queryAutoTuneHash(b2); - HashQueryPlan hash2 = b2.build(); - - assertThat(hash1).isNotEqualTo(hash2); - + assertThat(query1.calculateQueryPlanHash()).isNotEqualTo(query2.calculateQueryPlanHash()); } @Test - public void test_AutofetchHash_diffFirstRows() throws Exception { + public void when_diffFirstMaxRows_then_differentPlan() throws Exception { - SpiQuery query1 = (SpiQuery)Ebean.find(Order.class) + DefaultOrmQuery query1 = (DefaultOrmQuery)Ebean.find(Order.class) .setFirstRow(0) .setMaxRows(31); - HashQueryPlanBuilder b1 = new HashQueryPlanBuilder(); - query1.queryAutoTuneHash(b1); - HashQueryPlan hash1 = b1.build(); - - SpiQuery query2 = (SpiQuery)Ebean.find(Order.class) + DefaultOrmQuery query2 = (DefaultOrmQuery)Ebean.find(Order.class) .setFirstRow(1) .setMaxRows(0); - HashQueryPlanBuilder b2 = new HashQueryPlanBuilder(); - query2.queryAutoTuneHash(b2); - HashQueryPlan hash2 = b2.build(); - - assertThat(hash1).isNotEqualTo(hash2); - + assertThat(query1.calculateQueryPlanHash()).isNotEqualTo(query2.calculateQueryPlanHash()); } } \ No newline at end of file diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryPlanHash.java b/src/test/java/com/avaje/tests/query/other/TestQueryPlanHash.java deleted file mode 100644 index 8e57deb97..000000000 --- a/src/test/java/com/avaje/tests/query/other/TestQueryPlanHash.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.avaje.tests.query.other; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.Ebean; -import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; -import com.avaje.ebeaninternal.api.SpiQuery; -import com.avaje.tests.model.basic.Order; - -public class TestQueryPlanHash { - - @Test - public void test() { - - - HashQueryPlanBuilder builder1 = new HashQueryPlanBuilder(); - - SpiQuery squery = (SpiQuery)Ebean.find(Order.class); - squery.queryAutoTuneHash(builder1); - - squery.where().in("id", 1,2,3); - - HashQueryPlanBuilder builder2 = new HashQueryPlanBuilder(); - squery.queryAutoTuneHash(builder2); - int q1BindHash = squery.queryBindHash(); - - Assert.assertNotSame(builder1.build(), builder2.build()); - - HashQueryPlanBuilder builder3 = new HashQueryPlanBuilder(); - SpiQuery squery2 = (SpiQuery)Ebean.find(Order.class); - squery2.where().in("id", 2,2,3); - - squery2.queryAutoTuneHash(builder3); - int q2BindHash = squery2.queryBindHash(); - - Assert.assertEquals(builder3.build(), builder2.build()); - - Assert.assertTrue(q1BindHash != q2BindHash); - - HashQueryPlanBuilder builder4 = new HashQueryPlanBuilder(); - SpiQuery squery4 = (SpiQuery)Ebean.find(Order.class); - squery4.where().in("name", 2,2,3); - - squery4.queryAutoTuneHash(builder4); - int q4BindHash = squery4.queryBindHash(); - - //different query plan - Assert.assertTrue(!builder3.build().equals(builder4.build())); - - //same bind hash - Assert.assertTrue(q4BindHash == q2BindHash); - - } - -}