#1562 - Query cache use incorrect with RawExpression - incorrect bind hash

This commit is contained in:
rob bygrave
2018-11-29 09:54:24 +13:00
parent 211f28eea3
commit 70e2b1c2ae
3 changed files with 86 additions and 1 deletions
@@ -45,4 +45,27 @@ public class RawExpressionTest extends BaseExpressionTest {
assertThat(exp("a", 10, 20).isSameByBind(exp("a", 10))).isFalse();
}
@Test
public void queryBindHash_when_sameBindValues() {
assert_queryBindHash_isSame(exp("a", 10), exp("a", 10));
}
@Test
public void queryBindHash_when_diffBindValues() {
assert_queryBindHash_isDifferent(exp("a", 10), exp("a", 20));
}
@Test
public void queryBindHash_when_diffBindValues2() {
assert_queryBindHash_isDifferent(exp("a", 10), exp("a", 10, 11));
}
public void assert_queryBindHash_isDifferent(RawExpression exp0, RawExpression exp1) {
assertThat(exp0.queryBindHash()).isNotEqualTo(exp1.queryBindHash());
}
public void assert_queryBindHash_isSame(RawExpression exp0, RawExpression exp1) {
assertThat(exp0.queryBindHash()).isEqualTo(exp1.queryBindHash());
}
}
@@ -62,6 +62,60 @@ public class TestQueryCacheCountry extends BaseTestCase {
assertEquals(1, queryStats1.getHitCount());
}
@Test
public void rawExpression() {
ResetBasicData.reset();
awaitL2Cache();
clearCache();
List<Country> countryList0 = Ebean.find(Country.class)
.setUseQueryCache(true)
.where().raw("code = ?", "NZ")
.findList();
assertThat(countryList0.get(0).getName()).isEqualTo("New Zealand");
List<Country> countryList1 = Ebean.find(Country.class)
.setUseQueryCache(true)
.where().raw("code = ?", "AU")
.findList();
assertThat(countryList1.get(0).getName()).isEqualTo("Australia");
ServerCacheStatistics queryStats1 = queryCache.getStatistics(false);
assertEquals(2, queryStats1.getMissCount());
assertEquals(2, queryStats1.getSize());
assertEquals(0, queryStats1.getHitCount()); // no hits yet
// we get a hit this time
List<Country> countryList2 = Ebean.find(Country.class)
.setUseQueryCache(true)
.where().raw("code = ?", "NZ")
.findList();
assertThat(countryList2.get(0).getName()).isEqualTo("New Zealand");
ServerCacheStatistics queryStats2 = queryCache.getStatistics(false);
assertEquals(2, queryStats2.getMissCount());
assertEquals(2, queryStats2.getSize());
assertEquals(1, queryStats2.getHitCount()); // got a hit
// we get a hit on AU
List<Country> countryList3 = Ebean.find(Country.class)
.setUseQueryCache(true)
.where().raw("code = ?", "AU")
.findList();
assertThat(countryList3.get(0).getName()).isEqualTo("Australia");
ServerCacheStatistics queryStats3 = queryCache.getStatistics(false);
assertEquals(2, queryStats3.getMissCount());
assertEquals(2, queryStats3.getSize());
assertEquals(2, queryStats3.getHitCount()); // got another hit
}
@Test
public void test() {
@@ -104,6 +158,10 @@ public class TestQueryCacheCountry extends BaseTestCase {
.findList();
assertNotSame(countryList2, countryList0);
nz = Ebean.find(Country.class, "NZ");
nz.setName("New Zealand");
Ebean.save(nz);
}
}