From d113ddc525464bfd7f17f17ca9a671183c226992 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 8 Oct 2020 23:34:56 +1300 Subject: [PATCH] #2067 - Extract ebean-autotune into separate module --- ebean-autotune/pom.xml | 55 ++++++ .../server/autotune/model/Autotune.java | 0 .../server/autotune/model/ObjectFactory.java | 0 .../server/autotune/model/Origin.java | 0 .../server/autotune/model/ProfileDiff.java | 0 .../server/autotune/model/ProfileEmpty.java | 0 .../server/autotune/model/ProfileNew.java | 0 .../server/autotune/model/package-info.java | 0 .../service/AutoTuneAllCollection.java | 0 .../autotune/service}/AutoTuneCollection.java | 2 +- .../service/AutoTuneDiffCollection.java | 1 - .../service/AutoTuneServiceFactory.java | 6 +- .../autotune/service/AutoTuneXmlReader.java | 0 .../autotune/service/AutoTuneXmlWriter.java | 0 .../autotune/service/BaseQueryTuner.java | 0 .../service/DefaultAutoTuneService.java | 1 - .../autotune/service/ProfileManager.java | 1 - .../autotune/service/ProfileOrigin.java | 1 - .../service/ProfileOriginNodeUsage.java | 0 .../autotune/service/ProfileOriginQuery.java | 2 - .../service/SortAutoTuneDocument.java | 0 .../autotune/service/TunedQueryInfo.java | 0 ...al.server.autotune.AutoTuneServiceProvider | 1 + .../src/main/resources/ebean-autotune-1.0.xsd | 0 .../service/AutoTuneXmlReaderTest.java | 4 +- .../autotune/service/ProfileOriginTest.java | 45 +++-- .../org/tests/autofetch/BaseTestCase.java | 16 ++ .../MainAutoFetchExcludeLazyLobs.java | 32 ++++ .../tests/autofetch/MainAutoQueryTune1.java | 28 +++ .../tests/autofetch/TunedQueryInfoTest.java | 172 +++++++++++++++++ .../TunedQueryWithNullFetchedBeanTest.java | 69 +++++++ .../java/org/tests/model/basic/Address.java | 38 ++++ .../java/org/tests/model/basic/BaseModel.java | 58 ++++++ .../java/org/tests/model/basic/Customer.java | 41 +++++ .../java/org/tests/model/basic/Order.java | 60 ++++++ .../resources/application-test.properties | 9 + .../test/resources/autotune/test-autotune.xml | 0 .../src/test/resources/logback-test.xml | 21 +++ .../autotune/AutoTuneServiceProvider.java | 9 + .../server/autotune/NoAutoTuneService.java | 34 ++++ .../server/core/InternalConfiguration.java | 6 +- .../autofetch/AutofetchEmbeddedTest.java | 67 ------- .../MainAutoFetchExcludeLazyLobs.java | 32 ---- .../tests/autofetch/MainAutoQueryTune1.java | 34 ---- .../tests/autofetch/TunedQueryInfoTest.java | 174 ------------------ .../TunedQueryWithNullFetchedBeanTest.java | 69 ------- .../cache/TestL2CacheWithSharedBean.java | 19 +- pom.xml | 17 +- 48 files changed, 700 insertions(+), 424 deletions(-) create mode 100644 ebean-autotune/pom.xml rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneAllCollection.java (100%) rename {ebean-core/src/main/java/io/ebeaninternal/server/autotune => ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service}/AutoTuneCollection.java (98%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java (98%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java (52%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java (99%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java (98%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java (98%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java (94%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/SortAutoTuneDocument.java (100%) rename {ebean-core => ebean-autotune}/src/main/java/io/ebeaninternal/server/autotune/service/TunedQueryInfo.java (100%) create mode 100644 ebean-autotune/src/main/resources/META-INF/services/io.ebeaninternal.server.autotune.AutoTuneServiceProvider rename {ebean-core => ebean-autotune}/src/main/resources/ebean-autotune-1.0.xsd (100%) rename {ebean-core => ebean-autotune}/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java (87%) rename {ebean-core => ebean-autotune}/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java (79%) create mode 100644 ebean-autotune/src/test/java/org/tests/autofetch/BaseTestCase.java create mode 100644 ebean-autotune/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java create mode 100644 ebean-autotune/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java create mode 100644 ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java create mode 100644 ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java create mode 100644 ebean-autotune/src/test/java/org/tests/model/basic/Address.java create mode 100644 ebean-autotune/src/test/java/org/tests/model/basic/BaseModel.java create mode 100644 ebean-autotune/src/test/java/org/tests/model/basic/Customer.java create mode 100644 ebean-autotune/src/test/java/org/tests/model/basic/Order.java create mode 100644 ebean-autotune/src/test/resources/application-test.properties rename {ebean-core => ebean-autotune}/src/test/resources/autotune/test-autotune.xml (100%) create mode 100644 ebean-autotune/src/test/resources/logback-test.xml create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneServiceProvider.java create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java delete mode 100644 ebean-core/src/test/java/org/tests/autofetch/AutofetchEmbeddedTest.java delete mode 100644 ebean-core/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java delete mode 100644 ebean-core/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java delete mode 100644 ebean-core/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java delete mode 100644 ebean-core/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml new file mode 100644 index 000000000..93619bfc0 --- /dev/null +++ b/ebean-autotune/pom.xml @@ -0,0 +1,55 @@ + + + + ebean-parent + io.ebean + 12.4.3-SNAPSHOT + + 4.0.0 + + ebean-autotune + + + + + io.ebean + ebean + 12.4.3-SNAPSHOT + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + provided + + + + org.avaje.composite + junit + 1.1 + test + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.17 + true + + + + io.ebean.tile:enhancement:12.4.2 + + + + + + diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Autotune.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ObjectFactory.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/Origin.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileDiff.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileEmpty.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/ProfileNew.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/model/package-info.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneAllCollection.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneAllCollection.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneAllCollection.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneAllCollection.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneCollection.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneCollection.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneCollection.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneCollection.java index c86d3ce0a..7c2a0dcf8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneCollection.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneCollection.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.server.autotune; +package io.ebeaninternal.server.autotune.service; import io.ebean.bean.ObjectGraphOrigin; import io.ebeaninternal.server.querydefn.OrmQueryDetail; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java index 2d3d3e04c..9eb5439f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneDiffCollection.java @@ -1,7 +1,6 @@ package io.ebeaninternal.server.autotune.service; import io.ebean.bean.ObjectGraphOrigin; -import io.ebeaninternal.server.autotune.AutoTuneCollection; import io.ebeaninternal.server.autotune.model.Autotune; import io.ebeaninternal.server.autotune.model.Origin; import io.ebeaninternal.server.autotune.model.ProfileDiff; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java similarity index 52% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java index 44ac72887..e513bea82 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneServiceFactory.java @@ -3,10 +3,12 @@ package io.ebeaninternal.server.autotune.service; import io.ebean.config.DatabaseConfig; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.server.autotune.AutoTuneService; +import io.ebeaninternal.server.autotune.AutoTuneServiceProvider; -public class AutoTuneServiceFactory { +public class AutoTuneServiceFactory implements AutoTuneServiceProvider { - public static AutoTuneService create(SpiEbeanServer server, DatabaseConfig config) { + @Override + public AutoTuneService create(SpiEbeanServer server, DatabaseConfig config) { return new DefaultAutoTuneService(server, config); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReader.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlWriter.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/BaseQueryTuner.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java similarity index 99% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java index 76e59da77..f47b29ba8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/DefaultAutoTuneService.java @@ -4,7 +4,6 @@ import io.ebean.config.AutoTuneConfig; import io.ebean.config.DatabaseConfig; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.server.autotune.AutoTuneCollection; import io.ebeaninternal.server.autotune.AutoTuneService; import io.ebeaninternal.server.autotune.model.Autotune; import io.ebeaninternal.server.autotune.model.Origin; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java index d89da0073..1486ecc57 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileManager.java @@ -6,7 +6,6 @@ import io.ebean.bean.ObjectGraphOrigin; import io.ebean.config.AutoTuneConfig; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.server.autotune.AutoTuneCollection; import io.ebeaninternal.server.autotune.ProfilingListener; import io.ebeaninternal.server.deploy.BeanDescriptor; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java index 5f119d326..0ddf120d3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOrigin.java @@ -5,7 +5,6 @@ import io.ebean.bean.ObjectGraphNode; import io.ebean.bean.ObjectGraphOrigin; import io.ebean.text.PathProperties; import io.ebean.text.PathProperties.Props; -import io.ebeaninternal.server.autotune.AutoTuneCollection; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.querydefn.OrmQueryDetail; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginNodeUsage.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java similarity index 94% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java index a5f385b52..36efa3355 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java +++ b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/ProfileOriginQuery.java @@ -1,7 +1,5 @@ package io.ebeaninternal.server.autotune.service; -import io.ebeaninternal.server.autotune.AutoTuneCollection; - import java.io.Serializable; import java.util.concurrent.atomic.LongAdder; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/SortAutoTuneDocument.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/SortAutoTuneDocument.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/SortAutoTuneDocument.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/SortAutoTuneDocument.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/TunedQueryInfo.java b/ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/TunedQueryInfo.java similarity index 100% rename from ebean-core/src/main/java/io/ebeaninternal/server/autotune/service/TunedQueryInfo.java rename to ebean-autotune/src/main/java/io/ebeaninternal/server/autotune/service/TunedQueryInfo.java diff --git a/ebean-autotune/src/main/resources/META-INF/services/io.ebeaninternal.server.autotune.AutoTuneServiceProvider b/ebean-autotune/src/main/resources/META-INF/services/io.ebeaninternal.server.autotune.AutoTuneServiceProvider new file mode 100644 index 000000000..09056468e --- /dev/null +++ b/ebean-autotune/src/main/resources/META-INF/services/io.ebeaninternal.server.autotune.AutoTuneServiceProvider @@ -0,0 +1 @@ +io.ebeaninternal.server.autotune.service.AutoTuneServiceFactory diff --git a/ebean-core/src/main/resources/ebean-autotune-1.0.xsd b/ebean-autotune/src/main/resources/ebean-autotune-1.0.xsd similarity index 100% rename from ebean-core/src/main/resources/ebean-autotune-1.0.xsd rename to ebean-autotune/src/main/resources/ebean-autotune-1.0.xsd diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java b/ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java similarity index 87% rename from ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java rename to ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java index 7a7425b8b..845e68624 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java +++ b/ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/AutoTuneXmlReaderTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class AutoTuneXmlReaderTest { @Test - public void read_file() throws Exception { + public void read_file() { File testFile = new File("src/test/resources/autotune/test-autotune.xml"); @@ -20,7 +20,7 @@ public class AutoTuneXmlReaderTest { } @Test - public void read_inputStream() throws Exception { + public void read_inputStream() { InputStream is = getClass().getResourceAsStream("/autotune/test-autotune.xml"); diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java b/ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java similarity index 79% rename from ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java rename to ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java index 4c13b274c..a1286523d 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java +++ b/ebean-autotune/src/test/java/io/ebeaninternal/server/autotune/service/ProfileOriginTest.java @@ -1,6 +1,5 @@ package io.ebeaninternal.server.autotune.service; -import io.ebean.BaseTestCase; import io.ebean.DB; import io.ebean.bean.NodeUsageCollector; import io.ebean.bean.ObjectGraphNode; @@ -8,8 +7,9 @@ import io.ebean.bean.ObjectGraphOrigin; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.querydefn.OrmQueryDetail; import org.junit.Test; +import org.tests.autofetch.BaseTestCase; import org.tests.model.basic.Order; -import org.tests.model.basic.ResetBasicData; +//import org.tests.model.basic.ResetBasicData; import static org.assertj.core.api.Assertions.assertThat; @@ -102,25 +102,24 @@ public class ProfileOriginTest extends BaseTestCase { //fetch details (id,orderQty,shipQty,unitPrice) NodeUsageCollector c = node(null); - c.addUsed("details"); + c.addUsed("customer"); po.collectUsageInfo(c); - c = node("details"); + c = node("customer"); c.addUsed("id"); - c.addUsed("orderQty"); - c.addUsed("shipQty"); - c.addUsed("unitPrice"); - c.addUsed("product"); + c.addUsed("name"); + c.addUsed("note"); + c.addUsed("billingAddress"); po.collectUsageInfo(c); //fetch details.product (id,name) - c = node("details.product"); + c = node("customer.billingAddress"); c.addUsed("id"); - c.addUsed("name"); + c.addUsed("line1"); po.collectUsageInfo(c); OrmQueryDetail detail = po.buildDetail(desc); - assertThat(detail.asString()).isEqualTo("fetch details (orderQty,shipQty,unitPrice) fetch details.product (name)"); + assertThat(detail.asString()).isEqualTo("fetch customer (name,note) fetch customer.billingAddress (line1)"); } private NodeUsageCollector node(String path) { @@ -128,16 +127,16 @@ public class ProfileOriginTest extends BaseTestCase { return new NodeUsageCollector(node, null); } - @Test - public void testQueries() { - - ResetBasicData.reset(); - - //DB.createQuery(Order.class, "select (orderDate) fetch customer (billingAddress)").findList(); - - // we prefer this first query other the second one - DB.createQuery(Order.class, "select (orderDate,customer)").findList(); - DB.createQuery(Order.class, "select (orderDate) fetch customer (id)").findList(); - - } +// @Test +// public void testQueries() { +// +// ResetBasicData.reset(); +// +// //DB.createQuery(Order.class, "select (orderDate) fetch customer (billingAddress)").findList(); +// +// // we prefer this first query other the second one +// DB.createQuery(Order.class, "select (orderDate,customer)").findList(); +// DB.createQuery(Order.class, "select (orderDate) fetch customer (id)").findList(); +// +// } } diff --git a/ebean-autotune/src/test/java/org/tests/autofetch/BaseTestCase.java b/ebean-autotune/src/test/java/org/tests/autofetch/BaseTestCase.java new file mode 100644 index 000000000..e59dbbb4b --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/autofetch/BaseTestCase.java @@ -0,0 +1,16 @@ +package org.tests.autofetch; + +import io.ebean.DB; +import io.ebeaninternal.api.SpiEbeanServer; +import io.ebeaninternal.server.deploy.BeanDescriptor; + +public class BaseTestCase { + + protected SpiEbeanServer spiEbeanServer() { + return (SpiEbeanServer) DB.getDefault(); + } + + protected BeanDescriptor getBeanDescriptor(Class cls) { + return spiEbeanServer().getBeanDescriptor(cls); + } +} diff --git a/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java b/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java new file mode 100644 index 000000000..75debc144 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java @@ -0,0 +1,32 @@ +package org.tests.autofetch; + +//import io.ebean.Ebean; +//import org.tests.model.basic.EBasicClob; + +//import java.util.List; + +public class MainAutoFetchExcludeLazyLobs { + +// public static void main(String[] args) { +// +// EBasicClob a = new EBasicClob(); +// a.setName("name 1"); +// a.setTitle("a title"); +// a.setDescription("not that meaningful"); +// +// Ebean.save(a); +// +// List list = Ebean.find(EBasicClob.class) +// .setAutoTune(true) +// .findList(); +// +// for (EBasicClob bean : list) { +// bean.getName(); +// // although we read the description +// // autofetch will not include it later +// bean.getDescription(); +// } +// +// +// } +} diff --git a/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java b/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java new file mode 100644 index 000000000..45b390c18 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java @@ -0,0 +1,28 @@ +package org.tests.autofetch; + +public class MainAutoQueryTune1 { + +// public static void main(String[] args) { +// +// ResetBasicData.reset(); +// +// MainAutoQueryTune1 me = new MainAutoQueryTune1(); +// me.tuneJoin(); +// } +// +// private void tuneJoin() { +// List list = Ebean.find(Order.class) +// .setAutoTune(true) +// .fetch("customer") +// .where() +// .eq("status", Order.Status.NEW) +// .eq("customer.name", "Rob") +// .order().asc("id") +// .findList(); +// +// for (Order order : list) { +// order.getId(); +// order.getOrderDate(); +// } +// } +} diff --git a/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java b/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java new file mode 100644 index 000000000..f9c099d11 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java @@ -0,0 +1,172 @@ +package org.tests.autofetch; + +//import io.ebean.BaseTestCase; +//import io.ebean.Ebean; +//import io.ebean.EbeanServer; +//import io.ebean.Query; +//import io.ebean.bean.EntityBean; +//import io.ebean.bean.EntityBeanIntercept; +//import io.ebean.cache.ServerCacheManager; +//import io.ebeaninternal.api.SpiQuery; +//import io.ebeaninternal.server.autotune.model.Origin; +//import io.ebeaninternal.server.autotune.service.TunedQueryInfo; +//import io.ebeaninternal.server.querydefn.OrmQueryDetail; +//import org.ebeantest.LoggedSqlCollector; +//import org.junit.Assert; +//import org.junit.Test; +//import org.tests.model.basic.Order; +//import org.tests.model.basic.ResetBasicData; +// +//import java.util.List; +//import java.util.Set; + +public class TunedQueryInfoTest extends BaseTestCase { + +// private void init() { +// +// ResetBasicData.reset(); +// +// ServerCacheManager serverCacheManager = Ebean.getServer(null).getServerCacheManager(); +// serverCacheManager.clearAll(); +// } +// +// @Test +// public void withSelectEmpty() { +// +// init(); +// +// OrmQueryDetail tunedDetail = new OrmQueryDetail(); +// tunedDetail.select(""); +// +// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); +// +// Query query = server.find(Order.class).setId(1); +// +// tunedInfo.tuneQuery((SpiQuery) query); +// +// Order order = query.findOne(); +// EntityBean eb = (EntityBean) order; +// EntityBeanIntercept ebi = eb._ebean_getIntercept(); +// +// Assert.assertTrue(ebi.isFullyLoadedBean()); +// +// Set loadedPropertyNames = ebi.getLoadedPropertyNames(); +// Assert.assertNull(loadedPropertyNames); +// +// // invoke lazy loading +// order.getCustomer(); +// } +// +// @Test +// public void withSelectSomethingThatDoesNotExist() { +// +// init(); +// +// OrmQueryDetail tunedDetail = new OrmQueryDetail(); +// tunedDetail.select("somethingThatDoesNotExist"); +// +// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); +// +// Query query = server.find(Order.class).setId(1); +// +// tunedInfo.tuneQuery((SpiQuery) query); +// +// LoggedSqlCollector.start(); +// +// Order order = query.findOne(); +// EntityBean eb = (EntityBean) order; +// EntityBeanIntercept ebi = eb._ebean_getIntercept(); +// +// Assert.assertFalse(ebi.isFullyLoadedBean()); +// +// // id and any ToMany relationships +// Set loadedPropertyNames = ebi.getLoadedPropertyNames(); +// Assert.assertNotNull(loadedPropertyNames); +// +// // invoke lazy loading +// order.getCustomer(); +// +// List loggedSql = LoggedSqlCollector.stop(); +// Assert.assertEquals(2, loggedSql.size()); +// +// Assert.assertTrue(trimSql(loggedSql.get(0), 1).contains("select t0.id, t0.id from o_order t0 where t0.id = ?")); +// Assert.assertTrue(trimSql(loggedSql.get(1), 1).contains("select t0.id, t0.status,")); +// } +// +// private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) { +// Origin origin = new Origin(); +// origin.setDetail(tunedDetail.asString()); +// return new TunedQueryInfo(origin); +// } +// +// @Test +// public void withSelectSomeIncludeLazyLoaded() { +// +// init(); +// +// OrmQueryDetail tunedDetail = new OrmQueryDetail(); +// tunedDetail.select("status, customer"); +// +// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); +// +// Query query = server.find(Order.class).setId(1); +// +// tunedInfo.tuneQuery((SpiQuery) query); +// +// LoggedSqlCollector.start(); +// +// Order order = query.findOne(); +// EntityBean eb = (EntityBean) order; +// EntityBeanIntercept ebi = eb._ebean_getIntercept(); +// +// Assert.assertFalse(ebi.isFullyLoadedBean()); +// +// Set loadedPropertyNames = ebi.getLoadedPropertyNames(); +// Assert.assertNotNull(loadedPropertyNames); +// +// Assert.assertTrue(loadedPropertyNames.contains("status")); +// Assert.assertTrue(loadedPropertyNames.contains("customer")); +// +// // no lazy loading expected here +// order.getCustomer(); +// +// List loggedSql = LoggedSqlCollector.stop(); +// Assert.assertEquals(1, loggedSql.size()); +// } +// +// @Test +// public void withSelectSome() { +// +// init(); +// +// OrmQueryDetail tunedDetail = new OrmQueryDetail(); +// tunedDetail.select("status"); +// +// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); +// +// Query query = server.find(Order.class).setId(1); +// +// tunedInfo.tuneQuery((SpiQuery) query); +// +// LoggedSqlCollector.start(); +// +// Order order = query.findOne(); +// EntityBean eb = (EntityBean) order; +// EntityBeanIntercept ebi = eb._ebean_getIntercept(); +// +// Assert.assertFalse(ebi.isFullyLoadedBean()); +// +// Set loadedPropertyNames = ebi.getLoadedPropertyNames(); +// Assert.assertNotNull(loadedPropertyNames); +// +// Assert.assertTrue(loadedPropertyNames.contains("status")); +// Assert.assertFalse(loadedPropertyNames.contains("customer")); +// +// // no lazy loading expected here +// order.getCustomer(); +// +// List loggedSql = LoggedSqlCollector.stop(); +// Assert.assertEquals(2, loggedSql.size()); +// } + +} diff --git a/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java b/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java new file mode 100644 index 000000000..3ff5e61e0 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java @@ -0,0 +1,69 @@ +package org.tests.autofetch; + +//import io.ebean.BaseTestCase; +//import io.ebean.Ebean; +//import io.ebean.EbeanServer; +//import io.ebean.Query; +//import io.ebean.bean.EntityBean; +//import io.ebean.bean.EntityBeanIntercept; +//import org.ebeantest.LoggedSqlCollector; +//import org.junit.Assert; +//import org.junit.Test; +//import org.tests.model.basic.Address; +//import org.tests.model.basic.Customer; +//import org.tests.model.basic.ResetBasicData; + +import java.util.List; +import java.util.Set; + +public class TunedQueryWithNullFetchedBeanTest extends BaseTestCase { + +// EbeanServer server = Ebean.getServer(null); +// +// @Test +// public void withFetchOfNullBeanJoin() { +// +// ResetBasicData.reset(); +// +// Customer newCustomer = new Customer(); +// newCustomer.setName("TestFetchBillingAddress"); +// server.save(newCustomer); +// +// Query query = server.find(Customer.class) +// .setId(newCustomer.getId()) +// .fetch("billingAddress", "id"); +// +// LoggedSqlCollector.start(); +// +// Customer customer = query.findOne(); +// EntityBean eb = (EntityBean) customer; +// EntityBeanIntercept ebi = eb._ebean_getIntercept(); +// +// Assert.assertTrue(ebi.isFullyLoadedBean()); +// +// // find the internal property index for "billingAddress" +// String[] propNames = eb._ebean_getPropertyNames(); +// int pos = 0; +// for (int i = 0; i < propNames.length; i++) { +// if (propNames[i].equals("billingAddress")) { +// pos = i; +// } +// } +// +// // The billing address is loaded (but value null) +// Assert.assertTrue(ebi.isLoadedProperty(pos)); +// +// Set loadedPropertyNames = ebi.getLoadedPropertyNames(); +// Assert.assertNull(loadedPropertyNames); +// +// // no lazy loading expected here, value is null +// Address billingAddress = customer.getBillingAddress(); +// Assert.assertNull(billingAddress); +// +// // assert only one query executed +// List loggedSql = LoggedSqlCollector.stop(); +// Assert.assertEquals(1, loggedSql.size()); +// +// Ebean.delete(newCustomer); +// } +} diff --git a/ebean-autotune/src/test/java/org/tests/model/basic/Address.java b/ebean-autotune/src/test/java/org/tests/model/basic/Address.java new file mode 100644 index 000000000..dd75e4a00 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/model/basic/Address.java @@ -0,0 +1,38 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "address") +public class Address extends BaseModel { + + String line1; + String line2; + String city; + + public String getLine1() { + return line1; + } + + public void setLine1(String line1) { + this.line1 = line1; + } + + public String getLine2() { + return line2; + } + + public void setLine2(String line2) { + this.line2 = line2; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } +} diff --git a/ebean-autotune/src/test/java/org/tests/model/basic/BaseModel.java b/ebean-autotune/src/test/java/org/tests/model/basic/BaseModel.java new file mode 100644 index 000000000..73eeb7b24 --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/model/basic/BaseModel.java @@ -0,0 +1,58 @@ +package org.tests.model.basic; + +import io.ebean.Model; +import io.ebean.annotation.WhenCreated; +import io.ebean.annotation.WhenModified; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Version; +import java.time.Instant; + +@MappedSuperclass +public class BaseModel extends Model { + + @Id + long id; + + @WhenCreated + Instant whenCreated; + + @WhenModified + Instant whenModified; + + @Version + long version; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Instant getWhenCreated() { + return whenCreated; + } + + public void setWhenCreated(Instant whenCreated) { + this.whenCreated = whenCreated; + } + + public Instant getWhenModified() { + return whenModified; + } + + public void setWhenModified(Instant whenModified) { + this.whenModified = whenModified; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/ebean-autotune/src/test/java/org/tests/model/basic/Customer.java b/ebean-autotune/src/test/java/org/tests/model/basic/Customer.java new file mode 100644 index 000000000..ab0ee37be --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/model/basic/Customer.java @@ -0,0 +1,41 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "o_customer") +public class Customer extends BaseModel { + + String name; + + String note; + + @ManyToOne + Address billingAddress; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNote() { + return note; + } + + public void setNote(String note) { + this.note = note; + } + + public Address getBillingAddress() { + return billingAddress; + } + + public void setBillingAddress(Address billingAddress) { + this.billingAddress = billingAddress; + } +} diff --git a/ebean-autotune/src/test/java/org/tests/model/basic/Order.java b/ebean-autotune/src/test/java/org/tests/model/basic/Order.java new file mode 100644 index 000000000..dabc636fd --- /dev/null +++ b/ebean-autotune/src/test/java/org/tests/model/basic/Order.java @@ -0,0 +1,60 @@ +package org.tests.model.basic; + +import io.ebean.Model; +import io.ebean.annotation.WhenModified; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Version; +import java.sql.Timestamp; +import java.time.LocalDate; + +@Entity +@Table(name = "orders") +public class Order extends BaseModel { + + public enum Status { + NEW, + APPROVED, + SHIPPED, + COMPLETE + } + + + @Enumerated(EnumType.STRING) + Status status = Status.NEW; + + LocalDate orderDate; + + @ManyToOne(cascade = CascadeType.PERSIST) + Customer customer; + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public LocalDate getOrderDate() { + return orderDate; + } + + public void setOrderDate(LocalDate orderDate) { + this.orderDate = orderDate; + } + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } +} diff --git a/ebean-autotune/src/test/resources/application-test.properties b/ebean-autotune/src/test/resources/application-test.properties new file mode 100644 index 000000000..2352fc52b --- /dev/null +++ b/ebean-autotune/src/test/resources/application-test.properties @@ -0,0 +1,9 @@ +ebean.ddl.generate=true +ebean.ddl.run=true +#datasource.default=h2 + +datasource.db.username=sa +datasource.db.password= +datasource.db.url=jdbc:h2:mem:tests + + diff --git a/ebean-core/src/test/resources/autotune/test-autotune.xml b/ebean-autotune/src/test/resources/autotune/test-autotune.xml similarity index 100% rename from ebean-core/src/test/resources/autotune/test-autotune.xml rename to ebean-autotune/src/test/resources/autotune/test-autotune.xml diff --git a/ebean-autotune/src/test/resources/logback-test.xml b/ebean-autotune/src/test/resources/logback-test.xml new file mode 100644 index 000000000..8d97efd24 --- /dev/null +++ b/ebean-autotune/src/test/resources/logback-test.xml @@ -0,0 +1,21 @@ + + + + TRACE + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneServiceProvider.java b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneServiceProvider.java new file mode 100644 index 000000000..c63900b03 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/AutoTuneServiceProvider.java @@ -0,0 +1,9 @@ +package io.ebeaninternal.server.autotune; + +import io.ebean.config.DatabaseConfig; +import io.ebeaninternal.api.SpiEbeanServer; + +public interface AutoTuneServiceProvider { + + AutoTuneService create(SpiEbeanServer server, DatabaseConfig config); +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java new file mode 100644 index 000000000..b826329bc --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/autotune/NoAutoTuneService.java @@ -0,0 +1,34 @@ +package io.ebeaninternal.server.autotune; + +import io.ebeaninternal.api.SpiQuery; + +/** + * Noop service when AutoTuneService is not available. + */ +public class NoAutoTuneService implements AutoTuneService { + + @Override + public void startup() { + // do nothing + } + + @Override + public boolean tuneQuery(SpiQuery query) { + return false; + } + + @Override + public void collectProfiling() { + // do nothing + } + + @Override + public void reportProfiling() { + // do nothing + } + + @Override + public void shutdown() { + // do nothing + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index 47dfe4ec9..bca7a97a6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -33,7 +33,8 @@ import io.ebeaninternal.api.SpiLoggerFactory; import io.ebeaninternal.api.SpiProfileHandler; import io.ebeaninternal.dbmigration.DbOffline; import io.ebeaninternal.server.autotune.AutoTuneService; -import io.ebeaninternal.server.autotune.service.AutoTuneServiceFactory; +import io.ebeaninternal.server.autotune.AutoTuneServiceProvider; +import io.ebeaninternal.server.autotune.NoAutoTuneService; import io.ebeaninternal.server.cache.CacheManagerOptions; import io.ebeaninternal.server.cache.DefaultCacheAdapter; import io.ebeaninternal.server.cache.DefaultServerCacheManager; @@ -342,7 +343,8 @@ public class InternalConfiguration { } AutoTuneService createAutoTuneService(SpiEbeanServer server) { - return AutoTuneServiceFactory.create(server, config); + final AutoTuneServiceProvider provider = config.service(AutoTuneServiceProvider.class); + return provider == null ? new NoAutoTuneService() : provider.create(server, config); } DtoQueryEngine createDtoQueryEngine() { diff --git a/ebean-core/src/test/java/org/tests/autofetch/AutofetchEmbeddedTest.java b/ebean-core/src/test/java/org/tests/autofetch/AutofetchEmbeddedTest.java deleted file mode 100644 index 5ca3e5fd9..000000000 --- a/ebean-core/src/test/java/org/tests/autofetch/AutofetchEmbeddedTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.tests.autofetch; - -import io.ebean.BaseTestCase; -import io.ebean.Ebean; -import org.tests.model.embedded.EMain; -import org.tests.model.embedded.Eembeddable; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class AutofetchEmbeddedTest extends BaseTestCase { - - private final Logger logger = LoggerFactory.getLogger(AutofetchEmbeddedTest.class); - - @Test - public void testEmbeddedBeanLazyLoadAndUpdate() { - - EMain testBean = new EMain(); - testBean.setName("test"); - testBean.getEmbeddable().setDescription("test description"); - Ebean.save(testBean); - - EMain partialBean = Ebean.find(EMain.class).select("version").setId(testBean.getId()).findOne(); - - logger.info(" -- invoke lazy loading of embedded bean"); - Eembeddable embeddable = partialBean.getEmbeddable(); - embeddable.setDescription("modified description"); - - logger.info(" -- update bean"); - Ebean.save(partialBean); - - } - - @Test - public void testEmbeddedBeanQueryTuning() { -// Ebean.getServer(null).getAutoTune().setProfiling(true); -// Ebean.getServer(null).getAutoTune().setQueryTuning(true); -// Ebean.getServer(null).getAutoTune().setProfilingBase(1); -// -// EMain testBean = new EMain(); -// testBean.setName("test"); -// testBean.getEmbeddable().setDescription("test description"); -// Ebean.save(testBean); -// -// //This should not throw an exception -// for (int i = 0; i < 5; i++) { -// Ebean.beginTransaction(); -// try { -// List result = Ebean.find(EMain.class).setAutoTune(true).findList(); -// for (EMain e : result) { -// e.getEmbeddable().setDescription("Test" + i); -// Ebean.save(e); -// } -// Ebean.commitTransaction(); -// } finally { -// Ebean.endTransaction(); -// logger.debug(Ebean.getServer(null).getAutoTune().collectProfiling()); -// } -// } - } - - @Test - public void testEmbeddedFetch() { - Ebean.find(EMain.class).fetch("embeddable").findList(); - } -} diff --git a/ebean-core/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java b/ebean-core/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java deleted file mode 100644 index 0b0bc790f..000000000 --- a/ebean-core/src/test/java/org/tests/autofetch/MainAutoFetchExcludeLazyLobs.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tests.autofetch; - -import io.ebean.Ebean; -import org.tests.model.basic.EBasicClob; - -import java.util.List; - -public class MainAutoFetchExcludeLazyLobs { - - public static void main(String[] args) { - - EBasicClob a = new EBasicClob(); - a.setName("name 1"); - a.setTitle("a title"); - a.setDescription("not that meaningful"); - - Ebean.save(a); - - List list = Ebean.find(EBasicClob.class) - .setAutoTune(true) - .findList(); - - for (EBasicClob bean : list) { - bean.getName(); - // although we read the description - // autofetch will not include it later - bean.getDescription(); - } - - - } -} diff --git a/ebean-core/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java b/ebean-core/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java deleted file mode 100644 index f7dfdcb55..000000000 --- a/ebean-core/src/test/java/org/tests/autofetch/MainAutoQueryTune1.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.tests.autofetch; - -import io.ebean.Ebean; -import org.tests.model.basic.Order; -import org.tests.model.basic.ResetBasicData; - -import java.util.List; - -public class MainAutoQueryTune1 { - - public static void main(String[] args) { - - ResetBasicData.reset(); - - MainAutoQueryTune1 me = new MainAutoQueryTune1(); - me.tuneJoin(); - } - - private void tuneJoin() { - List list = Ebean.find(Order.class) - .setAutoTune(true) - .fetch("customer") - .where() - .eq("status", Order.Status.NEW) - .eq("customer.name", "Rob") - .order().asc("id") - .findList(); - - for (Order order : list) { - order.getId(); - order.getOrderDate(); - } - } -} diff --git a/ebean-core/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java b/ebean-core/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java deleted file mode 100644 index 81334e523..000000000 --- a/ebean-core/src/test/java/org/tests/autofetch/TunedQueryInfoTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.tests.autofetch; - -import io.ebean.BaseTestCase; -import io.ebean.Ebean; -import io.ebean.EbeanServer; -import io.ebean.Query; -import io.ebean.bean.EntityBean; -import io.ebean.bean.EntityBeanIntercept; -import io.ebean.cache.ServerCacheManager; -import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.server.autotune.model.Origin; -import io.ebeaninternal.server.autotune.service.TunedQueryInfo; -import io.ebeaninternal.server.querydefn.OrmQueryDetail; -import org.tests.model.basic.Order; -import org.tests.model.basic.ResetBasicData; -import org.ebeantest.LoggedSqlCollector; -import org.junit.Assert; -import org.junit.Test; - -import java.util.List; -import java.util.Set; - -public class TunedQueryInfoTest extends BaseTestCase { - - EbeanServer server = Ebean.getServer(null); - - private void init() { - - ResetBasicData.reset(); - - ServerCacheManager serverCacheManager = Ebean.getServer(null).getServerCacheManager(); - serverCacheManager.clearAll(); - } - - @Test - public void withSelectEmpty() { - - init(); - - OrmQueryDetail tunedDetail = new OrmQueryDetail(); - tunedDetail.select(""); - - TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); - - Query query = server.find(Order.class).setId(1); - - tunedInfo.tuneQuery((SpiQuery) query); - - Order order = query.findOne(); - EntityBean eb = (EntityBean) order; - EntityBeanIntercept ebi = eb._ebean_getIntercept(); - - Assert.assertTrue(ebi.isFullyLoadedBean()); - - Set loadedPropertyNames = ebi.getLoadedPropertyNames(); - Assert.assertNull(loadedPropertyNames); - - // invoke lazy loading - order.getCustomer(); - } - - @Test - public void withSelectSomethingThatDoesNotExist() { - - init(); - - OrmQueryDetail tunedDetail = new OrmQueryDetail(); - tunedDetail.select("somethingThatDoesNotExist"); - - TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); - - Query query = server.find(Order.class).setId(1); - - tunedInfo.tuneQuery((SpiQuery) query); - - LoggedSqlCollector.start(); - - Order order = query.findOne(); - EntityBean eb = (EntityBean) order; - EntityBeanIntercept ebi = eb._ebean_getIntercept(); - - Assert.assertFalse(ebi.isFullyLoadedBean()); - - // id and any ToMany relationships - Set loadedPropertyNames = ebi.getLoadedPropertyNames(); - Assert.assertNotNull(loadedPropertyNames); - - // invoke lazy loading - order.getCustomer(); - - List loggedSql = LoggedSqlCollector.stop(); - Assert.assertEquals(2, loggedSql.size()); - - Assert.assertTrue(trimSql(loggedSql.get(0), 1).contains("select t0.id, t0.id from o_order t0 where t0.id = ?")); - Assert.assertTrue(trimSql(loggedSql.get(1), 1).contains("select t0.id, t0.status,")); - } - - private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) { - Origin origin = new Origin(); - origin.setDetail(tunedDetail.asString()); - return new TunedQueryInfo(origin); - } - - @Test - public void withSelectSomeIncludeLazyLoaded() { - - init(); - - OrmQueryDetail tunedDetail = new OrmQueryDetail(); - tunedDetail.select("status, customer"); - - TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); - - Query query = server.find(Order.class).setId(1); - - tunedInfo.tuneQuery((SpiQuery) query); - - LoggedSqlCollector.start(); - - Order order = query.findOne(); - EntityBean eb = (EntityBean) order; - EntityBeanIntercept ebi = eb._ebean_getIntercept(); - - Assert.assertFalse(ebi.isFullyLoadedBean()); - - Set loadedPropertyNames = ebi.getLoadedPropertyNames(); - Assert.assertNotNull(loadedPropertyNames); - - Assert.assertTrue(loadedPropertyNames.contains("status")); - Assert.assertTrue(loadedPropertyNames.contains("customer")); - - // no lazy loading expected here - order.getCustomer(); - - List loggedSql = LoggedSqlCollector.stop(); - Assert.assertEquals(1, loggedSql.size()); - } - - @Test - public void withSelectSome() { - - init(); - - OrmQueryDetail tunedDetail = new OrmQueryDetail(); - tunedDetail.select("status"); - - TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); - - Query query = server.find(Order.class).setId(1); - - tunedInfo.tuneQuery((SpiQuery) query); - - LoggedSqlCollector.start(); - - Order order = query.findOne(); - EntityBean eb = (EntityBean) order; - EntityBeanIntercept ebi = eb._ebean_getIntercept(); - - Assert.assertFalse(ebi.isFullyLoadedBean()); - - Set loadedPropertyNames = ebi.getLoadedPropertyNames(); - Assert.assertNotNull(loadedPropertyNames); - - Assert.assertTrue(loadedPropertyNames.contains("status")); - Assert.assertFalse(loadedPropertyNames.contains("customer")); - - // no lazy loading expected here - order.getCustomer(); - - List loggedSql = LoggedSqlCollector.stop(); - Assert.assertEquals(2, loggedSql.size()); - } - -} diff --git a/ebean-core/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java b/ebean-core/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java deleted file mode 100644 index af082e386..000000000 --- a/ebean-core/src/test/java/org/tests/autofetch/TunedQueryWithNullFetchedBeanTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.tests.autofetch; - -import io.ebean.BaseTestCase; -import io.ebean.Ebean; -import io.ebean.EbeanServer; -import io.ebean.Query; -import io.ebean.bean.EntityBean; -import io.ebean.bean.EntityBeanIntercept; -import org.ebeantest.LoggedSqlCollector; -import org.junit.Assert; -import org.junit.Test; -import org.tests.model.basic.Address; -import org.tests.model.basic.Customer; -import org.tests.model.basic.ResetBasicData; - -import java.util.List; -import java.util.Set; - -public class TunedQueryWithNullFetchedBeanTest extends BaseTestCase { - - EbeanServer server = Ebean.getServer(null); - - @Test - public void withFetchOfNullBeanJoin() { - - ResetBasicData.reset(); - - Customer newCustomer = new Customer(); - newCustomer.setName("TestFetchBillingAddress"); - server.save(newCustomer); - - Query query = server.find(Customer.class) - .setId(newCustomer.getId()) - .fetch("billingAddress", "id"); - - LoggedSqlCollector.start(); - - Customer customer = query.findOne(); - EntityBean eb = (EntityBean) customer; - EntityBeanIntercept ebi = eb._ebean_getIntercept(); - - Assert.assertTrue(ebi.isFullyLoadedBean()); - - // find the internal property index for "billingAddress" - String[] propNames = eb._ebean_getPropertyNames(); - int pos = 0; - for (int i = 0; i < propNames.length; i++) { - if (propNames[i].equals("billingAddress")) { - pos = i; - } - } - - // The billing address is loaded (but value null) - Assert.assertTrue(ebi.isLoadedProperty(pos)); - - Set loadedPropertyNames = ebi.getLoadedPropertyNames(); - Assert.assertNull(loadedPropertyNames); - - // no lazy loading expected here, value is null - Address billingAddress = customer.getBillingAddress(); - Assert.assertNull(billingAddress); - - // assert only one query executed - List loggedSql = LoggedSqlCollector.stop(); - Assert.assertEquals(1, loggedSql.size()); - - Ebean.delete(newCustomer); - } -} diff --git a/ebean-core/src/test/java/org/tests/cache/TestL2CacheWithSharedBean.java b/ebean-core/src/test/java/org/tests/cache/TestL2CacheWithSharedBean.java index 647fbf742..cbc736cc5 100644 --- a/ebean-core/src/test/java/org/tests/cache/TestL2CacheWithSharedBean.java +++ b/ebean-core/src/test/java/org/tests/cache/TestL2CacheWithSharedBean.java @@ -4,23 +4,20 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; import io.ebean.cache.ServerCache; -import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.server.autotune.model.Origin; -import io.ebeaninternal.server.autotune.service.TunedQueryInfo; import io.ebeaninternal.server.querydefn.OrmQueryDetail; -import org.tests.model.basic.FeatureDescription; import org.junit.Assert; import org.junit.Test; +import org.tests.model.basic.FeatureDescription; import static org.junit.Assert.assertEquals; public class TestL2CacheWithSharedBean extends BaseTestCase { - private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) { - Origin origin = new Origin(); - origin.setDetail(tunedDetail.toString()); - return new TunedQueryInfo(origin); - } +// private TunedQueryInfo createTunedQueryInfo(OrmQueryDetail tunedDetail) { +// Origin origin = new Origin(); +// origin.setDetail(tunedDetail.toString()); +// return new TunedQueryInfo(origin); +// } @Test public void test() { @@ -36,11 +33,11 @@ public class TestL2CacheWithSharedBean extends BaseTestCase { OrmQueryDetail tunedDetail = new OrmQueryDetail(); tunedDetail.select("name"); - TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); +// TunedQueryInfo tunedInfo = createTunedQueryInfo(tunedDetail); Query query = Ebean.find(FeatureDescription.class).setId(f1.getId()); - tunedInfo.tuneQuery((SpiQuery) query); +// tunedInfo.tuneQuery((SpiQuery) query); query.findOne(); // PUT into cache diff --git a/pom.xml b/pom.xml index deba6e955..27b584cb9 100644 --- a/pom.xml +++ b/pom.xml @@ -19,11 +19,26 @@ - + + + org.slf4j + slf4j-api + 1.7.25 + provided + + + + ch.qos.logback + logback-classic + 1.2.3 + test + + ebean-core + ebean-autotune