#566 - Refactor internals - SpiExpression, add prepareExpression() to merge queryAutoTuneHash() and queryPlanHash() - move to protected calculateQueryPlanHash()

This commit is contained in:
Robin Bygrave
2016-02-13 21:22:52 +13:00
parent ca944eb756
commit 076f8a03b9
4 changed files with 42 additions and 109 deletions
@@ -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<Order> q1 = (DefaultOrmQuery<Order>)Ebean.find(Order.class).where().in("name", "a","b","c").query();
DefaultOrmQuery<Order> q2 = (DefaultOrmQuery<Order>)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<Order> q1 = (DefaultOrmQuery<Order>)Ebean.find(Order.class).where().in("id", 1,2,3).query();
DefaultOrmQuery<Order> q2 = (DefaultOrmQuery<Order>)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<Order> q1 = (DefaultOrmQuery<Order>)Ebean.find(Order.class).where().in("id", 1,2,3).query();
DefaultOrmQuery<Order> q2 = (DefaultOrmQuery<Order>)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());
}
}
@@ -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<Order> squery = (SpiQuery<Order>)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<Order> squery2 = (SpiQuery<Order>)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<Order> squery4 = (SpiQuery<Order>)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);
}
}