mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Refactor query internals to reduce property parsing for partial select and fetch (#2167)
* Update test only - update TestBasicClobNoVer to use DB and AssertJ * Refactor OrmQueryProperties internals to reduce raw property parsing - Remove String properties - Reduces parsing of properties via fetchProperties() selectProperties() methods * No effective change - tidy pom.xml for ebean-querybean * Refactor query internals adding fetchProperties() selectProperties() - Adds SpiQueryFetch - Used by query beans with Set<String> properties passed (effectively skipping any parsing)
This commit is contained in:
+9
-3
@@ -11,7 +11,8 @@ public class OrmQueryPropertiesParserTest {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse(null);
|
||||
assertAllDefaults(res);
|
||||
assertThat(res.properties).isEqualTo("");
|
||||
assertThat(res.allProperties).isFalse();
|
||||
assertThat(res.included).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -19,7 +20,8 @@ public class OrmQueryPropertiesParserTest {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse("");
|
||||
assertAllDefaults(res);
|
||||
assertThat(res.properties).isEqualTo("");
|
||||
assertThat(res.allProperties).isFalse();
|
||||
assertThat(res.included).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -27,13 +29,15 @@ public class OrmQueryPropertiesParserTest {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse("*");
|
||||
assertAllDefaults(res);
|
||||
assertThat(res.properties).isEqualTo("*");
|
||||
assertThat(res.allProperties).isTrue();
|
||||
assertThat(res.included).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void when_no_spaces() {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse("id,name");
|
||||
assertThat(res.allProperties).isFalse();
|
||||
assertThat(res.included).containsExactly("id", "name");
|
||||
}
|
||||
|
||||
@@ -41,6 +45,7 @@ public class OrmQueryPropertiesParserTest {
|
||||
public void when_spaced() {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse("id, name");
|
||||
assertThat(res.allProperties).isFalse();
|
||||
assertThat(res.included).containsExactly("id", "name");
|
||||
}
|
||||
|
||||
@@ -48,6 +53,7 @@ public class OrmQueryPropertiesParserTest {
|
||||
public void when_formula() {
|
||||
|
||||
OrmQueryPropertiesParser.Response res = OrmQueryPropertiesParser.parse("a,MD5(id::text) as b,c");
|
||||
assertThat(res.allProperties).isFalse();
|
||||
assertThat(res.included).containsExactly("a", "MD5(id::text) as b", "c");
|
||||
}
|
||||
|
||||
|
||||
+3
-8
@@ -14,17 +14,12 @@ public class OrmQueryPropertiesTest {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Test(expected = NullPointerException.class)
|
||||
public void construct_with_propertySet_when_null() {
|
||||
new OrmQueryProperties(null, (LinkedHashSet<String>) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void construct_with_propertySet_when_empty() {
|
||||
|
||||
OrmQueryProperties p1 = new OrmQueryProperties(null, new LinkedHashSet<>());
|
||||
assertThat(p1.getProperties()).isEqualTo("");
|
||||
assertThat(p1.allProperties()).isFalse();
|
||||
assertThat(p1.getIncluded()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -34,7 +29,7 @@ public class OrmQueryPropertiesTest {
|
||||
set.add("name");
|
||||
OrmQueryProperties p1 = new OrmQueryProperties(null, set);
|
||||
|
||||
assertThat(p1.getProperties()).isEqualTo("name");
|
||||
assertThat(p1.getIncluded()).containsOnly("name");
|
||||
assertThat(p1.allProperties()).isFalse();
|
||||
}
|
||||
|
||||
@@ -47,7 +42,7 @@ public class OrmQueryPropertiesTest {
|
||||
set.add("startDate");
|
||||
OrmQueryProperties p1 = new OrmQueryProperties(null, set);
|
||||
|
||||
assertThat(p1.getProperties()).isEqualTo("id,name,startDate");
|
||||
assertThat(p1.getIncluded()).containsOnly("id", "name", "startDate");
|
||||
assertThat(p1.allProperties()).isFalse();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.tests.basic.lob;
|
||||
|
||||
import io.ebean.BaseTestCase;
|
||||
import io.ebean.Ebean;
|
||||
import io.ebean.EbeanServer;
|
||||
import io.ebean.DB;
|
||||
import io.ebean.Query;
|
||||
import org.tests.model.basic.EBasicClobNoVer;
|
||||
import org.ebeantest.LoggedSqlCollector;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
@@ -21,53 +19,50 @@ public class TestBasicClobNoVer extends BaseTestCase {
|
||||
EBasicClobNoVer entity = new EBasicClobNoVer();
|
||||
entity.setName("test");
|
||||
entity.setDescription("initialClobValue");
|
||||
EbeanServer server = Ebean.getServer(null);
|
||||
server.save(entity);
|
||||
|
||||
|
||||
String sqlNoClob = "select t0.id, t0.name from ebasic_clob_no_ver t0 where t0.id = ?";
|
||||
String sqlWithClob = "select t0.id, t0.name, t0.description from ebasic_clob_no_ver t0 where t0.id = ?";
|
||||
|
||||
DB.save(entity);
|
||||
|
||||
// Clob by default is Fetch Lazy
|
||||
Query<EBasicClobNoVer> defaultQuery = Ebean.find(EBasicClobNoVer.class).setId(entity.getId());
|
||||
Query<EBasicClobNoVer> defaultQuery = DB.find(EBasicClobNoVer.class).setId(entity.getId());
|
||||
defaultQuery.findOne();
|
||||
String sql = sqlOf(defaultQuery, 2);
|
||||
|
||||
Assert.assertTrue("Clob is fetch lazy by default", sql.contains(sqlNoClob));
|
||||
// default SQL select excludes clob
|
||||
String sqlNoClob = "select t0.id, t0.name from ebasic_clob_no_ver t0 where t0.id = ?";
|
||||
assertThat(sql).contains(sqlNoClob);
|
||||
|
||||
|
||||
// Explicitly select * including Clob
|
||||
Query<EBasicClobNoVer> explicitQuery = Ebean.find(EBasicClobNoVer.class).setId(entity.getId()).select("*");
|
||||
Query<EBasicClobNoVer> explicitQuery = DB.find(EBasicClobNoVer.class).setId(entity.getId()).select("*");
|
||||
|
||||
explicitQuery.findOne();
|
||||
sql = sqlOf(explicitQuery, 2);
|
||||
|
||||
Assert.assertTrue("Explicitly include Clob", sql.contains(sqlWithClob));
|
||||
// Explicitly include Clob
|
||||
String sqlWithClob = "select t0.id, t0.name, t0.description from ebasic_clob_no_ver t0 where t0.id = ?";
|
||||
assertThat(sql).contains(sqlWithClob);
|
||||
|
||||
// Update description to test refresh
|
||||
|
||||
EBasicClobNoVer updateBean = new EBasicClobNoVer();
|
||||
updateBean.setId(entity.getId());
|
||||
updateBean.setDescription("modified");
|
||||
Ebean.update(updateBean);
|
||||
DB.update(updateBean);
|
||||
|
||||
|
||||
// Test refresh function
|
||||
|
||||
Assert.assertEquals("initialClobValue", entity.getDescription());
|
||||
assertThat(entity.getDescription()).isEqualTo("initialClobValue");
|
||||
|
||||
LoggedSqlCollector.start();
|
||||
|
||||
// Refresh query includes all properties
|
||||
server.refresh(entity);
|
||||
DB.refresh(entity);
|
||||
|
||||
// Assert all properties fetched in refresh
|
||||
List<String> loggedSql = LoggedSqlCollector.stop();
|
||||
Assert.assertEquals(1, loggedSql.size());
|
||||
assertThat(loggedSql).hasSize(1);
|
||||
assertThat(trimSql(loggedSql.get(0), 2)).contains(sqlWithClob);
|
||||
Assert.assertEquals("modified", entity.getDescription());
|
||||
|
||||
assertThat(entity.getDescription()).isEqualTo("modified");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user