Compare commits

...
102 Commits
Author SHA1 Message Date
Rob Bygrave 462d30bbb7 Version 13.19.0 2023-06-07 17:56:19 +12:00
Rob BygraveandGitHub 5466b889a7 Merge pull request #3098 from ebean-orm/deprecated/BeanFinder-server
Refactor ebean-core internal API - getters -> accessors
2023-06-02 09:06:54 +12:00
Rob Bygrave d27d20dd1c Refactor ebean-core internal API - getters -> accessors 2023-06-02 09:03:29 +12:00
Rob BygraveandGitHub b6edc54cd9 Merge pull request #3097 from ebean-orm/deprecated/BeanFinder-server
Refactor ebean-core internal API - getters -> accessors and  tidy
2023-06-01 22:15:52 +12:00
Rob Bygrave 2929483b0d Refactor ebean-core internal API - getters -> accessors 2023-06-01 22:05:53 +12:00
Rob Bygrave 2ab7c3529a Tidy ebean-core internal API
- Remove unused BeanIdList
2023-06-01 21:27:55 +12:00
Rob BygraveandGitHub f409ea2431 Merge pull request #3096 from ebean-orm/deprecated/BeanFinder-server
Deprecate order() methods on Query, ExpressionList - migrate to orderBy()
2023-06-01 21:22:54 +12:00
Rob Bygrave e71be4e1b1 Deprecate order() methods on Query, ExpressionList - migrate to orderBy()
Unfortunately we have order() and orderBy() methods which do the
same thing. I have decided to deprecate the order() ones in
favour of the orderBy() methods so that ultimately we will end
up with less methods and I think orderBy() is the correct choice.

Apologies for the migration pain here.
2023-06-01 21:21:39 +12:00
Rob BygraveandGitHub 507aec20d9 Merge pull request #3095 from ebean-orm/deprecated/BeanFinder-server
No functional change, Expr internal reuse of factory() method
2023-06-01 20:57:55 +12:00
Rob Bygrave 6a2d0c233a No functional change, Expr internal reuse of factory() method 2023-06-01 20:56:13 +12:00
Rob BygraveandGitHub a1db8794bb Merge pull request #3094 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated Query Bean fetchAll() - migrate to fetch()
2023-06-01 20:48:50 +12:00
Rob Bygrave bac7cd1ee7 Remove deprecated Query Bean fetchAll() - migrate to fetch()
```java

  /**
   * Deprecated in favor of fetch().
   */
  @Deprecated
  public final R fetchAll() {
    return fetch();
  }

```
2023-06-01 20:48:13 +12:00
Rob BygraveandGitHub 7ec0c72522 Merge pull request #3093 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated Query setLoadBeanCache() - migrate to setBeanCacheM…
2023-06-01 20:45:34 +12:00
Rob Bygrave 430926c5a9 Remove deprecated Query setLoadBeanCache() - migrate to setBeanCacheMode()
Typically migrate to `.setBeanCacheMode(CacheMode.PUT)` or `.setBeanCacheMode(CacheMode.OFF)`

```java

  /**
   * Deprecated - migrate to use setBeanCacheMode(CacheMode.PUT) or other CacheMode.
   * <p>
   * When set to true all the beans from this query are loaded into the bean cache.
   */
  @Deprecated
  Query<T> setLoadBeanCache(boolean loadBeanCache);

```
2023-06-01 20:44:31 +12:00
Rob BygraveandGitHub a2389be4aa Merge pull request #3092 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated ExpressionList.setOrderBy() - migrate to orderBy()
2023-06-01 20:34:44 +12:00
Rob Bygrave f21caa0755 Remove deprecated ExpressionList.setOrderBy() - migrate to orderBy()
Migrate to `.orderBy(String orderBy)`

```java

  /**
   * Deprecated migrate to {@link #orderBy(String)}
   */
  @Deprecated
  Query<T> setOrderBy(String orderBy);

```
2023-06-01 20:34:04 +12:00
Rob BygraveandGitHub e42d3dac18 Merge pull request #3091 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated DatabaseConfig.defaultOrderById
2023-06-01 20:11:51 +12:00
Rob Bygrave 4c47a84daf Remove deprecated DatabaseConfig.defaultOrderById
Should no longer be used / set to true.

```java

  /**
   * Deprecated - look to have explicit order by. Sets the default orderById setting for queries.
   */
  @Deprecated
  public void setDefaultOrderById(boolean defaultOrderById) {
    this.defaultOrderById = defaultOrderById;
  }

```
2023-06-01 20:09:14 +12:00
Rob BygraveandGitHub 42aaceaafa Merge pull request #3090 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated methods from ProfileLocation
2023-06-01 20:07:01 +12:00
Rob Bygrave e5f7a28d80 Remove deprecated methods from ProfileLocation
These methods are no longer used.
2023-06-01 20:00:50 +12:00
Rob BygraveandGitHub 074a3bacc7 Merge pull request #3089 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated BeanFinder.server, migrate to BeanFinder.database
2023-06-01 19:56:34 +12:00
Rob Bygrave f52a18989c Remove deprecated BeanFinder.server, migrate to BeanFinder.database 2023-06-01 19:54:39 +12:00
Rob Bygrave f415ee22b8 Update javadoc for ExtendedServer 2023-06-01 19:51:31 +12:00
Rob Bygrave 4878ca47b5 Remove deprecated ExtendedServer query methods - use query.usingTransaction() instead
Removing all the deprecated query methods from ExtendedServer. Migrate to passing
the explicit transaction to the query using query.usingTransaction() instead.
2023-06-01 19:45:17 +12:00
Rob BygraveandGitHub 59a3766a53 Merge pull request #3087 from ebean-orm/deprecated/collectMetricsAsJson
Remove deprecated MetaInfoManager.collectMetricsAsJson() - move to co…
2023-06-01 19:36:04 +12:00
Rob Bygrave 15de44eef8 Remove deprecated MetaInfoManager.collectMetricsAsJson() - move to collectMetrics().asJson()
Removing these deprecated methods:
- collectMetricsAsJson() -> collectMetrics().asJson();
- collectMetricsAsData() -> collectMetrics().asData()

```java
  /**
   * Deprecated migrate to collectMetrics().asJson().
   */
  @Deprecated
  default ServerMetricsAsJson collectMetricsAsJson() {
    return collectMetrics().asJson();
  }

  /**
   * Deprecated migrate to collectMetrics().asData().
   */
  @Deprecated
  default List<MetricData> collectMetricsAsData() {
    return collectMetrics().asData();
  }
```
2023-06-01 19:35:03 +12:00
Rob Bygrave 5ae9942dd5 Remove unused and empty ebean-kotlin module
It never got used, may as well clean up and remove it.
2023-06-01 19:26:17 +12:00
Rob BygraveandGitHub bf375f1065 Merge pull request #3086 from ebean-orm/feature/move-components
Remove unused and empty ebean-kotlin module
2023-06-01 19:22:45 +12:00
Rob Bygrave 510e129ff6 Remove unused and empty ebean-kotlin module
It never got used, may as well clean up and remove it.
2023-06-01 19:22:16 +12:00
Rob BygraveandGitHub 1c32b9b0bc Merge pull request #3085 from ebean-orm/feature/move-components
Moved - ebean-autotune, ebean-csv-reader, ebean-joda-time, ebean-jack…
2023-06-01 19:19:39 +12:00
Rob Bygrave f25a20ff90 Moved - ebean-autotune, ebean-csv-reader, ebean-joda-time, ebean-jackson-jsonnode, ebean-externalmapping-xml
These modules have all been moved to ebean-component git repo.
These are all optional modules and will be released at a
slower cadence.
2023-06-01 19:17:14 +12:00
Rob BygraveandGitHub 0ba6753c8c Merge pull request #3084 from ebean-orm/fix/jakarta-transaction
Fix javax-to-jakarta support for jakarta.transaction
2023-06-01 08:26:54 +12:00
Rob Bygrave 7efef027c0 Fix javax-to-jakarta support for jakarta.transaction 2023-06-01 08:24:14 +12:00
Rob Bygrave 3a84695130 Version 13.18.0 2023-05-31 22:06:30 +12:00
Rob BygraveandGitHub 3f6d6908e2 Merge pull request #3081 from ebean-orm/feature/bump-migration-2
Bump ebean-migration to 13.9.0 - changes API for checkState()
2023-05-31 20:53:24 +12:00
Rob Bygrave 9f4bf6103f Bump ebean-migration to 13.9.0 - changes API for checkState()
Code using ebean-migration checkState() methods needs to change
as those methods now return a new MigrationResource interface type
2023-05-31 20:51:28 +12:00
Rob BygraveandGitHub ad7bb7063d Merge pull request #3079 from ebean-orm/feature/bump-migration
Bump ebean-migration to 13.8.0 and ebean-ddl-runner to 2.3
2023-05-29 16:28:44 +12:00
Rob Bygrave 04b4fea559 Bump ebean-migration to 13.8.0 and ebean-ddl-runner to 2.3 2023-05-29 16:27:54 +12:00
Rob BygraveandGitHub eb824949fe Merge pull request #3078 from ebean-orm/feature/refactor-renameDtoMethodUsingAccessors
Refactor internal dto methods to use accessors
2023-05-26 15:24:40 +12:00
robin.bygrave 34db4d0c1f Refactor internal dto methods to use accessors 2023-05-26 15:09:11 +12:00
Rob BygraveandGitHub 54a3113dbc Merge pull request #3077 from ebean-orm/feature/3062-dtoQuery
Use Statement for truncate table and postgres version query
2023-05-26 15:03:52 +12:00
robin.bygrave 7635630808 Use Statement for truncate table and postgres version query 2023-05-26 15:03:13 +12:00
Rob BygraveandGitHub e4018864ac Merge pull request #3075 from ebean-orm/feature/3062-dtoQuery
#3062 - DtoQuery may match the wrong constructor
2023-05-25 21:58:52 +12:00
robin.bygrave 75e69a0a23 #3062 - DtoQuery may match the wrong constructor
When 2 or more Dto constructors clash by argument count
then we need to ignore those constructors.
2023-05-25 21:57:54 +12:00
Rob BygraveandGitHub 6061f80dcc Merge pull request #3074 from ebean-orm/feature/toString_roundBrackets
Change toString to use (trimmed) with round brackets
2023-05-25 21:15:31 +12:00
robin.bygrave c60525a685 Change toString to use (trimmed) with round brackets
Change from use <> angle brackets as with json logger these are escaped which is a little ugly
2023-05-25 21:14:51 +12:00
Rob BygraveandGitHub eef628531a Merge pull request #3073 from ebean-orm/feature/bump-yugabyte
Bump yugabyte version to 2.18.0.0
2023-05-25 21:04:07 +12:00
robin.bygrave 33d9257a61 Bump yugabyte version to 2.18.0.0 2023-05-25 20:56:10 +12:00
robin.bygrave 7b032351b1 Bump yugabyte version to 2.18.0.0 2023-05-25 20:48:50 +12:00
robin.bygrave 265f865a7d Postgres DDL - Use IF NOT EXISTS with ADD COLUMN
Update generated hashes
2023-05-25 20:30:47 +12:00
Rob BygraveandGitHub 73d30310fd Merge pull request #3072 from ebean-orm/feature/postgres-dll-addColumn-ifNotExists
Postgres DDL - Use IF NOT EXISTS with ADD COLUMN
2023-05-25 20:28:41 +12:00
Rob BygraveandGitHub e26fbbb11f Merge branch 'master' into feature/postgres-dll-addColumn-ifNotExists 2023-05-25 20:25:54 +12:00
Rob BygraveandGitHub a548c16789 Merge pull request #3071 from ebean-orm/feature/postres-ddl-varchar-changeSize
Postgres DDL - Don't use cast when just changing varchar column size
2023-05-25 20:23:04 +12:00
robin.bygrave ecf650c9bc Postgres DDL - Use IF NOT EXISTS with ADD COLUMN 2023-05-25 20:22:18 +12:00
robin.bygrave b27b4e7038 Postgres DDL - Don't use cast when just changing varchar column size 2023-05-25 20:00:36 +12:00
Rob BygraveandGitHub 58d190ef12 Merge pull request #3070 from ebean-orm/dependabot/maven/ebean-test/org.xerial-sqlite-jdbc-3.41.2.2
Bump sqlite-jdbc from 3.36.0.3 to 3.41.2.2 in /ebean-test
2023-05-24 09:28:05 +12:00
dependabot[bot]andGitHub bffc9108f9 Bump sqlite-jdbc from 3.36.0.3 to 3.41.2.2 in /ebean-test
Bumps [sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.36.0.3 to 3.41.2.2.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.36.0.3...3.41.2.2)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 20:15:29 +00:00
Rob BygraveandGitHub 114a715432 Merge pull request #3068 from FOCONIS/throw-exceptions
DB.refrence throws EntityNotFoundException instead returning null
2023-05-23 19:29:51 +12:00
Rob BygraveandGitHub 67d98954b2 Merge pull request #3069 from ebean-orm/feature/bump-avaje-config
Bump avaje-config to 3.4
2023-05-23 19:28:47 +12:00
Rob Bygrave 53e7aafb06 Bump avaje-config to 3.4 2023-05-23 19:26:29 +12:00
Roland Praml e207b4720b DB.refrence throws EntityNotFoundException instead returning null 2023-05-23 08:37:52 +02:00
Rob BygraveandGitHub af6da23411 Merge pull request #3067 from ebean-orm/feature/2064-jakarta-transaction
#3064 - JtaTransaction does not use jarkarta prefix for javax.transaction classes
2023-05-23 17:11:38 +12:00
robin.bygrave 21f274fd34 #3064 - JtaTransaction does not use jarkarta prefix for javax.transaction classes 2023-05-23 17:09:53 +12:00
Rob BygraveandGitHub 1b8df12a01 Merge pull request #3066 from ebean-orm/feature/3060-part2
From #3060 - Add missing @Nullable to ExpressionList.findSingleAttribute()
2023-05-23 17:00:14 +12:00
robin.bygrave b210d1a6a7 From #3060 - Add missing @Nullable to ExpressionList.findSingleAttribute() 2023-05-23 16:12:13 +12:00
Rob BygraveandGitHub d53ca87d43 Merge pull request #3057 from FOCONIS/property-value-intercept
Property.value use intercept to trigger lazy load
2023-05-23 13:36:09 +12:00
Rob BygraveandGitHub 635820cab5 Merge pull request #3058 from ebean-orm/feature/BeanProperty-value-to-getValue
No functional change, change use of BeanProperty.value() to BeanProperty.getValue()
2023-05-19 16:09:37 +12:00
Rob BygraveandGitHub aedb0fdcac Merge pull request #3063 from ebean-orm/feature/improve-error-message-no-join-columns
Use DeployBeanProperty toString() removing getFullBeanName()
2023-05-19 16:08:54 +12:00
robin.bygrave 4db1925328 No functional change, change use of BeanProperty.value() to BeanProperty.getValue()
Noting that value() currently calls through to getValue() hence
this is no real change. This is done because value() is also
a public method Property.value() [and this should probably
change to use getValueIntercept() rather than getValue()]
2023-05-17 15:31:52 +12:00
Roland Praml 6f2a444954 Property.value use intercept 2023-05-16 15:28:30 +02:00
Rob BygraveandGitHub 59b6621077 Merge pull request #3055 from ebean-orm/feature/queryPlanCaptureMicros
ENH: Add captureMicros and whenCaptured to MetaQueryPlan
2023-05-16 15:38:05 +12:00
Rob BygraveandGitHub 15a39f62e6 Merge pull request #3056 from ebean-orm/bump/yugabyte
Testing - Bump YugabyteDB version for testing to 2.17.3.0-b152
2023-05-16 15:37:29 +12:00
robin.bygrave 40489706ce Testing - Bump YugabyteDB version for testing to 2.17.3.0-b152 2023-05-16 14:39:46 +12:00
robin.bygrave 742f3b6dc4 ENH: Add captureMicros and whenCaptured to MetaQueryPlan
- captureMicros is the time taken to capture the specific query plan
- whenCaptured is the time when the bind values were taken

The DefaultQueryPlanListener logging will include these in the
output it logs
2023-05-16 13:47:27 +12:00
Rob BygraveandGitHub 753617a616 Merge pull request #3039 from FOCONIS/detailed-error-message
Throw excepction when trying to create unregistered bean
2023-05-10 16:37:18 +12:00
Rob BygraveandGitHub 114da00d98 Merge pull request #3040 from FOCONIS/correct-quotes
FIX: Use correct quotes when logging
2023-05-10 16:36:27 +12:00
Rob BygraveandGitHub 283ab7a1ac Merge pull request #3038 from FOCONIS/fix-javadoc-plugin
FIX build on system without JAVA_HOME set
2023-05-10 16:35:39 +12:00
Rob BygraveandGitHub 096988c19f Merge pull request #3052 from ebean-orm/feature/dep-config
Bump jackson dependency to 2.15.0
2023-05-10 16:34:06 +12:00
Rob Bygrave baf727e8ea Bump jackson dependency to 2.15.0 2023-05-10 16:33:38 +12:00
Rob BygraveandGitHub 2eb6558145 Merge pull request #3051 from ebean-orm/feature/dep-config
Bump avaje-config dependency to 3.2
2023-05-10 16:30:39 +12:00
Rob Bygrave d946504503 Bump avaje-config dependency to 3.2 2023-05-10 16:30:03 +12:00
Rob Bygrave ed94edd96b Bump to next snapshot version 2023-05-10 16:26:03 +12:00
Rob BygraveandGitHub 6441030161 Merge pull request #3030 from ebean-orm/feature/bump-avaje-config
Included ebean-migration as a dependency of ebean, ebean-postgres etc
2023-05-10 16:24:54 +12:00
Rob Bygrave 588527a5b9 Version 13.17.4 2023-05-10 00:34:53 +12:00
Rob Bygrave 06cad500c1 #3031 Improve error message 2023-05-10 00:34:27 +12:00
Rob Bygrave e29b57811b Update README add end 2023-05-10 00:30:07 +12:00
Rob Bygrave e6bf46e8c4 Improve error message for #3031 2023-05-09 23:37:05 +12:00
Rob BygraveandGitHub 646f8cc66b Merge pull request #3050 from ebean-orm/feature/LoadBeanRequest
Fix SqlTreeLoadBean to only register new beans into load context
2023-05-09 23:23:31 +12:00
Rob Bygrave 4c9f0f23f0 Fix SqlTreeLoadBean to only register new beans into load context
Additionally, refactor LoadBeanRequest moving the MarkedAsDeleted logging
2023-05-09 22:49:17 +12:00
Rob Bygrave ecfd831603 #3049 - Support for ebean.test.containers.mirror 2023-05-08 17:22:41 +12:00
Rob BygraveandGitHub b8324905ae Merge pull request #3036 from Ryszard-Trojnacki/postgis
Implemented missing cache functions for Postgis module.
2023-05-08 17:15:14 +12:00
Rob BygraveandGitHub 8cbcd1afad Merge pull request #3049 from ebean-orm/feature/ebean.test.containers.mirror
[ebean-test] Add support for ebean.test.containers.mirror
2023-05-08 17:12:22 +12:00
Rob Bygrave 7970ea39f3 Bump to next snapshot version 2023-05-08 17:11:24 +12:00
robin.bygrave a399d4f2cd [ebean-test] Add support for ebean.test.containers.mirror
Can use this property to specify a mirror to use for test images when running in CI

Currently, we assume that for local builds we actually prefer to not use the mirror (for Arm64 support etc)
2023-05-08 14:35:14 +12:00
Roland Praml 82a6ec6957 Fix also other places 2023-04-26 11:11:12 +02:00
Roland Praml cf1c08c4ac FIX: Use correct quotes when logging 2023-04-26 10:59:41 +02:00
Roland Praml d32df16137 Throw excepction when trying to create unregistered bean 2023-04-26 10:56:14 +02:00
Roland Praml 2bcbc6fa07 FIX also other plugin versions 2023-04-26 10:39:18 +02:00
Roland Praml ba9158ec9c Javadoc POM fixes 2023-04-26 10:22:27 +02:00
Ryszard Trojnacki 40a6693a4c Implemented missing cache functions for Postgis module. 2023-04-21 08:58:44 +02:00
Rob Bygrave 1ec389864d Included ebean-migration as a dependency of ebean, ebean-postgres etc
Include ebean-migration as a dependency of all the composites. The thinking here is that we now expect to prefer ebean-migration over flyway or liquibase as the migration runner of choice. Including it means one less thing for folks to worry about in terms of syncing the versions to use etc.
2023-04-18 00:12:44 +12:00
Rob Bygrave 2d03421de4 Use DeployBeanProperty toString() removing getFullBeanName() 2023-03-28 18:44:00 +13:00
391 changed files with 1803 additions and 9739 deletions
+1
View File
@@ -120,3 +120,4 @@ To set this option as the global default for IntelliJ use:
`Run - Edit Configurations -> Edit configuration templates -> JUnit -> modify options - Do not use module-path option`
end
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-clickhouse</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-clickhouse</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-cockroach</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-db2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-db2</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-h2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-hana</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hana</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-mariadb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mariadb</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-mysql</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-nuodb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-nuodb</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-oracle</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-oracle</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-postgres</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-sqlite</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlite</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-sqlserver</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean-yugabyte</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+14 -8
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean (all platforms)</name>
@@ -16,31 +16,31 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-joda-time</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-jsonnode</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-mapper</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -49,17 +49,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<artifactId>composites</artifactId>
+2 -2
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean api</name>
@@ -39,7 +39,7 @@
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-config</artifactId>
<version>3.1</version>
<version>3.4</version>
</dependency>
<dependency>
@@ -33,11 +33,6 @@ import java.util.Optional;
@NonNullApi
public abstract class BeanFinder<I,T> {
/**
* Migrate to using database rather than server.
*/
@Deprecated
protected final Database server;
protected final Database database;
protected final Class<T> type;
@@ -50,7 +45,6 @@ public abstract class BeanFinder<I,T> {
protected BeanFinder(Class<T> type, Database database) {
this.type = type;
this.database = database;
this.server = database;
}
/**
@@ -35,7 +35,7 @@ import java.util.concurrent.Callable;
* <h5>The 'default' Database</h5>
* <p>
* One Database can be designated as the 'default' or 'primary' Database
* (see {@link DatabaseConfig#setDefaultServer(boolean)}. Many methods on DB
* (see {@link DatabaseConfig#setDefaultServer(boolean)}). Many methods on DB
* such as {@link DB#find(Class)} etc are actually just a convenient way to
* call methods on the 'default/primary' Database.
*
@@ -166,7 +166,7 @@ public interface Database {
/**
* Return the BeanState for a given entity bean.
* <p>
* This will return null if the bean is not an enhanced entity bean.
* This will throw an IllegalArgumentException if the bean is not an enhanced entity bean.
*/
BeanState beanState(Object bean);
+39 -39
View File
@@ -41,14 +41,14 @@ public final class Expr {
* Equal To - property equal to the given value.
*/
public static Expression eq(String propertyName, Object value) {
return DB.expressionFactory().eq(propertyName, value);
return factory().eq(propertyName, value);
}
/**
* Not Equal To - property not equal to the given value.
*/
public static Expression ne(String propertyName, Object value) {
return DB.expressionFactory().ne(propertyName, value);
return factory().ne(propertyName, value);
}
/**
@@ -56,7 +56,7 @@ public final class Expr {
* using a lower() function to make it case insensitive).
*/
public static Expression ieq(String propertyName, String value) {
return DB.expressionFactory().ieq(propertyName, value);
return factory().ieq(propertyName, value);
}
/**
@@ -66,28 +66,28 @@ public final class Expr {
* </p>
*/
public static Expression inRange(String propertyName, Object value1, Object value2) {
return DB.expressionFactory().inRange(propertyName, value1, value2);
return factory().inRange(propertyName, value1, value2);
}
/**
* Between - property between the two given values.
*/
public static Expression between(String propertyName, Object value1, Object value2) {
return DB.expressionFactory().between(propertyName, value1, value2);
return factory().between(propertyName, value1, value2);
}
/**
* Between - value between two given properties.
*/
public static Expression between(String lowProperty, String highProperty, Object value) {
return DB.expressionFactory().betweenProperties(lowProperty, highProperty, value);
return factory().betweenProperties(lowProperty, highProperty, value);
}
/**
* Greater Than - property greater than the given value.
*/
public static Expression gt(String propertyName, Object value) {
return DB.expressionFactory().gt(propertyName, value);
return factory().gt(propertyName, value);
}
/**
@@ -95,42 +95,42 @@ public final class Expr {
* value.
*/
public static Expression ge(String propertyName, Object value) {
return DB.expressionFactory().ge(propertyName, value);
return factory().ge(propertyName, value);
}
/**
* Less Than - property less than the given value.
*/
public static Expression lt(String propertyName, Object value) {
return DB.expressionFactory().lt(propertyName, value);
return factory().lt(propertyName, value);
}
/**
* Less Than or Equal to - property less than or equal to the given value.
*/
public static Expression le(String propertyName, Object value) {
return DB.expressionFactory().le(propertyName, value);
return factory().le(propertyName, value);
}
/**
* Is Null - property is null.
*/
public static Expression isNull(String propertyName) {
return DB.expressionFactory().isNull(propertyName);
return factory().isNull(propertyName);
}
/**
* Is Not Null - property is not null.
*/
public static Expression isNotNull(String propertyName) {
return DB.expressionFactory().isNotNull(propertyName);
return factory().isNotNull(propertyName);
}
/**
* Case insensitive {@link #exampleLike(Object)}
*/
public static ExampleExpression iexampleLike(Object example) {
return DB.expressionFactory().iexampleLike(example);
return factory().iexampleLike(example);
}
/**
@@ -138,14 +138,14 @@ public final class Expr {
* LikeType.RAW (you need to add you own wildcards % and _).
*/
public static ExampleExpression exampleLike(Object example) {
return DB.expressionFactory().exampleLike(example);
return factory().exampleLike(example);
}
/**
* Create the query by Example expression specifying more options.
*/
public static ExampleExpression exampleLike(Object example, boolean caseInsensitive, LikeType likeType) {
return DB.expressionFactory().exampleLike(example, caseInsensitive, likeType);
return factory().exampleLike(example, caseInsensitive, likeType);
}
/**
@@ -153,7 +153,7 @@ public final class Expr {
* characters % (percentage) and _ (underscore).
*/
public static Expression like(String propertyName, String value) {
return DB.expressionFactory().like(propertyName, value);
return factory().like(propertyName, value);
}
/**
@@ -162,14 +162,14 @@ public final class Expr {
* a lower() function to make the expression case insensitive.
*/
public static Expression ilike(String propertyName, String value) {
return DB.expressionFactory().ilike(propertyName, value);
return factory().ilike(propertyName, value);
}
/**
* Starts With - property like value%.
*/
public static Expression startsWith(String propertyName, String value) {
return DB.expressionFactory().startsWith(propertyName, value);
return factory().startsWith(propertyName, value);
}
/**
@@ -177,14 +177,14 @@ public final class Expr {
* lower() function to make the expression case insensitive.
*/
public static Expression istartsWith(String propertyName, String value) {
return DB.expressionFactory().istartsWith(propertyName, value);
return factory().istartsWith(propertyName, value);
}
/**
* Ends With - property like %value.
*/
public static Expression endsWith(String propertyName, String value) {
return DB.expressionFactory().endsWith(propertyName, value);
return factory().endsWith(propertyName, value);
}
/**
@@ -192,14 +192,14 @@ public final class Expr {
* function to make the expression case insensitive.
*/
public static Expression iendsWith(String propertyName, String value) {
return DB.expressionFactory().iendsWith(propertyName, value);
return factory().iendsWith(propertyName, value);
}
/**
* Contains - property like %value%.
*/
public static Expression contains(String propertyName, String value) {
return DB.expressionFactory().contains(propertyName, value);
return factory().contains(propertyName, value);
}
/**
@@ -207,42 +207,42 @@ public final class Expr {
* function to make the expression case insensitive.
*/
public static Expression icontains(String propertyName, String value) {
return DB.expressionFactory().icontains(propertyName, value);
return factory().icontains(propertyName, value);
}
/**
* For collection properties that are empty (have not existing elements).
*/
public static Expression isEmpty(String propertyName) {
return DB.expressionFactory().isEmpty(propertyName);
return factory().isEmpty(propertyName);
}
/**
* For collection properties that are not empty (have existing elements).
*/
public static Expression isNotEmpty(String propertyName) {
return DB.expressionFactory().isNotEmpty(propertyName);
return factory().isNotEmpty(propertyName);
}
/**
* In - property has a value in the array of values.
*/
public static Expression in(String propertyName, Object[] values) {
return DB.expressionFactory().in(propertyName, values);
return factory().in(propertyName, values);
}
/**
* In - using a subQuery.
*/
public static Expression in(String propertyName, Query<?> subQuery) {
return DB.expressionFactory().in(propertyName, subQuery);
return factory().in(propertyName, subQuery);
}
/**
* In - property has a value in the collection of values.
*/
public static Expression in(String propertyName, Collection<?> values) {
return DB.expressionFactory().in(propertyName, values);
return factory().in(propertyName, values);
}
/**
@@ -279,14 +279,14 @@ public final class Expr {
* }</pre>
*/
public static Expression inOrEmpty(String propertyName, Collection<?> values) {
return DB.expressionFactory().inOrEmpty(propertyName, values);
return factory().inOrEmpty(propertyName, values);
}
/**
* Id Equal to - ID property is equal to the value.
*/
public static Expression idEq(Object value) {
return DB.expressionFactory().idEq(value);
return factory().idEq(value);
}
/**
@@ -299,7 +299,7 @@ public final class Expr {
* @param propertyMap a map keyed by property names.
*/
public static Expression allEq(Map<String, Object> propertyMap) {
return DB.expressionFactory().allEq(propertyMap);
return factory().allEq(propertyMap);
}
/**
@@ -310,7 +310,7 @@ public final class Expr {
* </p>
*/
public static Expression raw(String raw, Object value) {
return DB.expressionFactory().raw(raw, value);
return factory().raw(raw, value);
}
/**
@@ -321,48 +321,48 @@ public final class Expr {
* </p>
*/
public static Expression raw(String raw, Object[] values) {
return DB.expressionFactory().raw(raw, values);
return factory().raw(raw, values);
}
/**
* Add raw expression with no parameters.
*/
public static Expression raw(String raw) {
return DB.expressionFactory().raw(raw);
return factory().raw(raw);
}
/**
* And - join two expressions with a logical and.
*/
public static Expression and(Expression expOne, Expression expTwo) {
return DB.expressionFactory().and(expOne, expTwo);
return factory().and(expOne, expTwo);
}
/**
* Or - join two expressions with a logical or.
*/
public static Expression or(Expression expOne, Expression expTwo) {
return DB.expressionFactory().or(expOne, expTwo);
return factory().or(expOne, expTwo);
}
/**
* Negate the expression (prefix it with NOT).
*/
public static Expression not(Expression exp) {
return DB.expressionFactory().not(exp);
return factory().not(exp);
}
/**
* Return a list of expressions that will be joined by AND's.
*/
public static <T> Junction<T> conjunction(Query<T> query) {
return DB.expressionFactory().conjunction(query);
return factory().conjunction(query);
}
/**
* Return a list of expressions that will be joined by OR's.
*/
public static <T> Junction<T> disjunction(Query<T> query) {
return DB.expressionFactory().disjunction(query);
return factory().disjunction(query);
}
}
@@ -54,14 +54,12 @@ public interface ExpressionList<T> {
Query<T> orderById(boolean orderById);
/**
* Set the order by clause replacing the existing order by clause if there is
* one.
* <p>
* This follows SQL syntax using commas between each property with the
* optional asc and desc keywords representing ascending and descending order
* respectively.
* Deprecated migrate to {@link #orderBy(String)}
*/
ExpressionList<T> order(String orderByClause);
@Deprecated(since = "13.19")
default ExpressionList<T> order(String orderByClause) {
return orderBy(orderByClause);
}
/**
* Set the order by clause replacing the existing order by clause if there is
@@ -74,15 +72,12 @@ public interface ExpressionList<T> {
ExpressionList<T> orderBy(String orderBy);
/**
* Return the OrderBy so that you can append an ascending or descending
* property to the order by clause.
* <p>
* This will never return a null. If no order by clause exists then an 'empty'
* OrderBy object is returned.
* <p>
* This is the same as <code>orderBy()</code>
* Deprecated migrate to orderBy().
*/
OrderBy<T> order();
@Deprecated
default OrderBy<T> order() {
return orderBy();
}
/**
* Return the OrderBy so that you can append an ascending or descending
@@ -95,12 +90,6 @@ public interface ExpressionList<T> {
*/
OrderBy<T> orderBy();
/**
* Deprecated migrate to {@link #orderBy(String)}
*/
@Deprecated
Query<T> setOrderBy(String orderBy);
/**
* Apply the path properties to the query replacing the select and fetch clauses.
*/
@@ -404,6 +393,7 @@ public interface ExpressionList<T> {
*
* }</pre>
*/
@Nullable
default <A> A findSingleAttribute() {
List<A> list = findSingleAttributeList();
return !list.isEmpty() ? list.get(0) : null;
@@ -1,26 +1,9 @@
package io.ebean;
import io.avaje.lang.Nullable;
import java.time.Clock;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
/**
* The extended API for Database.
* <p>
* Deprecated in favour of using {@link Query#usingTransaction(Transaction)} instead.
* <p>
* This provides the finder methods that take an explicit transaction rather than obtaining
* the transaction from the usual mechanism (which is ThreadLocal based).
* <p>
* Note that in all cases the transaction supplied can be null and in this case the Database
* will use the normal mechanism to obtain the transaction to use.
*/
public interface ExtendedServer {
@@ -35,162 +18,4 @@ public interface ExtendedServer {
@Deprecated
void setClock(Clock clock);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> boolean exists(Query<T> ormQuery, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int findCount(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> List<A> findIds(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> QueryIterator<T> findIterate(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Stream<T> findStream(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEach(Query<T> query, int batch, Consumer<List<T>> consumer, Transaction t);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> List<Version<T>> findVersions(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> List<T> findList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureRowCount<T> findFutureCount(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureIds<T> findFutureIds(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureList<T> findFutureList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> PagedList<T> findPagedList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Set<T> findSet(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<K, T> Map<K, T> findMap(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> List<A> findSingleAttributeList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> Set<A> findSingleAttributeSet(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
@Nullable
<T> T findOne(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Optional<T> findOneOrEmpty(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int delete(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int update(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
List<SqlRow> findList(SqlQuery query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
void findEach(SqlQuery query, Consumer<SqlRow> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link SqlQuery#usingTransaction(Transaction)}.
*/
@Deprecated
@Nullable
SqlRow findOne(SqlQuery query, Transaction transaction);
}
@@ -30,23 +30,6 @@ public interface ProfileLocation {
return XServiceProvider.profileLocationFactory().create(label);
}
/**
* Deprecated in favor of {@link #create(String)}.
*/
@Deprecated
static ProfileLocation create(int lineNumber, String label) {
return create(label);
}
/**
* Deprecated for removal - not used.
* Create and return a new ProfileLocation with a given location.
*/
@Deprecated
static ProfileLocation createAt(String location) {
return XServiceProvider.profileLocationFactory().createAt(location);
}
/**
* Obtain the description returning true if this is the initial call.
*/
+6 -22
View File
@@ -1372,13 +1372,9 @@ public interface Query<T> extends CancelableQuery {
Query<T> orderBy(String orderByClause);
/**
* Set the order by clause replacing the existing order by clause if there is
* one.
* <p>
* This follows SQL syntax using commas between each property with the
* optional asc and desc keywords representing ascending and descending order
* respectively.
* Deprecated migrate to orderBy().
*/
@Deprecated(since = "13.19")
default Query<T> order(String orderByClause) {
return orderBy(orderByClause);
}
@@ -1395,14 +1391,9 @@ public interface Query<T> extends CancelableQuery {
OrderBy<T> orderBy();
/**
* Return the OrderBy so that you can append an ascending or descending
* property to the order by clause.
* <p>
* This will never return a null. If no order by clause exists then an 'empty'
* OrderBy object is returned.
* <p>
* This is the same as <code>orderBy()</code>
* Deprecated migrate to orderBy().
*/
@Deprecated(since = "13.19")
default OrderBy<T> order() {
return orderBy();
}
@@ -1413,8 +1404,9 @@ public interface Query<T> extends CancelableQuery {
Query<T> setOrderBy(OrderBy<T> orderBy);
/**
* Set an OrderBy object to replace any existing OrderBy clause.
* Deprecated migrate to setOrderBy().
*/
@Deprecated(since = "13.19")
default Query<T> setOrder(OrderBy<T> orderBy) {
return setOrderBy(orderBy);
}
@@ -1579,14 +1571,6 @@ public interface Query<T> extends CancelableQuery {
*/
Query<T> setReadOnly(boolean readOnly);
/**
* Deprecated - migrate to use setBeanCacheMode(CacheMode.PUT) or other CacheMode.
* <p>
* When set to true all the beans from this query are loaded into the bean cache.
*/
@Deprecated
Query<T> setLoadBeanCache(boolean loadBeanCache);
/**
* Set a timeout on this query.
* <p>
@@ -110,7 +110,7 @@ public final class ToStringBuilder {
} else {
String content = String.valueOf(value);
if (content.length() > TRIM_LENGTH) {
content = content.substring(0, TRIM_LENGTH) + " <trimmed>";
content = content.substring(0, TRIM_LENGTH) + " (trimmed)";
}
sb.append(content);
if (sb.length() >= MAX_TOTAL_CONTENT) {
@@ -526,11 +526,6 @@ public class DatabaseConfig {
private ProfilingConfig profilingConfig = new ProfilingConfig();
/**
* Controls the default order by id setting of queries. See {@link Query#orderById(boolean)}
*/
private boolean defaultOrderById;
/**
* The mappingLocations for searching xml mapping.
*/
@@ -595,22 +590,6 @@ public class DatabaseConfig {
this.slowQueryListener = slowQueryListener;
}
/**
* Deprecated - look to have explicit order by. Sets the default orderById setting for queries.
*/
@Deprecated
public void setDefaultOrderById(boolean defaultOrderById) {
this.defaultOrderById = defaultOrderById;
}
/**
* Returns the default orderById setting for queries.
*/
public boolean isDefaultOrderById() {
return defaultOrderById;
}
/**
* Put a service object into configuration such that it can be used by ebean or a plugin.
* <p>
@@ -2327,8 +2306,6 @@ public class DatabaseConfig {
* <p>
* If no classes are specified then the classes are found automatically via
* searching the class path.
* <p>
* Alternatively the classes can be added via {@link #setClasses(List)}.
*
* @param cls the entity type (or other type) that should be registered by this database.
*/
@@ -2942,7 +2919,6 @@ public class DatabaseConfig {
jdbcFetchSizeFindEach = p.getInt("jdbcFetchSizeFindEach", jdbcFetchSizeFindEach);
jdbcFetchSizeFindList = p.getInt("jdbcFetchSizeFindList", jdbcFetchSizeFindList);
databasePlatformName = p.get("databasePlatformName", databasePlatformName);
defaultOrderById = p.getBoolean("defaultOrderById", defaultOrderById);
uuidVersion = p.getEnum(UuidVersion.class, "uuidVersion", uuidVersion);
uuidStateFile = p.get("uuidStateFile", uuidStateFile);
@@ -673,7 +673,7 @@ public class DatabasePlatform {
protected String withForUpdate(String sql, Query.LockWait lockWait, Query.LockType lockType) {
// silently assume the database does not support the "for update" clause.
log.log(INFO, "it seems your database does not support the 'for update' clause");
log.log(INFO, "it seems your database does not support the ''for update'' clause");
return sql;
}
@@ -16,22 +16,6 @@ public interface MetaInfoManager {
*/
ServerMetrics collectMetrics();
/**
* Deprecated migrate to collectMetrics().asJson().
*/
@Deprecated
default ServerMetricsAsJson collectMetricsAsJson() {
return collectMetrics().asJson();
}
/**
* Deprecated migrate to collectMetrics().asData().
*/
@Deprecated
default List<MetricData> collectMetricsAsData() {
return collectMetrics().asData();
}
/**
* Visit the metrics resetting and collecting/reporting as desired.
*/
@@ -2,6 +2,8 @@ package io.ebean.meta;
import io.ebean.ProfileLocation;
import java.time.Instant;
/**
* Meta data for captured query plan.
*/
@@ -51,4 +53,14 @@ public interface MetaQueryPlan {
* Return the total count of times bind capture has occurred.
*/
long captureCount();
/**
* Return the time taken to capture this plan in microseconds.
*/
long captureMicros();
/**
* Return the instant when the bind values were captured.
*/
Instant whenCaptured();
}
-101
View File
@@ -1,101 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
</parent>
<!-- <parent>-->
<!-- <groupId>org.avaje</groupId>-->
<!-- <artifactId>java8-oss</artifactId>-->
<!-- <version>2.2</version>-->
<!-- </parent>-->
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>HEAD</tag>
</scm>
<name>ebean autotune</name>
<description>ebean automatic query tuning module</description>
<artifactId>ebean-autotune</artifactId>
<dependencies>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<scope>provided</scope>
</dependency>
<!-- JAVAX-DEPENDENCY-START -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.6</version>
<scope>provided</scope>
</dependency>
<!-- JAVAX-DEPENDENCY-END -->
<!-- JAKARTA-DEPENDENCY-START ___
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
</dependency>
____ JAKARTA-DEPENDENCY-END -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-datasource</artifactId>
<version>${ebean-datasource.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.17.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.avaje</groupId>
<artifactId>junit</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.17.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.34</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.17.1</tile>
</tiles>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -1,133 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
/**
* Java class for anonymous complex type.
* <p>
* The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}origin" maxOccurs="unbounded" minOccurs="0"/>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}profileDiff" minOccurs="0"/>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}profileNew" minOccurs="0"/>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}profileEmpty" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"origin",
"profileDiff",
"profileNew",
"profileEmpty"
})
@XmlRootElement(name = "autotune")
public class Autotune {
protected List<Origin> origin;
protected ProfileDiff profileDiff;
protected ProfileNew profileNew;
protected ProfileEmpty profileEmpty;
/**
* Gets the value of the origin property.
* <p>
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the origin property.
* <p>
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getOrigin().add(newItem);
* </pre>
* <p>
* <p>
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Origin }
*/
public List<Origin> getOrigin() {
if (origin == null) {
origin = new ArrayList<>();
}
return this.origin;
}
/**
* Gets the value of the profileDiff property.
*
* @return possible object is
* {@link ProfileDiff }
*/
public ProfileDiff getProfileDiff() {
return profileDiff;
}
/**
* Sets the value of the profileDiff property.
*
* @param value allowed object is
* {@link ProfileDiff }
*/
public void setProfileDiff(ProfileDiff value) {
this.profileDiff = value;
}
/**
* Gets the value of the profileNew property.
*
* @return possible object is
* {@link ProfileNew }
*/
public ProfileNew getProfileNew() {
return profileNew;
}
/**
* Sets the value of the profileNew property.
*
* @param value allowed object is
* {@link ProfileNew }
*/
public void setProfileNew(ProfileNew value) {
this.profileNew = value;
}
/**
* Gets the value of the profileEmpty property.
*
* @return possible object is
* {@link ProfileEmpty }
*/
public ProfileEmpty getProfileEmpty() {
return profileEmpty;
}
/**
* Sets the value of the profileEmpty property.
*
* @param value allowed object is
* {@link ProfileEmpty }
*/
public void setProfileEmpty(ProfileEmpty value) {
this.profileEmpty = value;
}
}
@@ -1,64 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each
* Java content interface and Java element interface
* generated in the io.ebeaninternal.server.autotune.model package.
* <p>An ObjectFactory allows you to programatically
* construct new instances of the Java representation
* for XML content. The Java representation of XML
* content can consist of schema derived interfaces
* and classes representing the binding of schema
* type definitions, element declarations and model
* groups. Factory methods for each of these are
* provided in this class.
*/
@XmlRegistry
public class ObjectFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: io.ebeaninternal.server.autotune.model
*/
public ObjectFactory() {
}
/**
* Create an instance of {@link ProfileNew }
*/
public ProfileNew createProfileNew() {
return new ProfileNew();
}
/**
* Create an instance of {@link Origin }
*/
public Origin createOrigin() {
return new Origin();
}
/**
* Create an instance of {@link ProfileEmpty }
*/
public ProfileEmpty createProfileEmpty() {
return new ProfileEmpty();
}
/**
* Create an instance of {@link Autotune }
*/
public Autotune createAutotune() {
return new Autotune();
}
/**
* Create an instance of {@link ProfileDiff }
*/
public ProfileDiff createProfileDiff() {
return new ProfileDiff();
}
}
@@ -1,148 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for anonymous complex type.
* <p>
* <p>The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="callStack" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* &lt;/sequence>
* &lt;attribute name="key" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />
* &lt;attribute name="beanType" type="{http://www.w3.org/2001/XMLSchema}string" />
* &lt;attribute name="detail" type="{http://www.w3.org/2001/XMLSchema}string" />
* &lt;attribute name="original" type="{http://www.w3.org/2001/XMLSchema}string" />
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"callStack"
})
@XmlRootElement(name = "origin")
public class Origin {
protected String callStack;
@XmlAttribute(name = "key", required = true)
protected String key;
@XmlAttribute(name = "beanType")
protected String beanType;
@XmlAttribute(name = "detail")
protected String detail;
@XmlAttribute(name = "original")
protected String original;
/**
* Gets the value of the callStack property.
*
* @return possible object is
* {@link String }
*/
public String getCallStack() {
return callStack;
}
/**
* Sets the value of the callStack property.
*
* @param value allowed object is
* {@link String }
*/
public void setCallStack(String value) {
this.callStack = value;
}
/**
* Gets the value of the key property.
*
* @return possible object is
* {@link String }
*/
public String getKey() {
return key;
}
/**
* Sets the value of the key property.
*
* @param value allowed object is
* {@link String }
*/
public void setKey(String value) {
this.key = value;
}
/**
* Gets the value of the beanType property.
*
* @return possible object is
* {@link String }
*/
public String getBeanType() {
return beanType;
}
/**
* Sets the value of the beanType property.
*
* @param value allowed object is
* {@link String }
*/
public void setBeanType(String value) {
this.beanType = value;
}
/**
* Gets the value of the detail property.
*
* @return possible object is
* {@link String }
*/
public String getDetail() {
return detail;
}
/**
* Sets the value of the detail property.
*
* @param value allowed object is
* {@link String }
*/
public void setDetail(String value) {
this.detail = value;
}
/**
* Gets the value of the original property.
*
* @return possible object is
* {@link String }
*/
public String getOriginal() {
return original;
}
/**
* Sets the value of the original property.
*
* @param value allowed object is
* {@link String }
*/
public void setOriginal(String value) {
this.original = value;
}
}
@@ -1,64 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Java class for anonymous complex type.
* <p>
* <p>The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}origin" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"origin"
})
@XmlRootElement(name = "profileDiff")
public class ProfileDiff {
protected List<Origin> origin;
/**
* Gets the value of the origin property.
* <p>
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the origin property.
* <p>
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getOrigin().add(newItem);
* </pre>
* <p>
* <p>
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Origin }
*/
public List<Origin> getOrigin() {
if (origin == null) {
origin = new ArrayList<>();
}
return this.origin;
}
}
@@ -1,64 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Java class for anonymous complex type.
* <p>
* <p>The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}origin" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"origin"
})
@XmlRootElement(name = "profileEmpty")
public class ProfileEmpty {
protected List<Origin> origin;
/**
* Gets the value of the origin property.
* <p>
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the origin property.
* <p>
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getOrigin().add(newItem);
* </pre>
* <p>
* <p>
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Origin }
*/
public List<Origin> getOrigin() {
if (origin == null) {
origin = new ArrayList<>();
}
return this.origin;
}
}
@@ -1,64 +0,0 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
/**
* <p>Java class for anonymous complex type.
* <p>
* <p>The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element ref="{http://ebean-orm.github.io/xml/ns/autotune}origin" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"origin"
})
@XmlRootElement(name = "profileNew")
public class ProfileNew {
protected List<Origin> origin;
/**
* Gets the value of the origin property.
* <p>
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the origin property.
* <p>
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getOrigin().add(newItem);
* </pre>
* <p>
* <p>
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Origin }
*/
public List<Origin> getOrigin() {
if (origin == null) {
origin = new ArrayList<>();
}
return this.origin;
}
}
@@ -1,2 +0,0 @@
@javax.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/autotune", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package io.ebeaninternal.server.autotune.model;
@@ -1,61 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import java.util.Collection;
/**
* Event where all tuned query information is collected.
* <p>
* This is for writing the "all" file on shutdown when using runtime tuning.
* </p>
*/
public class AutoTuneAllCollection {
final Autotune document = new Autotune();
final BaseQueryTuner queryTuner;
/**
* Construct to collect/report all tuned queries.
*/
public AutoTuneAllCollection(BaseQueryTuner queryTuner) {
this.queryTuner = queryTuner;
loadAllTuned();
}
/**
* Return the number of origin elements in the document.
*/
public int size() {
return document.getOrigin().size();
}
/**
* Return the Autotune document object.
*/
public Autotune getDocument() {
return document;
}
/**
* Write the document as an xml file.
*/
public void writeFile(String filePrefix, boolean withNow) {
AutoTuneXmlWriter writer = new AutoTuneXmlWriter();
writer.write(document, filePrefix, withNow);
}
/**
* Loads all the existing query tuning into the document.
*/
private void loadAllTuned() {
Collection<TunedQueryInfo> all = queryTuner.getAll();
for (TunedQueryInfo tuned : all) {
document.getOrigin().add(tuned.getOrigin());
}
}
}
@@ -1,115 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.ObjectGraphOrigin;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import java.util.ArrayList;
import java.util.List;
/**
* Profiling information collected.
*/
public class AutoTuneCollection {
final List<Entry> entries = new ArrayList<>();
public Entry add(ObjectGraphOrigin origin, OrmQueryDetail detail, String sourceQuery) {
Entry entry = new Entry(origin, detail, sourceQuery);
entries.add(entry);
return entry;
}
public List<Entry> getEntries() {
return entries;
}
/**
* Profiling entry at a given origin point.
*/
public static class Entry {
/**
* Profiling origin point.
*/
private final ObjectGraphOrigin origin;
/**
* The tuned query detail.
*/
private final OrmQueryDetail detail;
/**
* The original/existing query detail.
*/
private final String originalQuery;
/**
* Summary execution statistics for queries related to this origin point.
*/
private final List<EntryQuery> queries = new ArrayList<>();
public Entry(ObjectGraphOrigin origin, OrmQueryDetail detail, String originalQuery) {
this.origin = origin;
this.detail = detail;
this.originalQuery = originalQuery;
}
public void addQuery(EntryQuery entryQuery) {
queries.add(entryQuery);
}
public ObjectGraphOrigin getOrigin() {
return origin;
}
public OrmQueryDetail getDetail() {
return detail;
}
public String getOriginalQuery() {
return originalQuery;
}
public List<EntryQuery> getQueries() {
return queries;
}
}
/**
* Summary query execution statistics for the origin point.
*/
public static class EntryQuery {
final String path;
final long exeCount;
final long totalBeanLoaded;
final long totalMicros;
public EntryQuery(String path, long exeCount, long totalBeanLoaded, long totalMicros) {
this.path = path;
this.exeCount = exeCount;
this.totalBeanLoaded = totalBeanLoaded;
this.totalMicros = totalMicros;
}
/**
* Return the relative path with empty string for the origin query.
*/
public String getPath() {
return path;
}
public long getExeCount() {
return exeCount;
}
public long getTotalBeanLoaded() {
return totalBeanLoaded;
}
public long getTotalMicros() {
return totalMicros;
}
}
}
@@ -1,161 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.ObjectGraphOrigin;
import io.ebeaninternal.server.autotune.model.Autotune;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.autotune.model.ProfileDiff;
import io.ebeaninternal.server.autotune.model.ProfileNew;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
/**
* Event where profiling information is collected and processed for differences
* relative to the current query tuning.
*/
public class AutoTuneDiffCollection {
final Autotune document = new Autotune();
final AutoTuneCollection profiling;
final BaseQueryTuner queryTuner;
final boolean updateTuning;
int newCount;
int diffCount;
/**
* Construct to collect/report the new/diff query tuning entries.
*/
public AutoTuneDiffCollection(AutoTuneCollection profiling, BaseQueryTuner queryTuner, boolean updateTuning) {
this.profiling = profiling;
this.queryTuner = queryTuner;
this.updateTuning = updateTuning;
}
/**
* Return true if there are no new or diff entries.
*/
public boolean isEmpty() {
return newCount == 0 && diffCount == 0;
}
/**
* Return the underlying Autotune document object.
*/
public Autotune getDocument() {
return document;
}
/**
* Return the number of diff entries.
*/
public int getDiffCount() {
return diffCount;
}
/**
* Return the number of new entries.
*/
public int getNewCount() {
return newCount;
}
/**
* Return the total new and diff entries.
*/
public int getChangeCount() {
return newCount + diffCount;
}
/**
* Write the underlying document as an xml file.
*/
public void writeFile(String filePrefix) {
AutoTuneXmlWriter writer = new AutoTuneXmlWriter();
writer.write(document, filePrefix, true);
}
/**
* Process checking profiling entries against existing query tuning.
*/
public void process() {
for (AutoTuneCollection.Entry entry : profiling.getEntries()) {
addToDocument(entry);
}
}
/**
* Check if the entry is new or diff and add as necessary.
*/
private void addToDocument(AutoTuneCollection.Entry entry) {
ObjectGraphOrigin point = entry.getOrigin();
OrmQueryDetail profileDetail = entry.getDetail();
// compare with the existing query tuning entry
OrmQueryDetail tuneDetail = queryTuner.get(point.key());
if (tuneDetail == null) {
addToDocumentNewEntry(entry, point);
} else if (!tuneDetail.isAutoTuneEqual(profileDetail)) {
addToDocumentDiffEntry(entry, point, tuneDetail);
}
}
/**
* Add as a diff entry.
*/
private void addToDocumentDiffEntry(AutoTuneCollection.Entry entry, ObjectGraphOrigin point, OrmQueryDetail tuneDetail) {
diffCount++;
Origin origin = createOrigin(entry, point, tuneDetail.asString());
ProfileDiff diff = document.getProfileDiff();
if (diff == null) {
diff = new ProfileDiff();
document.setProfileDiff(diff);
}
diff.getOrigin().add(origin);
}
/**
* Add as a "new" entry.
*/
private void addToDocumentNewEntry(AutoTuneCollection.Entry entry, ObjectGraphOrigin point) {
newCount++;
ProfileNew profileNew = document.getProfileNew();
if (profileNew == null) {
profileNew = new ProfileNew();
document.setProfileNew(profileNew);
}
Origin origin = createOrigin(entry, point, entry.getOriginalQuery());
profileNew.getOrigin().add(origin);
}
/**
* Create the XML Origin bean for the given entry and ObjectGraphOrigin.
*/
private Origin createOrigin(AutoTuneCollection.Entry entry, ObjectGraphOrigin point, String query) {
Origin origin = new Origin();
origin.setKey(point.key());
origin.setBeanType(point.beanType());
origin.setDetail(entry.getDetail().asString());
origin.setCallStack(point.callOrigin().description());
origin.setOriginal(query);
if (updateTuning) {
queryTuner.put(origin);
}
return origin;
}
}
@@ -1,15 +0,0 @@
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 implements AutoTuneServiceProvider {
@Override
public AutoTuneService create(SpiEbeanServer server, DatabaseConfig config) {
return new DefaultAutoTuneService(server, config);
}
}
@@ -1,52 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Reads a profiling xml document.
*/
public class AutoTuneXmlReader {
/**
* Read and return a Profiling from an xml file.
*/
public static Autotune read(File file) {
try {
return readFile(file);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
protected static Autotune readFile(File file) throws IOException {
if (!file.exists()) {
return new Autotune();
}
try (FileInputStream is = new FileInputStream(file)) {
return read(is);
}
}
/**
* Read and return a Profiling from an xml document.
*/
public static Autotune read(InputStream is) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Autotune.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (Autotune) unmarshaller.unmarshal(is);
} catch (JAXBException e) {
throw new IllegalStateException(e);
}
}
}
@@ -1,57 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Simple writer for output of the AutoTune Profiling as an XML document.
*/
public class AutoTuneXmlWriter {
/**
* Return 'now' as a string to second precision.
*/
public static String now() {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss");
return df.format(new Date());
}
/**
* Write the document as xml file with the given prefix.
*/
public void write(Autotune document, String fileName, boolean withNow) {
SortAutoTuneDocument.sort(document);
if (withNow) {
fileName += "-" + now() + ".xml";
}
// write the file with serverName and now suffix as we can output the profiling many times
write(document, new File(fileName));
}
/**
* Write Profiling to a file as xml.
*/
public void write(Autotune profiling, File file) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Autotune.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(profiling, file);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
}
@@ -1,204 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.CallOrigin;
import io.ebean.bean.ObjectGraphNode;
import io.ebean.config.AutoTuneConfig;
import io.ebean.config.AutoTuneMode;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.autotune.ProfilingListener;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import javax.persistence.PersistenceException;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
*
*/
public class BaseQueryTuner {
private final boolean queryTuning;
private final boolean profiling;
private final AutoTuneMode mode;
/**
* Map of the tuned query details per profile query point.
*/
private final Map<String, TunedQueryInfo> tunedQueryInfoMap = new ConcurrentHashMap<>();
private final SpiEbeanServer server;
private final ProfilingListener profilingListener;
/**
* Flag set true when there is no profiling or query tuning.
*/
private final boolean skipAll;
BaseQueryTuner(AutoTuneConfig config, SpiEbeanServer server, ProfilingListener profilingListener) {
this.server = server;
this.profilingListener = profilingListener;
this.mode = config.getMode();
this.queryTuning = config.isQueryTuning();
this.profiling = config.isProfiling();
this.skipAll = !queryTuning && !profiling;
}
/**
* Return all the current tuned query entries.
*/
public Collection<TunedQueryInfo> getAll() {
return tunedQueryInfoMap.values();
}
/**
* Put a query tuning entry.
*/
public void put(Origin origin) {
tunedQueryInfoMap.put(origin.getKey(), new TunedQueryInfo(origin));
}
/**
* Load the tuned query information.
*/
public void load(String key, TunedQueryInfo queryInfo) {
tunedQueryInfoMap.put(key, queryInfo);
}
/**
* Return the detail currently used for tuning.
* This returns null if there is currently no matching tuning.
*/
public OrmQueryDetail get(String key) {
TunedQueryInfo info = tunedQueryInfoMap.get(key);
return (info == null) ? null : info.getTunedDetail();
}
/**
* Auto tune the query and enable profiling.
*/
boolean tuneQuery(SpiQuery<?> query) {
if (skipAll || !tunableQuery(query)) {
return false;
}
if (query.getProfilingListener() != null) {
// profiling secondary query
return false;
}
if (!useTuning(query)) {
if (profiling) {
profiling(query, server.createCallOrigin());
}
return false;
}
if (query.getParentNode() != null) {
// This is a +lazy/+query query with profiling on.
// We continue to collect the profiling information.
query.setProfilingListener(profilingListener);
return true;
}
// create a query point to identify the query
CallOrigin callOrigin = server.createCallOrigin();
ObjectGraphNode origin = query.setOrigin(callOrigin);
if (profiling) {
if (profilingListener.isProfileRequest(origin, query)) {
// collect more profiling based on profiling rate etc
query.setProfilingListener(profilingListener);
}
}
if (queryTuning) {
// get current "tuned fetch" for this query point
TunedQueryInfo tuneInfo = tunedQueryInfoMap.get(origin.origin().key());
return tuneInfo != null && tuneInfo.tuneQuery(query);
}
return false;
}
/**
* Return false for row count, find ids, subQuery, delete and Versions queries.
* <p>
* These queries are not applicable for autoTune in that they don't have a select/fetch (fetch group).
* </p>
* <p>
* We also exclude queries that are explicitly set to load the L2 bean cache as we want full beans
* in that case.
* </p>
*/
private boolean tunableQuery(SpiQuery<?> query) {
SpiQuery.Type type = query.getType();
switch (type) {
case COUNT:
case ATTRIBUTE:
case ATTRIBUTE_SET:
case ID_LIST:
case UPDATE:
case DELETE:
case SQ_EXISTS:
case SQ_EX:
return false;
default:
// not using autoTune when explicitly loading the l2 bean cache
// or when using Versions query
return !query.isForceHitDatabase() && SpiQuery.TemporalMode.VERSIONS != query.getTemporalMode();
}
}
private void profiling(SpiQuery<?> query, CallOrigin call) {
// create a query point to identify the query
ObjectGraphNode origin = query.setOrigin(call);
if (profilingListener.isProfileRequest(origin, query)) {
// collect more profiling based on profiling rate etc
query.setProfilingListener(profilingListener);
}
}
/**
* Return true if we should try to tune this query.
*/
private boolean useTuning(SpiQuery<?> query) {
Boolean autoTune = query.isAutoTune();
if (autoTune != null) {
// explicitly set...
return autoTune;
} else {
// determine using implicit mode...
switch (mode) {
case DEFAULT_ON:
return true;
case DEFAULT_OFF:
return false;
case DEFAULT_ONIFEMPTY:
return query.isDetailEmpty();
default:
throw new PersistenceException("Invalid AutoTuneMode " + mode);
}
}
}
/**
* Return the keys as a set.
*/
public Set<String> keySet() {
return tunedQueryInfoMap.keySet();
}
}
@@ -1,295 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.avaje.applog.AppLog;
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.AutoTuneService;
import io.ebeaninternal.server.autotune.model.Autotune;
import io.ebeaninternal.server.autotune.model.Origin;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.System.Logger.Level.*;
/**
* Implementation of the AutoTuneService which is comprised of profiling and query tuning.
*/
public class DefaultAutoTuneService implements AutoTuneService {
private static final System.Logger logger = AppLog.getLogger(DefaultAutoTuneService.class);
private final ReentrantLock lock = new ReentrantLock();
private final SpiEbeanServer server;
private final long defaultGarbageCollectionWait;
private final boolean skipGarbageCollectionOnShutdown;
private final boolean skipProfileReportingOnShutdown;
private final BaseQueryTuner queryTuner;
private final ProfileManager profileManager;
private final boolean profiling;
private final boolean queryTuning;
private final String tuningFile;
private final String profilingFile;
private final String serverName;
private final int profilingUpdateFrequency;
private long runtimeChangeCount;
public DefaultAutoTuneService(SpiEbeanServer server, DatabaseConfig databaseConfig) {
AutoTuneConfig config = databaseConfig.getAutoTuneConfig();
this.server = server;
this.queryTuning = config.isQueryTuning();
this.profiling = config.isProfiling();
this.tuningFile = config.getQueryTuningFile();
this.profilingFile = config.getProfilingFile();
this.profilingUpdateFrequency = config.getProfilingUpdateFrequency();
this.serverName = server.name();
this.profileManager = new ProfileManager(config, server);
this.queryTuner = new BaseQueryTuner(config, server, profileManager);
this.skipGarbageCollectionOnShutdown = config.isSkipGarbageCollectionOnShutdown();
this.skipProfileReportingOnShutdown = config.isSkipProfileReportingOnShutdown();
this.defaultGarbageCollectionWait = config.getGarbageCollectionWait();
}
/**
* Load the query tuning information from it's data store.
*/
@Override
public void startup() {
if (queryTuning) {
loadTuningFile();
if (isRuntimeTuningUpdates()) {
// periodically gather and update query tuning
server.backgroundExecutor().scheduleWithFixedDelay(new ProfilingUpdate(), profilingUpdateFrequency, profilingUpdateFrequency, TimeUnit.SECONDS);
}
}
}
/**
* Return true if the tuning should update periodically at runtime.
*/
private boolean isRuntimeTuningUpdates() {
return profilingUpdateFrequency > 0;
}
private class ProfilingUpdate implements Runnable {
@Override
public void run() {
runtimeTuningUpdate();
}
}
/**
* Load tuning information from an existing tuning file.
*/
private void loadTuningFile() {
File file = new File(tuningFile);
if (file.exists()) {
loadAutoTuneProfiling(AutoTuneXmlReader.read(file));
} else {
// look for autotune as a resource
try (InputStream stream = getClass().getResourceAsStream("/" + tuningFile)) {
if (stream != null) {
loadAutoTuneProfiling(AutoTuneXmlReader.read(stream));
} else {
logger.log(WARNING, "AutoTune file {0} not found - no initial automatic query tuning", tuningFile);
}
} catch (IOException e) {
throw new IllegalStateException("Error on auto close of " + tuningFile, e);
}
}
}
private void loadAutoTuneProfiling(Autotune profiling) {
logger.log(INFO, "AutoTune loading {0} tuning entries", profiling.getOrigin().size());
for (Origin origin : profiling.getOrigin()) {
queryTuner.put(origin);
}
}
/**
* Collect profiling, check for new/diff to existing tuning and apply changes.
*/
private void runtimeTuningUpdate() {
lock.lock();
try {
try {
long start = System.currentTimeMillis();
AutoTuneCollection profiling = profileManager.profilingCollection(false);
AutoTuneDiffCollection event = new AutoTuneDiffCollection(profiling, queryTuner, true);
event.process();
if (event.isEmpty()) {
long exeMillis = System.currentTimeMillis() - start;
logger.log(DEBUG, "No query tuning updates for server:{0} executionMillis:{1}", serverName, exeMillis);
} else {
// report the query tuning changes that have been made
runtimeChangeCount += event.getChangeCount();
event.writeFile(profilingFile + "-" + serverName + "-update");
long exeMillis = System.currentTimeMillis() - start;
logger.log(INFO, "query tuning updates - new:{0} diff:{1} for server:{2} executionMillis:{3}", event.getNewCount(), event.getDiffCount(), serverName, exeMillis);
}
} catch (Throwable e) {
logger.log(ERROR, "Error collecting or applying automatic query tuning", e);
}
} finally {
lock.unlock();
}
}
private void saveProfilingOnShutdown(boolean reset) {
lock.lock();
try {
if (isRuntimeTuningUpdates()) {
runtimeTuningUpdate();
outputAllTuning();
} else {
AutoTuneCollection profiling = profileManager.profilingCollection(reset);
AutoTuneDiffCollection event = new AutoTuneDiffCollection(profiling, queryTuner, false);
event.process();
if (event.isEmpty()) {
logger.log(INFO, "No new or diff entries for profiling server:{0}", serverName);
} else {
event.writeFile(profilingFile + "-" + serverName);
logger.log(INFO, "writing new:{0} diff:{1} profiling entries for server:{2}", event.getNewCount(), event.getDiffCount(), serverName);
}
}
} finally {
lock.unlock();
}
}
/**
* Output all the query tuning (the "all" file).
* <p>
* This is the originally loaded tuning plus any tuning changes picked up and applied at runtime.
* </p>
* <p>
* This "all" file can be used as the next "ebean-autotune.xml" file.
* </p>
*/
private void outputAllTuning() {
if (runtimeChangeCount == 0) {
logger.log(INFO, "no runtime query tuning changes for server:{0}", serverName);
} else {
AutoTuneAllCollection event = new AutoTuneAllCollection(queryTuner);
int size = event.size();
File existingTuning = new File(tuningFile);
if (existingTuning.exists()) {
// rename the existing autotune.xml file (appending 'now')
if (!existingTuning.renameTo(new File(tuningFile + "." + AutoTuneXmlWriter.now()))) {
logger.log(WARNING, "Failed to rename autotune file [{0}]", tuningFile);
}
}
event.writeFile(tuningFile, false);
logger.log(INFO, "query tuning detected [{0}] changes, writing all [{1}] tuning entries for server:{2}", runtimeChangeCount, size, serverName);
}
}
/**
* Shutdown the listener.
* <p>
* We should try to collect the usage statistics by calling a System.gc().
* This is necessary for use with short lived applications where garbage
* collection may not otherwise occur at all.
* </p>
*/
@Override
public void shutdown() {
if (profiling) {
if (!skipGarbageCollectionOnShutdown && !skipProfileReportingOnShutdown) {
// trigger GC to update profiling information on recently executed queries
collectProfiling(-1);
}
if (!skipProfileReportingOnShutdown) {
saveProfilingOnShutdown(false);
}
}
}
/**
* Output the profiling.
* <p>
* When profiling updates are applied to tuning at runtime this reports all tuning and profiling combined.
* When profiling is not applied at runtime then this reports the diff report with new and diff entries relative
* to the existing tuning.
* </p>
*/
@Override
public void reportProfiling() {
saveProfilingOnShutdown(false);
}
/**
* Ask for a System.gc() so that we gather node usage information.
* <p>
* Really only want to do this sparingly but useful just prior to shutdown
* for short run application where garbage collection may otherwise not
* occur at all.
* </p>
* <p>
* waitMillis will do a thread sleep to give the garbage collection a little
* time to do its thing assuming we are shutting down the VM.
* </p>
* <p>
* If waitMillis is -1 then the defaultGarbageCollectionWait is used which
* defaults to 100 milliseconds.
* </p>
*/
@Override
public void collectProfiling() {
collectProfiling(-1);
}
public void collectProfiling(long waitMillis) {
System.gc();
try {
if (waitMillis < 0) {
waitMillis = defaultGarbageCollectionWait;
}
Thread.sleep(waitMillis);
} catch (InterruptedException e) {
// restore the interrupted status
Thread.currentThread().interrupt();
logger.log(WARNING, "Error while sleeping after System.gc() request.", e);
}
}
/**
* Auto tune the query and enable profiling.
*/
@Override
public boolean tuneQuery(SpiQuery<?> query) {
return queryTuner.tuneQuery(query);
}
}
@@ -1,122 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.NodeUsageCollector;
import io.ebean.bean.ObjectGraphNode;
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.ProfilingListener;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
* Manages the collection of object graph usage profiling.
*/
public class ProfileManager implements ProfilingListener {
private final ReentrantLock lock = new ReentrantLock();
private final boolean queryTuningAddVersion;
/**
* Converted from a 0-100 int to a double. Effectively a percentage rate at
* which to collect profiling information.
*/
private final double profilingRate;
private final int profilingBase;
/**
* Map of the usage and query statistics gathered.
*/
private final Map<String, ProfileOrigin> profileMap = new ConcurrentHashMap<>();
private final SpiEbeanServer server;
public ProfileManager(AutoTuneConfig config, SpiEbeanServer server) {
this.server = server;
this.profilingRate = config.getProfilingRate();
this.profilingBase = config.getProfilingBase();
this.queryTuningAddVersion = config.isQueryTuningAddVersion();
}
@Override
public boolean isProfileRequest(ObjectGraphNode origin, SpiQuery<?> query) {
ProfileOrigin profileOrigin = profileMap.get(origin.origin().key());
if (profileOrigin == null) {
profileMap.put(origin.origin().key(), createProfileOrigin(origin, query));
return true;
} else {
return profileOrigin.isProfile();
}
}
/**
* Create the profile origin noting the query detail currently being used.
* <p>
* For new profiling entries it is useful to compare the profiling against the current
* query detail that is specified in the code (as the query might already be manually optimised).
*/
private ProfileOrigin createProfileOrigin(ObjectGraphNode origin, SpiQuery<?> query) {
ProfileOrigin profileOrigin = new ProfileOrigin(origin.origin(), queryTuningAddVersion, profilingBase, profilingRate);
// set the current query detail (fetch group) so that we can compare against profiling for new entries
profileOrigin.setOriginalQuery(query.getDetail().asString());
return profileOrigin;
}
/**
* Gather query execution statistics. This could either be the originating
* query in which case the parentNode will be null, or a lazy loading query
* resulting from traversal of the object graph.
*/
@Override
public void collectQueryInfo(ObjectGraphNode node, long beans, long micros) {
if (node != null) {
ObjectGraphOrigin origin = node.origin();
if (origin != null) {
ProfileOrigin stats = getProfileOrigin(origin);
stats.collectQueryInfo(node, beans, micros);
}
}
}
/**
* Collect usage statistics from a node in the object graph.
* <p>
* This is sent to use from a EntityBeanIntercept when the finalise method
* is called on the bean.
*/
@Override
public void collectNodeUsage(NodeUsageCollector.State usageCollector) {
ProfileOrigin profileOrigin = getProfileOrigin(usageCollector.node().origin());
profileOrigin.collectUsageInfo(usageCollector);
}
private ProfileOrigin getProfileOrigin(ObjectGraphOrigin originQueryPoint) {
lock.lock();
try {
return profileMap.computeIfAbsent(originQueryPoint.key(), k -> new ProfileOrigin(originQueryPoint, queryTuningAddVersion, profilingBase, profilingRate));
} finally {
lock.unlock();
}
}
/**
* Collect all the profiling information.
*/
public AutoTuneCollection profilingCollection(boolean reset) {
AutoTuneCollection req = new AutoTuneCollection();
for (ProfileOrigin origin : profileMap.values()) {
BeanDescriptor<?> desc = server.descriptorById(origin.getOrigin().beanType());
if (desc != null) {
origin.profilingCollection(desc, req, reset);
}
}
return req;
}
}
@@ -1,176 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.NodeUsageCollector;
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.deploy.BeanDescriptor;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
public class ProfileOrigin {
private final ReentrantLock lock = new ReentrantLock();
private static final long RESET_COUNT = -1000000000L;
private final ObjectGraphOrigin origin;
private final boolean queryTuningAddVersion;
private final int profilingBase;
private final double profilingRate;
private final Map<String, ProfileOriginQuery> queryStatsMap = new ConcurrentHashMap<>();
private final Map<String, ProfileOriginNodeUsage> nodeUsageMap = new ConcurrentHashMap<>();
private final AtomicLong requestCount = new AtomicLong();
private final AtomicLong profileCount = new AtomicLong();
private String originalQuery;
public ProfileOrigin(ObjectGraphOrigin origin, boolean queryTuningAddVersion, int profilingBase, double profilingRate) {
this.origin = origin;
this.queryTuningAddVersion = queryTuningAddVersion;
this.profilingBase = profilingBase;
this.profilingRate = profilingRate;
}
public String getOriginalQuery() {
return originalQuery;
}
public void setOriginalQuery(String originalQuery) {
this.originalQuery = originalQuery;
}
/**
* Return true if this query should be profiled based on a percentage rate.
*/
public boolean isProfile() {
long count = requestCount.incrementAndGet();
if (count < profilingBase) {
return true;
}
long hits = profileCount.get();
if (profilingRate > (double) hits / count) {
profileCount.incrementAndGet();
return true;
} else {
return false;
}
}
/**
* Collect profiling information with the option to reset the underlying profiling detail.
*/
public void profilingCollection(BeanDescriptor<?> rootDesc, AutoTuneCollection req, boolean reset) {
lock.lock();
try {
if (nodeUsageMap.isEmpty()) {
return;
}
OrmQueryDetail detail = buildDetail(rootDesc);
AutoTuneCollection.Entry entry = req.add(origin, detail, originalQuery);
Collection<ProfileOriginQuery> values = queryStatsMap.values();
for (ProfileOriginQuery queryEntry : values) {
entry.addQuery(queryEntry.createEntryQuery(reset));
}
if (reset) {
nodeUsageMap.clear();
if (requestCount.get() > RESET_COUNT) {
requestCount.set(profilingBase);
profileCount.set(0);
}
}
} finally {
lock.unlock();
}
}
OrmQueryDetail buildDetail(BeanDescriptor<?> rootDesc) {
PathProperties pathProps = new PathProperties();
for (ProfileOriginNodeUsage statsNode : nodeUsageMap.values()) {
statsNode.buildTunedFetch(pathProps, rootDesc, queryTuningAddVersion);
}
OrmQueryDetail detail = new OrmQueryDetail();
for (Props props : pathProps.getPathProps()) {
if (!props.isEmpty()) {
detail.fetch(props.getPath(), props.getPropertiesAsString(), null);
}
}
detail.sortFetchPaths(rootDesc);
return detail;
}
/**
* Return the origin.
*/
public ObjectGraphOrigin getOrigin() {
return origin;
}
/**
* Collect query execution summary statistics.
* <p>
* This can give us a quick overview into bad lazy loading areas etc.
* </p>
*/
public void collectQueryInfo(ObjectGraphNode node, long beansLoaded, long micros) {
String key = node.path();
if (key == null) {
key = "";
}
ProfileOriginQuery stats = queryStatsMap.get(key);
if (stats == null) {
// a race condition but we don't care
stats = new ProfileOriginQuery(key);
queryStatsMap.put(key, stats);
}
stats.add(beansLoaded, micros);
}
/**
* Collect the usage information for from a instance for this node.
*/
public void collectUsageInfo(NodeUsageCollector.State profile) {
if (!profile.isEmpty()) {
getNodeStats(profile.node().path()).collectUsageInfo(profile);
}
}
private ProfileOriginNodeUsage getNodeStats(String path) {
lock.lock();
try {
// handle null paths as using ConcurrentHashMap
path = (path == null) ? "" : path;
ProfileOriginNodeUsage nodeStats = nodeUsageMap.get(path);
if (nodeStats == null) {
nodeStats = new ProfileOriginNodeUsage(path);
nodeUsageMap.put(path, nodeStats);
}
return nodeStats;
} finally {
lock.unlock();
}
}
}
@@ -1,128 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.avaje.applog.AppLog;
import io.ebean.bean.NodeUsageCollector;
import io.ebean.text.PathProperties;
import io.ebean.util.SplitName;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.deploy.BeanProperty;
import io.ebeaninternal.server.deploy.BeanPropertyAssoc;
import io.ebeaninternal.server.el.ElPropertyValue;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.System.Logger.Level.WARNING;
/**
* Collects usages statistics for a given node in the object graph.
*/
public class ProfileOriginNodeUsage {
private static final System.Logger logger = AppLog.getLogger(ProfileOriginNodeUsage.class);
private final ReentrantLock lock = new ReentrantLock();
private final String path;
private int profileCount;
private int profileUsedCount;
private boolean modified;
private final Set<String> aggregateUsed = new LinkedHashSet<>();
public ProfileOriginNodeUsage(String path) {
// handle null paths as using ConcurrentHashMap
this.path = "".equals(path) ? null : path;
}
protected void buildTunedFetch(PathProperties pathProps, BeanDescriptor<?> rootDesc, boolean addVersionProperty) {
lock.lock();
try {
BeanDescriptor<?> desc = rootDesc;
if (path != null) {
ElPropertyValue elGetValue = rootDesc.elGetValue(path);
if (elGetValue == null) {
logger.log(WARNING, "AutoTune: Can't find join for path[" + path + "] for " + rootDesc.name());
return;
} else {
BeanProperty beanProperty = elGetValue.beanProperty();
if (beanProperty instanceof BeanPropertyAssoc<?>) {
desc = ((BeanPropertyAssoc<?>) beanProperty).targetDescriptor();
}
}
}
BeanProperty toOneIdProperty = null;
boolean addedToPath = false;
for (String propName : aggregateUsed) {
BeanProperty beanProp = desc.findPropertyFromPath(propName);
if (beanProp == null) {
logger.log(WARNING, "AutoTune: Can't find property[" + propName + "] for " + desc.name());
} else {
if (beanProp.isId()) {
// remember and maybe add ToOne property to parent path
toOneIdProperty = beanProp;
} else if (beanProp instanceof BeanPropertyAssoc<?>) {
// intentionally skip
} else {
//noinspection StatementWithEmptyBody
if (beanProp.isLob() && !beanProp.isFetchEager()) {
// AutoTune will not include Lob's marked FetchLazy
// (which is the default for Lob's so typical).
} else {
addedToPath = true;
pathProps.addToPath(path, beanProp.name());
}
}
}
}
if ((modified || addVersionProperty) && desc != null) {
BeanProperty versionProp = desc.versionProperty();
if (versionProp != null) {
addedToPath = true;
pathProps.addToPath(path, versionProp.name());
}
}
if (toOneIdProperty != null && !addedToPath) {
// add ToOne property to parent path
ElPropertyValue assocOne = rootDesc.elGetValue(path);
pathProps.addToPath(SplitName.parent(path), assocOne.name());
}
} finally {
lock.unlock();
}
}
/**
* Collect usage from a node.
*/
protected void collectUsageInfo(NodeUsageCollector.State profile) {
lock.lock();
try {
Set<String> used = profile.used();
profileCount++;
if (!used.isEmpty()) {
profileUsedCount++;
aggregateUsed.addAll(used);
}
if (profile.isModified()) {
modified = true;
}
} finally {
lock.unlock();
}
}
@Override
public String toString() {
return "path[" + path + "] profileCount[" + profileCount + "] used[" + profileUsedCount + "] props" + aggregateUsed;
}
}
@@ -1,41 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import java.io.Serializable;
import java.util.concurrent.atomic.LongAdder;
/**
* Used to accumulate query execution statistics for paths relative to the origin query.
*/
public class ProfileOriginQuery implements Serializable {
private static final long serialVersionUID = -1133958958072778811L;
private final String path;
private final LongAdder exeCount = new LongAdder();
private final LongAdder totalBeanLoaded = new LongAdder();
private final LongAdder totalMicros = new LongAdder();
public ProfileOriginQuery(String path) {
this.path = path;
}
public void add(long beansLoaded, long micros) {
exeCount.increment();
totalBeanLoaded.add(beansLoaded);
totalMicros.add(micros);
}
public AutoTuneCollection.EntryQuery createEntryQuery(boolean reset) {
if (reset) {
return new AutoTuneCollection.EntryQuery(path, exeCount.sumThenReset(), totalBeanLoaded.sumThenReset(), totalMicros.sumThenReset());
} else {
return new AutoTuneCollection.EntryQuery(path, exeCount.sum(), totalBeanLoaded.sum(), totalMicros.sum());
}
}
}
@@ -1,70 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.autotune.model.ProfileDiff;
import io.ebeaninternal.server.autotune.model.ProfileEmpty;
import io.ebeaninternal.server.autotune.model.ProfileNew;
import java.util.Comparator;
import java.util.List;
/**
* Sorts Autotune document by
*/
public class SortAutoTuneDocument {
/**
* Set the diff and new entries by bean type followed by key.
*/
public static void sort(Autotune document) {
ProfileDiff profileDiff = document.getProfileDiff();
if (profileDiff != null) {
profileDiff.getOrigin().sort(NAME_KEY_SORT);
}
ProfileNew profileNew = document.getProfileNew();
if (profileNew != null) {
profileNew.getOrigin().sort(NAME_KEY_SORT);
}
ProfileEmpty profileEmpty = document.getProfileEmpty();
if (profileEmpty != null) {
profileEmpty.getOrigin().sort(KEY_SORT);
}
List<Origin> origins = document.getOrigin();
if (!origins.isEmpty()) {
origins.sort(NAME_KEY_SORT);
}
}
private static final OriginNameKeySort NAME_KEY_SORT = new OriginNameKeySort();
private static final OriginKeySort KEY_SORT = new OriginKeySort();
/**
* Comparator sort by bean type then key.
*/
private static class OriginNameKeySort implements Comparator<Origin> {
@Override
public int compare(Origin o1, Origin o2) {
int comp = o1.getBeanType().compareTo(o2.getBeanType());
if (comp == 0) {
comp = o1.getKey().compareTo(o2.getKey());
}
return comp;
}
}
/**
* Comparator sort by bean type then key.
*/
private static class OriginKeySort implements Comparator<Origin> {
@Override
public int compare(Origin o1, Origin o2) {
return o1.getKey().compareTo(o2.getKey());
}
}
}
@@ -1,71 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.api.SpiQuery;
import io.ebeaninternal.server.autotune.model.Origin;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import io.ebeaninternal.server.querydefn.OrmQueryDetailParser;
import java.io.Serializable;
/**
* Holds tuned query information. Is immutable so this represents the tuning at
* a given point in time.
*/
public class TunedQueryInfo implements Serializable {
private static final long serialVersionUID = 8661702592481810396L;
private final Origin origin;
private final OrmQueryDetail tunedDetail;
public TunedQueryInfo(Origin origin) {
this.origin = origin;
this.tunedDetail = new OrmQueryDetailParser(origin.getDetail()).parse();
}
/**
* Return the origin entry (includes call stack and bean type).
*/
public Origin getOrigin() {
return origin;
}
/**
* Return the tuned detail (for comparison with profiling information).
*/
public OrmQueryDetail getTunedDetail() {
return tunedDetail;
}
/**
* Tune the query by replacing its OrmQueryDetail with a tuned one.
*
* @return true if the query was tuned, otherwise false.
*/
public boolean tuneQuery(SpiQuery<?> query) {
if (tunedDetail == null) {
return false;
}
boolean tuned;
if (query.isDetailEmpty()) {
tuned = true;
// tune by 'replacement'
query.setDetail(tunedDetail.copy());
} else {
// tune by 'addition'
tuned = query.tuneFetchProperties(tunedDetail);
}
if (tuned) {
query.setAutoTuned(true);
}
return tuned;
}
@Override
public String toString() {
return tunedDetail.asString();
}
}
@@ -1,15 +0,0 @@
import io.ebeaninternal.server.autotune.AutoTuneServiceProvider;
import io.ebeaninternal.server.autotune.service.AutoTuneServiceFactory;
/**
* Provider of AutoTuneServiceProvider
*/
module io.ebean.autotune {
provides AutoTuneServiceProvider with AutoTuneServiceFactory;
requires io.ebean.api;
requires io.ebean.core;
requires java.xml;
requires java.xml.bind;
}
@@ -1 +0,0 @@
io.ebeaninternal.server.autotune.service.AutoTuneServiceFactory
@@ -1,55 +0,0 @@
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://ebean-orm.github.io/xml/ns/autotune"
targetNamespace="http://ebean-orm.github.io/xml/ns/autotune" elementFormDefault="qualified">
<!-- Root level type : profiling -->
<xsd:element name="autotune">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="origin" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="profileDiff" minOccurs="0" maxOccurs="1"/>
<xsd:element ref="profileNew" minOccurs="0" maxOccurs="1"/>
<xsd:element ref="profileEmpty" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="origin">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="callStack" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="key" type="xsd:string" use="required"/>
<xsd:attribute name="beanType" type="xsd:string"/>
<xsd:attribute name="detail" type="xsd:string"/>
<xsd:attribute name="original" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="profileDiff">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="origin" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="profileNew">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="origin" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="profileEmpty">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="origin" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
@@ -1,31 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebeaninternal.server.autotune.model.Autotune;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.InputStream;
import static org.assertj.core.api.Assertions.assertThat;
public class AutoTuneXmlReaderTest {
@Test
public void read_file() {
File testFile = new File("src/test/resources/autotune/test-autotune.xml");
Autotune tuneInfo = AutoTuneXmlReader.read(testFile);
assertThat(tuneInfo.getOrigin()).isNotEmpty();
}
@Test
public void read_inputStream() {
InputStream is = getClass().getResourceAsStream("/autotune/test-autotune.xml");
Autotune tuneInfo = AutoTuneXmlReader.read(is);
assertThat(tuneInfo.getOrigin()).isNotEmpty();
}
}
@@ -1,149 +0,0 @@
package io.ebeaninternal.server.autotune.service;
import io.ebean.bean.NodeUsageCollector;
import io.ebean.bean.NodeUsageListener;
import io.ebean.bean.ObjectGraphNode;
import io.ebean.bean.ObjectGraphOrigin;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.querydefn.OrmQueryDetail;
import org.junit.jupiter.api.Test;
import org.tests.autofetch.BaseTestCase;
import org.tests.model.basic.Order;
import static org.assertj.core.api.Assertions.assertThat;
public class ProfileOriginTest extends BaseTestCase {
static class Noop implements NodeUsageListener {
@Override
public void collectNodeUsage(NodeUsageCollector.State state) {
// do nothing
}
}
private final NodeUsageListener listener = new Noop();
private final BeanDescriptor<Order> desc = getBeanDescriptor(Order.class);
@Test
public void buildDetail() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
c.addUsed("name");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c.state());
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString().trim()).isEqualTo("fetch customer (name)");
}
@Test
public void buildDetail_selectFetch() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
c.addUsed("name");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c.state());
c = node(null);
c.addUsed("orderDate");
po.collectUsageInfo(c.state());
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("select (orderDate) fetch customer (name)");
}
@Test
public void buildDetail_expect_mergeFetchToSelect() {
NodeUsageCollector c = node("customer");
c.addUsed("id");
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
po.collectUsageInfo(c.state());
c = node(null);
c.addUsed("orderDate");
po.collectUsageInfo(c.state());
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString().trim()).isEqualTo("select (orderDate,customer)");
}
@Test
public void buildDetail_expect_mergeFetchToParentFetch() {
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
NodeUsageCollector c = node(null);
c.addUsed("orderDate");
c.addUsed("customer");
po.collectUsageInfo(c.state());
c = node("customer");
c.addUsed("billingAddress");
po.collectUsageInfo(c.state());
c = node("customer.billingAddress");
c.addUsed("id");
po.collectUsageInfo(c.state());
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("select (orderDate) fetch customer (billingAddress)");
}
@Test
public void buildDetail_expect_mergeMulit() {
ProfileOrigin po = new ProfileOrigin(null, false, 1, 1);
//fetch details (id,orderQty,shipQty,unitPrice)
NodeUsageCollector c = node(null);
c.addUsed("customer");
po.collectUsageInfo(c.state());
c = node("customer");
c.addUsed("id");
c.addUsed("name");
c.addUsed("note");
c.addUsed("billingAddress");
po.collectUsageInfo(c.state());
//fetch details.product (id,name)
c = node("customer.billingAddress");
c.addUsed("id");
c.addUsed("line1");
po.collectUsageInfo(c.state());
OrmQueryDetail detail = po.buildDetail(desc);
assertThat(detail.asString()).isEqualTo("fetch customer (name,note) fetch customer.billingAddress (line1)");
}
private NodeUsageCollector node(String path) {
ObjectGraphNode node = new ObjectGraphNode((ObjectGraphOrigin)null, path);
return new NodeUsageCollector(node, listener);
}
// @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();
//
// }
}
@@ -1,16 +0,0 @@
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 <T> BeanDescriptor<T> getBeanDescriptor(Class<T> cls) {
return spiEbeanServer().descriptor(cls);
}
}
@@ -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<EBasicClob> 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();
// }
//
//
// }
}
@@ -1,37 +0,0 @@
package org.tests.autofetch;
import io.ebean.DB;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Order;
import java.util.List;
public class MainAutoQueryTune1 {
public static void main(String[] args) {
MainAutoQueryTune1 me = new MainAutoQueryTune1();
me.tuneJoin();
}
@Test
void tuneJoin() {
TestData.load();
List<Order> list = DB.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();
order.getCustomer().getName();
order.getCustomer().getNote();
}
}
}
@@ -1,25 +0,0 @@
package org.tests.autofetch;
import io.ebean.DB;
import org.tests.model.basic.Address;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import java.time.LocalDate;
public class TestData {
static void load() {
if (DB.find(Order.class).findCount() > 0) {
return;
}
var customer = new Customer("Rob");
customer.setBillingAddress(new Address("l0", "city0"));
DB.save(customer);
var order = new Order(customer);
order.setOrderDate(LocalDate.now());
DB.save(order);
}
}
@@ -1,172 +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.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<Order> 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<String> 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<Order> 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<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
// Assert.assertNotNull(loadedPropertyNames);
//
// // invoke lazy loading
// order.getCustomer();
//
// List<String> 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<Order> 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<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
// Assert.assertNotNull(loadedPropertyNames);
//
// Assert.assertTrue(loadedPropertyNames.contains("status"));
// Assert.assertTrue(loadedPropertyNames.contains("customer"));
//
// // no lazy loading expected here
// order.getCustomer();
//
// List<String> 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<Order> 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<String> loadedPropertyNames = ebi.getLoadedPropertyNames();
// Assert.assertNotNull(loadedPropertyNames);
//
// Assert.assertTrue(loadedPropertyNames.contains("status"));
// Assert.assertFalse(loadedPropertyNames.contains("customer"));
//
// // no lazy loading expected here
// order.getCustomer();
//
// List<String> loggedSql = LoggedSqlCollector.stop();
// Assert.assertEquals(2, loggedSql.size());
// }
}
@@ -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<Customer> 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<String> 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<String> loggedSql = LoggedSqlCollector.stop();
// Assert.assertEquals(1, loggedSql.size());
//
// Ebean.delete(newCustomer);
// }
}
@@ -1,42 +0,0 @@
package org.tests.model.basic;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "o_address")
public class Address extends BaseModel {
String line1;
String line2;
String city;
public Address(String line1, String city) {
this.line1 = line1;
this.city = 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;
}
}
@@ -1,58 +0,0 @@
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;
}
}
@@ -1,48 +0,0 @@
package org.tests.model.basic;
import io.ebean.annotation.NotNull;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "o_customer")
public class Customer extends BaseModel {
@NotNull String name;
String note;
@ManyToOne(cascade = CascadeType.PERSIST)
Address billingAddress;
public Customer(String name) {
this.name = name;
}
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;
}
}
@@ -1,50 +0,0 @@
package org.tests.model.basic;
import javax.persistence.*;
import java.time.LocalDate;
@Entity
@Table(name = "o_order")
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)
final Customer customer;
public Order(Customer customer) {
this.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;
}
}
@@ -1,17 +0,0 @@
ebean.ddl.generate=true
ebean.ddl.run=true
datasource.default=h2
datasource.h2.username=sa
datasource.h2.password=
datasource.h2.url=jdbc:h2:mem:h2AutoTune
datasource.pg.username=sa
datasource.pg.password=
datasource.pg.url=jdbc:h2:mem:h2AutoTune
ebean.autoTune.profiling=true
ebean.maxCallStack=10
ebean.autoTune.queryTuning=true
ebean.autoTune.queryTuningFile=autotune/my-autotune.xml
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<autotune xmlns="http://ebean-orm.github.io/xml/ns/autotune">
<origin key="BmouL7.Bn_jgL.BNY1QD" beanType="org.tests.model.basic.Order" detail="select (orderDate) fetch customer (name,note)" original="">
<callStack>org.tests.autofetch.MainAutoQueryTune1.tuneJoin(MainAutoQueryTune1.java:27)
org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)</callStack>
</origin>
</autotune>
@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<autotune xmlns="http://ebean-orm.github.io/xml/ns/autotune">
<origin key="DWeHD4.B0dP9Z.DKG8lq" beanType="org.tests.model.basic.Order" detail="select (status,shipDate) " original="select (status, orderDate, shipDate) ">
<callStack>org.tests.query.autotune.TestAutoTuneProfiling.findById(TestAutoTuneProfiling.java:62)
org.tests.query.autotune.TestAutoTuneProfiling.useOrderDate(TestAutoTuneProfiling.java:66)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:52)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
</callStack>
</origin>
<origin key="DWeHD4.BZfmOY.Yd8Hf" beanType="org.tests.model.basic.Order" detail=" fetch customer (id) fetch details (orderQty,shipQty,unitPrice) fetch details.product (id,name) " original="select (id) fetch details ">
<callStack>org.tests.query.autotune.TestAutoTuneProfiling.useLotUntuned(TestAutoTuneProfiling.java:95)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:55)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
</callStack>
</origin>
<origin key="DWeHD4.l6b4M.BYWlSr" beanType="org.tests.model.basic.Order" detail=" fetch customer (name) " original="">
<callStack>org.tests.model.basic.Order._ebean_get_customer(Order.java:6)
org.tests.model.basic.Order.getCustomer(Order.java:228)
org.tests.query.autotune.TestAutoTuneProfiling.useOrderDateCustomerName(TestAutoTuneProfiling.java:74)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:53)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:25)
</callStack>
</origin>
<origin key="DVf2Cn.StLsZ.BCru36" beanType="org.tests.model.basic.OrderDetail" detail=" fetch product (name) " original="">
<callStack>org.tests.model.basic.OrderDetail._ebean_get_product(OrderDetail.java:6)
org.tests.model.basic.OrderDetail.getProduct(OrderDetail.java:150)
org.tests.query.autotune.TestAutoTuneProfiling.useLotUntuned(TestAutoTuneProfiling.java:96)
org.tests.query.autotune.TestAutoTuneProfiling.execute(TestAutoTuneProfiling.java:55)
org.tests.query.autotune.TestAutoTuneProfiling.test(TestAutoTuneProfiling.java:32)
</callStack>
</origin>
</autotune>
@@ -1,22 +0,0 @@
<configuration scan="true" scanPeriod="10 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
<logger name="io.ebeaninternal" level="DEBUG"/>
<logger name="io.ebean.docker" level="TRACE"/>
<!-- <logger name="io.ebean.DDL" level="DEBUG"/>-->
<logger name="io.ebean.SQL" level="TRACE"/>
<!-- <logger name="io.ebean.TXN" level="TRACE"/>-->
<logger name="io.ebean.SUM" level="TRACE"/>
</configuration>
+30 -30
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<name>ebean bom</name>
@@ -89,112 +89,112 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-joda-time</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-jsonnode</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-mapper</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-xml</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-autotune</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>kotlin-querybean-generator</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-postgis</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-redis</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-spring-txn</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<!-- platforms -->
@@ -202,67 +202,67 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-clickhouse</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-db2</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-h2</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-hana</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-mariadb</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-mysql</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-nuodb</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-oracle</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-postgres</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-sqlite</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-sqlserver</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+2 -2
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<artifactId>ebean-core-type</artifactId>
@@ -16,7 +16,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
+23 -9
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.17.3</version>
<version>13.19.0</version>
</parent>
<artifactId>ebean-core</artifactId>
@@ -22,7 +22,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -46,13 +46,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.17.3</version>
<version>13.18.0</version>
</dependency>
<dependency>
@@ -81,12 +81,28 @@
<scope>provided</scope>
</dependency>
<!-- JAVAX-DEPENDENCY-START -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.3</version>
<optional>true</optional>
</dependency>
<!-- JAVAX-DEPENDENCY-END -->
<!-- JAKARTA-DEPENDENCY-START ___
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.enterprise</groupId>
<artifactId>jakarta.enterprise.cdi-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
____ JAKARTA-DEPENDENCY-END -->
<!-- validation annotations Size etc -->
<dependency>
@@ -143,21 +159,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.17.3</version>
<version>13.19.0</version>
<scope>test</scope>
</dependency>
@@ -201,7 +217,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
<trimStackTrace>false</trimStackTrace>
@@ -229,7 +244,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<doctitle>Ebean 12</doctitle>
<overview>src/main/java/io/ebean/overview.html</overview>
@@ -40,14 +40,14 @@ public final class BeanCacheResult<T> {
/**
* Return the natural key or id value.
*/
public Object getKey() {
public Object key() {
return key;
}
/**
* Return the bean.
*/
public T getBean() {
public T bean() {
return bean;
}
}
@@ -1,46 +0,0 @@
package io.ebeaninternal.api;
import java.util.List;
/**
* Wrapper of the list of Id's.
*/
public class BeanIdList {
private final List<Object> idList;
private boolean hasMore;
public BeanIdList(List<Object> idList) {
this.idList = idList;
}
/**
* Add an Id to the list.
*/
public void add(Object id) {
idList.add(id);
}
/**
* Return the list of Id's.
*/
public List<Object> getIdList() {
return idList;
}
/**
* Return true if max rows was hit and there is more rows to fetch.
*/
public boolean isHasMore() {
return hasMore;
}
/**
* Set to true when max rows is hit and there are more rows to fetch.
*/
public void setHasMore(boolean hasMore) {
this.hasMore = hasMore;
}
}
@@ -107,13 +107,13 @@ public final class BindParams implements Serializable {
/**
* Return a Natural Key bind param if supported.
*/
public NaturalKeyBindParam getNaturalKeyBindParam() {
public NaturalKeyBindParam naturalKeyBindParam() {
if (!positionedParameters.isEmpty()) {
return null;
}
if (namedParameters.size() == 1) {
Entry<String, Param> e = namedParameters.entrySet().iterator().next();
return new NaturalKeyBindParam(e.getKey(), e.getValue().getInValue());
return new NaturalKeyBindParam(e.getKey(), e.getValue().inValue());
}
return null;
}
@@ -135,7 +135,7 @@ public final class BindParams implements Serializable {
* Set a null parameter using position.
*/
public void setNullParameter(int position, int jdbcType) {
Param p = getParam(position);
Param p = parameter(position);
p.setInNullType(jdbcType);
}
@@ -143,7 +143,7 @@ public final class BindParams implements Serializable {
* Set an In Out parameter using position.
*/
public void setParameter(int position, Object value, int outType) {
Param p = getParam(position);
Param p = parameter(position);
p.setInValue(value);
p.setOutType(outType);
}
@@ -168,7 +168,7 @@ public final class BindParams implements Serializable {
@SuppressWarnings("rawtypes")
public void setParameter(int position, Object value) {
//TODO: Review - assert value != null : "use setNullParameter";
Param p = getParam(position);
Param p = parameter(position);
if (value instanceof Collection) {
// use of postgres ANY with positioned parameter
value = new MultiValueWrapper((Collection)value);
@@ -180,15 +180,21 @@ public final class BindParams implements Serializable {
* Register the parameter as an Out parameter using position.
*/
public void registerOut(int position, int outType) {
Param p = getParam(position);
Param p = parameter(position);
p.setOutType(outType);
}
private Param getParam(String name) {
/**
* Return the named parameter.
*/
public Param parameter(String name) {
return namedParameters.computeIfAbsent(name, k -> new Param());
}
private Param getParam(int position) {
/**
* Return the Parameter for a given position.
*/
public Param parameter(int position) {
int more = position - positionedParameters.size();
if (more > 0) {
for (int i = 0; i < more; i++) {
@@ -202,7 +208,7 @@ public final class BindParams implements Serializable {
* Set a named In Out parameter.
*/
public void setParameter(String name, Object value, int outType) {
Param p = getParam(name);
Param p = parameter(name);
p.setInValue(value);
p.setOutType(outType);
}
@@ -211,7 +217,7 @@ public final class BindParams implements Serializable {
* Set a named In parameter that is null.
*/
public void setNullParameter(String name, int jdbcType) {
Param p = getParam(name);
Param p = parameter(name);
p.setInNullType(jdbcType);
}
@@ -220,7 +226,7 @@ public final class BindParams implements Serializable {
*/
public Param setParameter(String name, Object value) {
// TODO: Review - assert value != null : "use setNullParameter";
Param p = getParam(name);
Param p = parameter(name);
p.setInValue(value);
return p;
}
@@ -229,7 +235,7 @@ public final class BindParams implements Serializable {
* Set a named In parameter that is multi-valued.
*/
public void setArrayParameter(String name, Collection<?> value) {
Param p = getParam(name);
Param p = parameter(name);
p.setInValue(new MultiValueWrapper(value));
}
@@ -240,7 +246,7 @@ public final class BindParams implements Serializable {
* </p>
*/
public Param setEncryptionKey(String name, Object value) {
Param p = getParam(name);
Param p = parameter(name);
p.setEncryptionKey(value);
return p;
}
@@ -249,25 +255,10 @@ public final class BindParams implements Serializable {
* Register the named parameter as an Out parameter.
*/
public void registerOut(String name, int outType) {
Param p = getParam(name);
Param p = parameter(name);
p.setOutType(outType);
}
/**
* Return the Parameter for a given position.
*/
public Param getParameter(int position) {
// Used to read Out value by CallableSql
return getParam(position);
}
/**
* Return the named parameter.
*/
public Param getParameter(String name) {
return getParam(name);
}
/**
* Return the values of ordered parameters.
*/
@@ -286,7 +277,7 @@ public final class BindParams implements Serializable {
* Return the sql with ? place holders (named parameters have been processed
* and ordered).
*/
public String getPreparedSql() {
public String preparedSql() {
return preparedSql;
}
@@ -457,7 +448,7 @@ public final class BindParams implements Serializable {
* Return the jdbc type of this parameter. Used for registering Out
* parameters and setting NULL In parameters.
*/
public int getType() {
public int type() {
return type;
}
@@ -500,7 +491,7 @@ public final class BindParams implements Serializable {
* Return the OUT value that was retrieved. This value is set after
* CallableStatement was executed.
*/
public Object getOutValue() {
public Object outValue() {
return outValue;
}
@@ -508,7 +499,7 @@ public final class BindParams implements Serializable {
* Return the In value. If this is null, then the type should be used to
* specify the type of the null.
*/
public Object getInValue() {
public Object inValue() {
return inValue;
}
@@ -37,8 +37,8 @@ public final class CacheIdLookupMany<T> implements CacheIdLookup<T> {
Set<Object> hitIds = new HashSet<>();
List<T> beans = new ArrayList<>();
for (BeanCacheResult.Entry<T> hit : cacheResult.hits()) {
hitIds.add(hit.getKey());
beans.add(hit.getBean());
hitIds.add(hit.key());
beans.add(hit.bean());
}
this.remaining = idInExpression.removeIds(hitIds);
return beans;
@@ -26,7 +26,7 @@ public final class CacheIdLookupSingle<T> implements CacheIdLookup<T> {
final List<BeanCacheResult.Entry<T>> hits = cacheResult.hits();
if (hits.size() == 1) {
found = true;
return Collections.singletonList(hits.get(0).getBean());
return Collections.singletonList(hits.get(0).bean());
}
return Collections.emptyList();
}
@@ -31,14 +31,14 @@ public final class ExtraMetrics {
/**
* Timed metric for bind capture used with query plan collection.
*/
public TimedMetric getBindCapture() {
public TimedMetric bindCapture() {
return bindCapture;
}
/**
* Timed metric for query plan collection.
*/
public TimedMetric getPlanCollect() {
public TimedMetric planCollect() {
return planCollect;
}
@@ -6,7 +6,11 @@ import io.ebeaninternal.api.SpiQuery.Mode;
import io.ebeaninternal.server.core.OrmQueryRequest;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import java.util.*;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static java.lang.System.Logger.Level.DEBUG;
@@ -21,6 +25,9 @@ public final class LoadBeanRequest extends LoadRequest {
private final boolean loadCache;
private final boolean alreadyLoaded;
private String triggerEbi;
private String batchBefore;
private List<Object> queryIds;
/**
* Construct for lazy load request.
*/
@@ -56,17 +63,19 @@ public final class LoadBeanRequest extends LoadRequest {
}
/**
* Return the batch of beans to actually load.
* Return true if the batch is empty.
*/
public Set<EntityBeanIntercept> batch() {
public boolean checkEmpty() {
loadBuffer.loadingStarted();
return batch;
batchBefore = String.valueOf(batch);
queryIds = ids();
return batch.isEmpty();
}
/**
* Return the list of Id values for the beans in the lazy load buffer.
*/
public List<Object> ids() {
private List<Object> ids() {
final List<Object> idList = new ArrayList<>(batch.size());
final BeanDescriptor<?> desc = loadBuffer.descriptor();
for (EntityBeanIntercept ebi : batch) {
@@ -78,7 +87,7 @@ public final class LoadBeanRequest extends LoadRequest {
/**
* Configure the query for lazy loading execution.
*/
public void configureQuery(SpiQuery<?> query, List<Object> idList) {
public void configureQuery(SpiQuery<?> query) {
query.setMode(Mode.LAZYLOAD_BEAN);
query.setPersistenceContext(loadBuffer.persistenceContext());
query.setLoadDescription(mode(), description());
@@ -94,10 +103,10 @@ public final class LoadBeanRequest extends LoadRequest {
if (loadCache) {
query.setBeanCacheMode(CacheMode.PUT);
}
if (idList.size() == 1) {
query.where().idEq(idList.get(0));
if (queryIds.size() == 1) {
query.where().idEq(queryIds.get(0));
} else {
query.where().idIn(idList);
query.where().idIn(queryIds);
}
}
@@ -108,7 +117,7 @@ public final class LoadBeanRequest extends LoadRequest {
/**
* Load the beans into the L2 cache if that is requested and check for load failures due to deletes.
*/
public Result postLoad(List<?> list, List<Object> queryIds) {
public void postLoad(List<?> list) {
loadBuffer.loadingStopped();
Set<Object> loadedIds = new HashSet<>();
BeanDescriptor<?> desc = loadBuffer.descriptor();
@@ -137,42 +146,16 @@ public final class LoadBeanRequest extends LoadRequest {
}
}
if (!missed.isEmpty()) {
CoreLog.markedAsDeleted.log(DEBUG, "Loaded bean batch triggered by ebi:{0} property:{1}", triggerEbi, lazyLoadProperty);
if (CoreLog.markedAsDeleted.isLoggable(DEBUG)) {
CoreLog.markedAsDeleted.log(DEBUG, "Loaded bean batch triggered by ebi:{0} property:{1}", triggerEbi, lazyLoadProperty);
CoreLog.markedAsDeleted.log(DEBUG, "Loaded bean batch BEFORE {0}", batchBefore);
CoreLog.markedAsDeleted.log(DEBUG, "Loaded bean batch AFTER {0}", batch);
String msg = MessageFormat.format("Bean added to batch during load for {0} missedIds:{1} queryIds:{2} missed:{3}",
beanType(), missedIds, queryIds, missed);
CoreLog.markedAsDeleted.log(DEBUG, msg, new RuntimeException("LoadBeanRequest - Bean added to batch during load"));
}
}
}
return new Result(loadedIds, missedIds, missed);
}
return EMPTY_RESULT;
}
static final Result EMPTY_RESULT = new Result(Collections.emptySet(),Collections.emptySet(), Collections.emptyList());
public static class Result {
private final Set<Object> loadedIds;
private final Set<Object> missedIds;
private final List<EntityBeanIntercept> missed;
Result(Set<Object> loadedIds, Set<Object> missedIds, List<EntityBeanIntercept> missed) {
this.loadedIds = loadedIds;
this.missedIds = missedIds;
this.missed = missed;
}
public boolean hasMisses() {
return !missedIds.isEmpty();
}
public Set<Object> missedIds() {
return missedIds;
}
public Set<Object> loadedIds() {
return loadedIds;
}
public List<EntityBeanIntercept> missed() {
return missed;
}
}
}
@@ -90,7 +90,7 @@ public final class LoadManyRequest extends LoadRequest {
SpiQuery<?> query = many.newQuery(server);
String orderBy = many.lazyFetchOrderBy();
if (orderBy != null) {
query.order(orderBy);
query.orderBy(orderBy);
}
String extraWhere = many.extraWhere();
if (extraWhere != null) {
@@ -45,6 +45,6 @@ public abstract class LoadRequest {
* So one of - findIterate(), findEach(), findEachWhile() or findVisit().
*/
public boolean isParentFindIterate() {
return parentRequest != null && parentRequest.query().getType() == SpiQuery.Type.ITERATE;
return parentRequest != null && parentRequest.query().type() == SpiQuery.Type.ITERATE;
}
}
@@ -102,17 +102,17 @@ public final class ManyWhereJoins implements Serializable {
/**
* Return the set of many where joins.
*/
public Collection<PropertyJoin> getPropertyJoins() {
public Collection<PropertyJoin> propertyJoins() {
return joins.values();
}
/**
* Return the set of property names for the many where joins.
*/
public TreeSet<String> getPropertyNames() {
public TreeSet<String> propertyNames() {
TreeSet<String> propertyNames = new TreeSet<>();
for (PropertyJoin join : joins.values()) {
propertyNames.add(join.getProperty());
propertyNames.add(join.property());
}
return propertyNames;
}
@@ -138,7 +138,7 @@ public final class ManyWhereJoins implements Serializable {
/**
* Return the formula properties to build the select clause for a findCount query.
*/
public List<String> getFormulaJoinProperties(String prefix) {
public List<String> formulaJoinProperties(String prefix) {
return formulaJoinProperties.get(prefix);
}
@@ -13,5 +13,5 @@ public interface NaturalKeyEntry {
/**
* Return the inValue (used to remove from IN clause of original query).
*/
Object getInValue();
Object inValue();
}
@@ -67,7 +67,7 @@ final class NaturalKeyEntryBasic implements NaturalKeyEntry {
}
@Override
public Object getInValue() {
public Object inValue() {
return inValue;
}
}
@@ -16,7 +16,7 @@ final class NaturalKeyEntrySimple implements NaturalKeyEntry {
}
@Override
public Object getInValue() {
public Object inValue() {
return val;
}
}
@@ -189,14 +189,13 @@ public final class NaturalKeyQueryData<T> {
* Adjust the IN clause removing the hit entry.
*/
public List<T> removeHits(BeanCacheResult<T> cacheResult) {
List<BeanCacheResult.Entry<T>> hits = cacheResult.hits();
this.hitCount = hits.size();
List<T> beans = new ArrayList<>(hitCount);
for (BeanCacheResult.Entry<T> hit : hits) {
removeKey(set.getInValue(hit.getKey()));
beans.add(hit.getBean());
removeKey(set.inValue(hit.key()));
beans.add(hit.bean());
}
return beans;
}
@@ -23,7 +23,7 @@ public final class NaturalKeySet {
return map.keySet();
}
Object getInValue(Object naturalKey) {
return map.get(naturalKey).getInValue();
Object inValue(Object naturalKey) {
return map.get(naturalKey).inValue();
}
}
@@ -18,14 +18,14 @@ public final class PropertyJoin {
/**
* Return the property that should be joined.
*/
public String getProperty() {
public String property() {
return property;
}
/**
* Return true if this join is required to be an outer join.
*/
public SqlJoinType getSqlJoinType() {
public SqlJoinType sqlJoinType() {
return joinType;
}
@@ -4,7 +4,7 @@ import io.ebean.CallableSql;
public interface SpiCallableSql extends CallableSql {
BindParams getBindParams();
BindParams bindParams();
TransactionEventTable getTransactionEventTable();
TransactionEventTable transactionEventTable();
}
@@ -2,14 +2,16 @@ package io.ebeaninternal.api;
import io.ebean.meta.MetaQueryPlan;
import java.time.Instant;
/**
* Internal database query plan being capture.
*/
public interface SpiDbQueryPlan extends MetaQueryPlan {
/**
* Extend with queryTimeMicros and captureCount.
* Extend with queryTimeMicros, captureCount, captureMicros and when the bind values were captured.
*/
SpiDbQueryPlan with(long queryTimeMicros, long captureCount);
SpiDbQueryPlan with(long queryTimeMicros, long captureCount, long captureMicros, Instant whenCaptured);
}
@@ -19,7 +19,7 @@ public interface SpiDtoQuery<T> extends DtoQuery<T>, SpiSqlBinding {
/**
* Get the query plan for the cache.
*/
DtoQueryPlan getQueryPlan(Object planKey);
DtoQueryPlan queryPlan(Object planKey);
/**
* Build the query plan.
@@ -39,7 +39,7 @@ public interface SpiDtoQuery<T> extends DtoQuery<T>, SpiSqlBinding {
/**
* Return the label with fallback to profile location label.
*/
String getPlanLabel();
String planLabel();
/**
* Obtain the location if necessary.
@@ -49,21 +49,21 @@ public interface SpiDtoQuery<T> extends DtoQuery<T>, SpiSqlBinding {
/**
* Return the profile location.
*/
ProfileLocation getProfileLocation();
ProfileLocation profileLocation();
/**
* Return the associated DTO bean type.
*/
Class<T> getType();
Class<T> type();
/**
* Return an underlying ORM query (if this query is built from an ORM query).
*/
SpiQuery<?> getOrmQuery();
SpiQuery<?> ormQuery();
/**
* Return the explicit transaction used to execute the query.
*/
Transaction getTransaction();
Transaction transaction();
}
@@ -1,5 +1,6 @@
package io.ebeaninternal.api;
import io.avaje.lang.Nullable;
import io.ebean.*;
import io.ebean.bean.BeanCollectionLoader;
import io.ebean.bean.CallOrigin;
@@ -14,8 +15,10 @@ import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.query.CQuery;
import io.ebeaninternal.server.transaction.RemoteTransactionEvent;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
@@ -317,4 +320,137 @@ public interface SpiEbeanServer extends SpiServer, ExtendedServer, BeanCollectio
* Create a query bind capture for the given query plan.
*/
SpiQueryBindCapture createQueryBindCapture(SpiQueryPlan queryPlan);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> boolean exists(Query<T> ormQuery, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> int findCount(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<A, T> List<A> findIds(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> QueryIterator<T> findIterate(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> Stream<T> findStream(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> void findEach(Query<T> query, int batch, Consumer<List<T>> consumer, Transaction t);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> List<Version<T>> findVersions(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> List<T> findList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> FutureRowCount<T> findFutureCount(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> FutureIds<T> findFutureIds(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> FutureList<T> findFutureList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> PagedList<T> findPagedList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> Set<T> findSet(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<K, T> Map<K, T> findMap(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<A, T> List<A> findSingleAttributeList(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<A, T> Set<A> findSingleAttributeSet(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Nullable
<T> T findOne(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> Optional<T> findOneOrEmpty(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> int delete(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
<T> int update(Query<T> query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
List<SqlRow> findList(SqlQuery query, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
void findEach(SqlQuery query, Consumer<SqlRow> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction);
/**
* Deprecated migrate to using {@link SqlQuery#usingTransaction(Transaction)}.
*/
@Nullable
SqlRow findOne(SqlQuery query, Transaction transaction);
}
@@ -20,7 +20,7 @@ public interface SpiExpressionList<T> extends ExpressionList<T>, SpiExpression {
/**
* Return the underlying list of expressions.
*/
List<SpiExpression> getUnderlyingList();
List<SpiExpression> underlyingList();
/**
* Return a copy of the ExpressionList with the path trimmed for filterMany() expressions.
@@ -29,7 +29,7 @@ public final class SpiExpressionValidation {
/**
* Return the set of properties considered as having unknown paths.
*/
public Set<String> getUnknownProperties() {
public Set<String> unknownProperties() {
return unknown;
}
@@ -206,7 +206,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
* Return the mode of the query of if null return CURRENT mode.
*/
public static TemporalMode of(SpiQuery<?> query) {
return (query != null) ? query.getTemporalMode() : TemporalMode.CURRENT;
return (query != null) ? query.temporalMode() : TemporalMode.CURRENT;
}
}
@@ -218,22 +218,22 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the id used to identify a particular query for the given bean type.
*/
String getProfileId();
String profileId();
/**
* Return the profile location for this query.
*/
ProfileLocation getProfileLocation();
ProfileLocation profileLocation();
/**
* Return the label set on the query.
*/
String getLabel();
String label();
/**
* Return the label manually set on the query or from the profile location.
*/
String getPlanLabel();
String planLabel();
/**
* Return true if this is a "find by id" query. This includes a check for a single "equal to" expression for the Id.
@@ -258,7 +258,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the unmodified native sql query (with named params etc).
*/
String getNativeSql();
String nativeSql();
/**
* Return the ForUpdate mode.
@@ -269,17 +269,17 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the bean descriptor for this query.
*/
BeanDescriptor<T> getBeanDescriptor();
BeanDescriptor<T> descriptor();
/**
* Return the query plan key.
*/
Object getQueryPlanKey();
Object queryPlanKey();
/**
* Return the RawSql that was set to use for this query.
*/
SpiRawSql getRawSql();
SpiRawSql rawSql();
/**
* Return true if this query should be executed against the doc store.
@@ -298,7 +298,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
* This can be null and in that case use the default scope.
* </p>
*/
PersistenceContextScope getPersistenceContextScope();
PersistenceContextScope persistenceContextScope();
/**
* Return the origin key.
@@ -308,7 +308,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the default lazy load batch size.
*/
int getLazyLoadBatchSize();
int lazyLoadBatchSize();
/**
* Return true if select all properties was used to ensure the property
@@ -339,12 +339,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the query mode.
*/
Mode getMode();
Mode mode();
/**
* Return the Temporal mode for the query.
*/
TemporalMode getTemporalMode();
TemporalMode temporalMode();
/**
* Return true if this is a find versions between query.
@@ -354,12 +354,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the find versions start timestamp.
*/
Timestamp getVersionStart();
Timestamp versionStart();
/**
* Return the find versions end timestamp.
*/
Timestamp getVersionEnd();
Timestamp versionEnd();
/**
* Return true if this is a 'As Of' query.
@@ -408,7 +408,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
void addSoftDeletePredicate(String softDeletePredicate);
List<String> getSoftDeletePredicates();
List<String> softDeletePredicates();
/**
* Bind the named multi-value array parameter which we would use with Postgres ANY.
@@ -431,7 +431,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the type of query (List, Set, Map, Bean, rowCount etc).
*/
Type getType();
Type type();
/**
* Set the query type (List, Set etc).
@@ -441,12 +441,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return a more detailed description of the lazy or query load.
*/
String getLoadDescription();
String loadDescription();
/**
* Return the load mode (+lazy or +query).
*/
String getLoadMode();
String loadMode();
/**
* This becomes a lazy loading query for a many relationship.
@@ -456,7 +456,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the lazy loading 'many' property.
*/
BeanPropertyAssocMany<?> getLazyLoadMany();
BeanPropertyAssocMany<?> lazyLoadMany();
/**
* Set the load mode (+lazy or +query) and the load description.
@@ -476,7 +476,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the joins required to support predicates on the many properties.
*/
ManyWhereJoins getManyWhereJoins();
ManyWhereJoins manyWhereJoins();
/**
* Reset AUTO mode to OFF for findList(). Expect explicit cache use with findList().
@@ -497,7 +497,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return a Natural Key bind parameter if supported by this query.
*/
NaturalKeyBindParam getNaturalKeyBindParam();
NaturalKeyBindParam naturalKeyBindParam();
/**
* Prepare the query for docstore execution with nested paths.
@@ -550,7 +550,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the tenantId to use for lazy loading.
*/
Object getTenantId();
Object tenantId();
/**
* Set the path of the many when +query/+lazy loading query is executed.
@@ -570,7 +570,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
* persistence context).
* </p>
*/
PersistenceContext getPersistenceContext();
PersistenceContext persistenceContext();
/**
* Set an explicit TransactionContext (typically for a refresh query).
@@ -598,7 +598,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
* returned this implies that profiling is turned on for this query (and all
* the objects this query creates).
*/
ProfilingListener getProfilingListener();
ProfilingListener profilingListener();
/**
* This has the effect of turning on profiling for this query.
@@ -632,7 +632,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the property that invoked lazy load.
*/
String getLazyLoadProperty();
String lazyLoadProperty();
/**
* Used to hook back a lazy loading query to the original query (query
@@ -641,7 +641,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
* This will return null or an "original" query.
* </p>
*/
ObjectGraphNode getParentNode();
ObjectGraphNode parentNode();
/**
* Return false when this is a lazy load or refresh query for a bean.
@@ -702,17 +702,17 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Can return null if no expressions where added to the where clause.
*/
SpiExpressionList<T> getWhereExpressions();
SpiExpressionList<T> whereExpressions();
/**
* Can return null if no expressions where added to the having clause.
*/
SpiExpressionList<T> getHavingExpressions();
SpiExpressionList<T> havingExpressions();
/**
* Return the text expressions.
*/
SpiExpressionList<T> getTextExpression();
SpiExpressionList<T> textExpression();
/**
* Returns true if either firstRow or maxRows has been set.
@@ -737,12 +737,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the cache mode for using the bean cache (Get and Put).
*/
CacheMode getUseBeanCache();
CacheMode beanCacheMode();
/**
* Return the cache mode if this query should use/check the query cache.
*/
CacheMode getUseQueryCache();
CacheMode queryCacheMode();
/**
* Return true if the beans returned by this query should be read only.
@@ -752,12 +752,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the query timeout.
*/
int getTimeout();
int timeout();
/**
* Return the bind parameters.
*/
BindParams getBindParams();
BindParams bindParams();
/**
* Return the bind parameters ensuring it is initialised.
@@ -793,12 +793,12 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the query detail.
*/
OrmQueryDetail getDetail();
OrmQueryDetail detail();
/**
* Return the extra join for a M2M lazy load.
*/
TableJoin getM2mIncludeJoin();
TableJoin m2mIncludeJoin();
/**
* Set the extra join for a M2M lazy load.
@@ -808,7 +808,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the property used to specify keys for a map.
*/
String getMapKey();
String mapKey();
/**
* Return the maximum number of rows to return in the query.
@@ -860,7 +860,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the hint for Statement.setFetchSize().
*/
int getBufferFetchSizeHint();
int bufferFetchSizeHint();
/**
* Return true if read auditing is disabled on this query.
@@ -886,17 +886,17 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Read the readEvent for future queries (null otherwise).
*/
ReadEvent getFutureFetchAudit();
ReadEvent futureFetchAudit();
/**
* Return the base table to use if user defined on the query.
*/
String getBaseTable();
String baseTable();
/**
* Return root table alias set by {@link #alias(String)} command.
*/
String getAlias();
String alias();
/**
* Return root table alias with default option.
@@ -911,7 +911,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return the properties for an update query.
*/
OrmUpdateProperties getUpdateProperties();
OrmUpdateProperties updateProperties();
/**
* Simplify nested expression lists where possible.
@@ -921,7 +921,7 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Returns the count distinct order setting.
*/
CountDistinctOrder getCountDistinctOrder();
CountDistinctOrder countDistinctOrder();
/**
* Handles load errors.
@@ -12,10 +12,10 @@ public interface SpiQuerySecondary {
/**
* Return a list of path/properties that are query join loaded.
*/
List<OrmQueryProperties> getQueryJoins();
List<OrmQueryProperties> queryJoins();
/**
* Return the list of path/properties that are lazy loaded.
*/
List<OrmQueryProperties> getLazyJoins();
List<OrmQueryProperties> lazyJoins();
}
@@ -7,12 +7,12 @@ public interface SpiSqlUpdate extends SqlUpdate {
/**
* Return the sql taking into account bind parameter expansion.
*/
String getBaseSql();
String baseSql();
/**
* Return the Bind parameters.
*/
BindParams getBindParams();
BindParams bindParams();
/**
* Set the final sql being executed with named parameters replaced etc.
@@ -25,8 +25,7 @@ public interface SpiTransaction extends Transaction {
/**
* Return the user defined label for the transaction.
*/
String getLabel();
String label();
/**
* Return true if generated SQL and Bind values should be logged to the
@@ -91,12 +90,12 @@ public interface SpiTransaction extends Transaction {
* Returns a String used to identify the transaction. This id is used for
* Transaction logging.
*/
String getId();
String id();
/**
* Return the start timestamp for the transaction (JVM side).
*/
long getStartNanoTime();
long startNanoTime();
/**
* Return true if this transaction has updateAllLoadedProperties set.
@@ -109,7 +108,7 @@ public interface SpiTransaction extends Transaction {
* <p>
* Returning 0 implies to use the system wide default batch size.
*/
DocStoreMode getDocStoreMode();
DocStoreMode docStoreMode();
/**
* Return the batch size to us for ElasticSearch Bulk API calls
@@ -184,7 +183,7 @@ public interface SpiTransaction extends Transaction {
* indexes. On commit the Table modifications this generates is broadcast
* around the cluster (if you have a cluster).
*/
TransactionEvent getEvent();
TransactionEvent event();
/**
* Whether persistCascade is on for save and delete.
@@ -200,7 +199,7 @@ public interface SpiTransaction extends Transaction {
/**
* Return the BatchControl used to batch up persist requests.
*/
BatchControl getBatchControl();
BatchControl batchControl();
/**
* Set the BatchControl used to batch up persist requests. There should only be one
@@ -215,7 +214,7 @@ public interface SpiTransaction extends Transaction {
* later. This is along the lines of 'extended persistence context'
* behaviour.
*/
SpiPersistenceContext getPersistenceContext();
SpiPersistenceContext persistenceContext();
/**
* Set the persistence context to this transaction.
@@ -236,7 +235,7 @@ public interface SpiTransaction extends Transaction {
* that method we can no longer trust the query only status of a
* Transaction.
*/
Connection getInternalConnection();
Connection internalConnection();
/**
* Return true if the manyToMany intersection should be persisted for this particular relationship direction.
@@ -291,7 +290,7 @@ public interface SpiTransaction extends Transaction {
/**
* Return a document store transaction.
*/
DocStoreTransaction getDocStoreTransaction();
DocStoreTransaction docStoreTransaction();
/**
* Set the current Tenant Id.
@@ -301,7 +300,7 @@ public interface SpiTransaction extends Transaction {
/**
* Return the current Tenant Id.
*/
Object getTenantId();
Object tenantId();
/**
* Return the offset time from the start of the transaction.
@@ -331,7 +330,7 @@ public interface SpiTransaction extends Transaction {
/**
* Return the profile location for this transaction.
*/
ProfileLocation getProfileLocation();
ProfileLocation profileLocation();
/**
* Return true when nested transactions should create Savepoints.
@@ -28,8 +28,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public long getStartNanoTime() {
return transaction.getStartNanoTime();
public long startNanoTime() {
return transaction.startNanoTime();
}
@Override
@@ -38,8 +38,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public String getLabel() {
return transaction.getLabel();
public String label() {
return transaction.label();
}
@Override
@@ -98,8 +98,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public ProfileLocation getProfileLocation() {
return transaction.getProfileLocation();
public ProfileLocation profileLocation() {
return transaction.profileLocation();
}
@Override
@@ -108,18 +108,18 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public Object getTenantId() {
return transaction.getTenantId();
public Object tenantId() {
return transaction.tenantId();
}
@Override
public DocStoreTransaction getDocStoreTransaction() {
return transaction.getDocStoreTransaction();
public DocStoreTransaction docStoreTransaction() {
return transaction.docStoreTransaction();
}
@Override
public DocStoreMode getDocStoreMode() {
return transaction.getDocStoreMode();
public DocStoreMode docStoreMode() {
return transaction.docStoreMode();
}
@Override
@@ -214,8 +214,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public String getId() {
return transaction.getId();
public String id() {
return transaction.id();
}
@Override
@@ -359,8 +359,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public TransactionEvent getEvent() {
return transaction.getEvent();
public TransactionEvent event() {
return transaction.event();
}
@Override
@@ -374,8 +374,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public BatchControl getBatchControl() {
return transaction.getBatchControl();
public BatchControl batchControl() {
return transaction.batchControl();
}
@Override
@@ -384,8 +384,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public SpiPersistenceContext getPersistenceContext() {
return transaction.getPersistenceContext();
public SpiPersistenceContext persistenceContext() {
return transaction.persistenceContext();
}
@Override
@@ -394,8 +394,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
}
@Override
public Connection getInternalConnection() {
return transaction.getInternalConnection();
public Connection internalConnection() {
return transaction.internalConnection();
}
@Override

Some files were not shown because too many files have changed in this diff Show More