Compare commits

..
Author SHA1 Message Date
Rob Bygrave c214fe52f0 Bump to 13.7.0 2022-08-09 13:59:43 +12:00
Rob Bygrave 4f57bd3511 Prepare release, set kotlin-querybean-generator used version 2022-08-09 13:53:38 +12:00
Rob Bygrave 82dc2d031a Change EA build to just use EA,GA - remove loom,metropolis,panama 2022-08-09 12:38:04 +12:00
Rob Bygrave a831ee9ac9 Bump to 13.7.0-SNAPSHOT 2022-08-09 12:35:00 +12:00
Rob Bygrave e01b20aecb Bump to 13.7.0-SNAPSHOT 2022-08-09 12:33:44 +12:00
Rob Bygrave 58713c7083 #2770 - Improve test asserts with SqlQuery usingTransaction() 2022-08-09 12:31:36 +12:00
Rob BygraveandGitHub 2df6f2e5fb Merge pull request #2770 from ebean-orm/feature/sqlquery-useTransaction
Add SqlQuery usingTransaction() for consistency and deprecate ExtendedServer API
2022-08-09 11:59:10 +12:00
Rob Bygrave 19724e71db Merge branch 'master' of github.com:ebean-orm/ebean 2022-08-09 11:28:33 +12:00
Rob BygraveandGitHub 1a74c7ca85 Merge pull request #2778 from ebean-orm/feature/metric-naming-convention
Support a naming convention function that can be applied to metrics names for reporting
2022-08-09 11:10:51 +12:00
Rob BygraveandGitHub 0356f595c8 Merge pull request #2777 from ebean-orm/dependabot/maven/ebean-postgis/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-postgis
2022-08-09 10:48:38 +12:00
Rob BygraveandGitHub b12a9adf46 Merge pull request #2776 from ebean-orm/dependabot/maven/ebean-test/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-test
2022-08-09 10:48:24 +12:00
Rob BygraveandGitHub 2b874189a2 Merge pull request #2775 from ebean-orm/dependabot/maven/ebean-core/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-core
2022-08-09 10:47:56 +12:00
Rob Bygrave f2d95cf012 Merge branch 'master' of github.com:ebean-orm/ebean 2022-08-09 10:47:09 +12:00
Rob Bygrave d4825cd72c Bump ebean-agent to 13.7.0 2022-08-09 10:46:55 +12:00
Rob Bygrave c7bd6c8bde Support a naming convention function that can be applied to metrics names for reporting
For example, can apply a lower case underscore naming convention to the metrics names. This
can be done such that it doesn't have to be applied every time the metrics are collected and
reported.
2022-08-08 21:34:00 +12:00
dependabot[bot]andGitHub c9b3a91539 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-postgis
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:53 +00:00
dependabot[bot]andGitHub 565f6c5ac6 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-test
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:53 +00:00
dependabot[bot]andGitHub 356b5e58d9 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-core
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:52 +00:00
Rob BygraveandGitHub 094fc3f4b8 Merge pull request #2772 from FOCONIS/add-ebean-annotation-to-bom
Add ebean-annotation to BOM
2022-08-04 10:16:06 +12:00
Roland PramlandGitHub cfb9d860f9 Merge branch 'ebean-orm:master' into add-ebean-annotation-to-bom 2022-08-03 14:40:22 +02:00
Rob Bygrave 2f7b553d7c Bump kotlin-querybean-generator version 2022-08-03 22:18:09 +12:00
Roland Praml ec9481420c Add ebean-annotation to BOM 2022-08-03 11:34:31 +02:00
Rob BygraveandGitHub 797e1f4bd2 Merge pull request #2767 from ebean-orm/feature/2766-json-ref-bean
#2766 Explicitly specify disableLazyLoad on beans created from JSON by default
2022-08-03 20:36:19 +12:00
Rob BygraveandGitHub a14507e563 Merge pull request #2765 from ebean-orm/feature/2762-forUpdate-pagingList-count
#2762 - forUpdate is NOT included in query copy() method
2022-08-03 20:35:45 +12:00
Rob BygraveandGitHub 732f0e13e2 Merge pull request #2745 from ebean-orm/feature/2733-rename-moduleInfoLoader
#2733 - Rename ModuleInfoLoader to EntityClassRegister and _Ebean$ModuleInfo to EbeanEntityRegister
2022-08-03 20:35:21 +12:00
Rob BygraveandGitHub a6304ebe8b Merge pull request #2722 from ebean-orm/feature/jakarta-jaxb
Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind)
2022-08-03 20:34:55 +12:00
Rob Bygrave 4050d5e900 Add SqlQuery usingTransaction() for consistency and deprecate ExtendedServer API
- The ExtendedServer API is replaced by use of query usingTransaction()
- Add SqlQuery usingTransaction() for consistency with Query and DtoQuery
2022-08-02 15:35:00 +12:00
Rob Bygrave 87cc95f60d Bump to 13.6.7-SNAPSHOT after release 2022-08-02 09:12:00 +12:00
Rob Bygrave e8d663c94e [maven-release-plugin] prepare for next development iteration 2022-08-02 08:56:47 +12:00
Rob Bygrave ed830aeb0c #2766 - Explicitly specify disableLazyLoad on beans created from JSON (default)
- Beans created from JSON default to disableLazyLoad true
- Explicitly use new JsonReadOptions().setEnableLazyLoading(true) when lazy loading is needed
2022-08-01 15:43:08 +12:00
Rob Bygrave 54cbdae22d #2766 - Failing test for reference bean created from JSON allows lazy loading. 2022-08-01 15:38:11 +12:00
Rob Bygrave bb77d6588a #2762 - forUpdate is NOT included in query copy() method
The copy() method is used by findPagedList(), findIds(), findFutureList() etc.
2022-08-01 11:35:58 +12:00
Rob Bygrave 1d9db88050 #2733 - Rename ModuleInfoLoader to EntityClassRegister and _Ebean$ModuleInfo to EbeanEntityRegister 2022-07-11 15:35:46 +12:00
Rob Bygrave 2d65a3f1c9 Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind) 2022-06-17 18:10:14 +12:00
158 changed files with 1011 additions and 993 deletions
+1 -3
View File
@@ -16,9 +16,7 @@ jobs:
strategy:
fail-fast: false
matrix:
## valhalla - failing on javadoc with:
## javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://ebean.io/platforms/ebean-platform-h2/apidocs/ are in named modules.
java_version: [GA,EA,loom,metropolis,panama]
java_version: [GA,EA]
os: [ubuntu-latest]
steps:
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-clickhouse</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-clickhouse</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-cockroach</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-db2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-db2</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-h2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-hana</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hana</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-mariadb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mariadb</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-mysql</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-nuodb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-nuodb</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-oracle</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-oracle</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-postgres</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-sqlite</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlite</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-sqlserver</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean-yugabyte</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+5 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean (all platforms)</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -35,18 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.6.6</tag>
</scm>
</project>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.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.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean api</name>
@@ -55,7 +55,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-annotation</artifactId>
<version>8.1</version>
<version>${ebean-annotation.version}</version>
</dependency>
<dependency>
@@ -2,7 +2,6 @@ package io.ebean;
import io.avaje.lang.Nullable;
import javax.persistence.NonUniqueResultException;
import java.time.Clock;
import java.util.List;
import java.util.Map;
@@ -15,470 +14,182 @@ 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>
* <p>
* In general we only want to use this ExtendedServer API when we want to avoid / bypass
* the use of the mechanism to get the current transaction and instead explicitly supply
* the transaction to use.
* </p>
* <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.
* </p>
*/
public interface ExtendedServer {
/**
* Return the NOW time from the Clock.
*/
long clockNow();
/**
* Deprecated but no yet determined suitable replacement (to support testing only change of clock).
* <p>
* Set the Clock to use for <code>@WhenCreated</code> and <code>@WhenModified</code>.
* <p>
* Note that we only expect to change the Clock for testing purposes.
* </p>
*/
@Deprecated
void setClock(Clock clock);
/**
* Execute the query returning true if a row is found.
* <p>
* The query is executed using max rows of 1 and will only select the id property.
* This method is really just a convenient way to optimise a query to perform a
* 'does a row exist in the db' check.
* </p>
*
* <h2>Example:</h2>
* <pre>{@code
*
* boolean userExists = query().where().eq("email", "rob@foo.com").exists();
*
* }</pre>
*
* <h2>Example using a query bean:</h2>
* <pre>{@code
*
* boolean userExists = new QContact().email.equalTo("rob@foo.com").exists();
*
* }</pre>
*
* @return True if the query finds a matching row in the database
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> boolean exists(Query<T> ormQuery, Transaction transaction);
/**
* Return the number of 'top level' or 'root' entities this query should return.
*
* @see Query#findCount()
* @see Query#findFutureCount()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int findCount(Query<T> query, Transaction transaction);
/**
* Return the Id values of the query as a List.
*
* @see Query#findIds()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> List<A> findIds(Query<T> query, Transaction transaction);
/**
* Return a QueryIterator for the query.
* <p>
* Generally using {@link #findEach(Query, Consumer, Transaction)} or
* {@link #findEachWhile(Query, Predicate, Transaction)} is preferred
* to findIterate(). The reason is that those methods automatically take care of
* closing the queryIterator (and the underlying jdbc statement and resultSet).
* <p>
* This is similar to findEach in that not all the result beans need to be held
* in memory at the same time and as such is good for processing large queries.
*
* @see Query#findIterate()
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> QueryIterator<T> findIterate(Query<T> query, Transaction transaction);
/**
* Execute the query returning the result as a Stream.
* <p>
* Note that this can support very large queries iterating any number of results.
* To do so internally it can use multiple persistence contexts.
* <p>
* Note that the stream needs to be closed so use with try with resources.
* </p>
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Stream<T> findStream(Query<T> query, Transaction transaction);
/**
* Execute the query visiting the each bean one at a time.
* <p>
* Unlike findList() this is suitable for processing a query that will return
* a very large resultSet. The reason is that not all the result beans need to be
* held in memory at the same time and instead processed one at a time.
* </p>
* <p>
* Internally this query using a PersistenceContext scoped to each bean (and the
* beans associated object graph).
* </p>
* <p>
* <pre>{@code
*
* DB.find(Order.class)
* .where().eq("status", Order.Status.NEW)
* .order().asc("id")
* .findEach((Order order) -> {
*
* // do something with the order bean
* System.out.println(" -- processing order ... " + order);
* });
*
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction);
/**
* Execute findEach with batch consumer.
*
* @see Query#findEach(int, Consumer)
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEach(Query<T> query, int batch, Consumer<List<T>> consumer, Transaction t);
/**
* Execute the query visiting the each bean one at a time.
* <p>
* Compared to findEach() this provides the ability to stop processing the query
* results early by returning false for the Predicate.
* </p>
* <p>
* Unlike findList() this is suitable for processing a query that will return
* a very large resultSet. The reason is that not all the result beans need to be
* held in memory at the same time and instead processed one at a time.
* </p>
* <p>
* Internally this query using a PersistenceContext scoped to each bean (and the
* beans associated object graph).
* </p>
* <p>
* <pre>{@code
*
* DB.find(Order.class)
* .where().eq("status", Order.Status.NEW)
* .order().asc("id")
* .findEachWhile((Order order) -> {
*
* // do something with the order bean
* System.out.println(" -- processing order ... " + order);
*
* boolean carryOnProcessing = ...
* return carryOnProcessing;
* });
*
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction transaction);
/**
* Return versions of a @History entity bean.
* <p>
* Generally this query is expected to be a find by id or unique predicates query.
* It will execute the query against the history returning the versions of the bean.
* </p>
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> List<Version<T>> findVersions(Query<T> query, Transaction transaction);
/**
* Execute a query returning a list of beans.
* <p>
* Generally you are able to use {@link Query#findList()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
* <p>
* <pre>{@code
*
* List<Customer> customers = DB.find(Customer.class)
* .where().ilike("name", "rob%")
* .findList();
*
* }</pre>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched beans.
* @see Query#findList()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> List<T> findList(Query<T> query, Transaction transaction);
/**
* Execute find row count query in a background thread.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a
* timeout).
* </p>
*
* @param query the query to execute the row count on
* @param transaction the transaction (can be null).
* @return a Future object for the row count query
* @see Query#findFutureCount()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureRowCount<T> findFutureCount(Query<T> query, Transaction transaction);
/**
* Execute find Id's query in a background thread.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a
* timeout).
* </p>
*
* @param query the query to execute the fetch Id's on
* @param transaction the transaction (can be null).
* @return a Future object for the list of Id's
* @see Query#findFutureIds()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureIds<T> findFutureIds(Query<T> query, Transaction transaction);
/**
* Execute find list query in a background thread returning a FutureList object.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a timeout).
* <p>
* This query will execute in it's own PersistenceContext and using its own transaction.
* What that means is that it will not share any bean instances with other queries.
*
* @param query the query to execute in the background
* @param transaction the transaction (can be null).
* @return a Future object for the list result of the query
* @see Query#findFutureList()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> FutureList<T> findFutureList(Query<T> query, Transaction transaction);
/**
* Return a PagedList for this query using firstRow and maxRows.
* <p>
* The benefit of using this over findList() is that it provides functionality to get the
* total row count etc.
* </p>
* <p>
* If maxRows is not set on the query prior to calling findPagedList() then a
* PersistenceException is thrown.
* </p>
* <p>
* <pre>{@code
*
* PagedList<Order> pagedList = DB.find(Order.class)
* .setFirstRow(50)
* .setMaxRows(20)
* .findPagedList();
*
* // fetch the total row count in the background
* pagedList.loadRowCount();
*
* List<Order> orders = pagedList.getList();
* int totalRowCount = pagedList.getTotalRowCount();
*
* }</pre>
*
* @return The PagedList
* @see Query#findPagedList()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> PagedList<T> findPagedList(Query<T> query, Transaction transaction);
/**
* Execute the query returning a set of entity beans.
* <p>
* Generally you are able to use {@link Query#findSet()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
* <p>
* <pre>{@code
*
* Set<Customer> customers = DB.find(Customer.class)
* .where().ilike("name", "rob%")
* .findSet();
*
* }</pre>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute
* @param transaction the transaction to use (can be null).
* @return the set of fetched beans.
* @see Query#findSet()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Set<T> findSet(Query<T> query, Transaction transaction);
/**
* Execute the query returning the entity beans in a Map.
* <p>
* Generally you are able to use {@link Query#findMap()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the map of fetched beans.
* @see Query#findMap()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<K, T> Map<K, T> findMap(Query<T> query, Transaction transaction);
/**
* Execute the query returning a list of values for a single property.
* <p>
* <h3>Example 1:</h3>
* <pre>{@code
*
* List<String> names =
* DB.find(Customer.class)
* .select("name")
* .order().asc("name")
* .findSingleAttributeList();
*
* }</pre>
* <h3>Example 2:</h3>
* <pre>{@code
*
* List<String> names =
* DB.find(Customer.class)
* .setDistinct(true)
* .select("name")
* .where().eq("status", Customer.Status.NEW)
* .order().asc("name")
* .setMaxRows(100)
* .findSingleAttributeList();
*
* }</pre>
*
* @return the list of values for the selected property
* @see Query#findSingleAttributeList()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> List<A> findSingleAttributeList(Query<T> query, Transaction transaction);
/**
* Execute the query returning a hashset of values for a single property.
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<A, T> Set<A> findSingleAttributeSet(Query<T> query, Transaction transaction);
/**
* Execute the query returning at most one entity bean or null (if no matching
* bean is found).
* <p>
* This will throw a NonUniqueResultException if the query finds more than one result.
* </p>
* <p>
* Generally you are able to use {@link Query#findOne()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched beans.
* @throws NonUniqueResultException if more than one result was found
* @see Query#findOne()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
@Nullable
<T> T findOne(Query<T> query, Transaction transaction);
/**
* Similar to findOne() but returns an Optional (rather than nullable).
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> Optional<T> findOneOrEmpty(Query<T> query, Transaction transaction);
/**
* Execute as a delete query deleting the 'root level' beans that match the predicates
* in the query.
* <p>
* Note that if the query includes joins then the generated delete statement may not be
* optimal depending on the database platform.
* </p>
*
* @param query the query used for the delete
* @param transaction the transaction to use (can be null)
* @param <T> the type of entity bean to fetch.
* @return the number of beans/rows that were deleted
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int delete(Query<T> query, Transaction transaction);
/**
* Execute the update query returning the number of rows updated.
* <p>
* The update query must be created using {@link Database#update(Class)}.
* </p>
*
* @param query the update query to execute
* @param transaction the optional transaction to use for the update (can be null)
* @param <T> the type of entity bean
* @return The number of rows updated
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
<T> int update(Query<T> query, Transaction transaction);
/**
* Execute the sql query returning a list of MapBean.
* <p>
* Generally you are able to use {@link SqlQuery#findList()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched MapBean.
* @see SqlQuery#findList()
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
List<SqlRow> findList(SqlQuery query, Transaction transaction);
/**
* Execute the SqlQuery iterating a row at a time.
* <p>
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
void findEach(SqlQuery query, Consumer<SqlRow> consumer, Transaction transaction);
/**
* Execute the SqlQuery iterating a row at a time with the ability to stop consuming part way through.
* <p>
* Returning false after processing a row stops the iteration through the query results.
* </p>
* <p>
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
* Deprecated migrate to using {@link Query#usingTransaction(Transaction)}.
*/
@Deprecated
void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction);
/**
* Execute the sql query returning a single MapBean or null.
* <p>
* This will throw a PersistenceException if the query found more than one
* result.
* </p>
* <p>
* Generally you are able to use {@link SqlQuery#findOne()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the fetched MapBean or null if none was found.
* @see SqlQuery#findOne()
* Deprecated migrate to using {@link SqlQuery#usingTransaction(Transaction)}.
*/
@Deprecated
@Nullable
SqlRow findOne(SqlQuery query, Transaction transaction);
+11 -1
View File
@@ -2,8 +2,8 @@ package io.ebean;
import io.avaje.lang.NonNullApi;
import io.avaje.lang.Nullable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
@@ -40,6 +40,11 @@ import java.util.function.Predicate;
@NonNullApi
public interface SqlQuery extends Serializable, CancelableQuery {
/**
* Execute the query using the given transaction.
*/
SqlQuery usingTransaction(Transaction transaction);
/**
* Execute the query returning a list.
*/
@@ -298,6 +303,11 @@ public interface SqlQuery extends Serializable, CancelableQuery {
*/
interface TypeQuery<T> {
/**
* Execute the query using the given transaction.
*/
TypeQuery<T> usingTransaction(Transaction transaction);
/**
* Return the single value.
*/
@@ -16,6 +16,7 @@ import io.ebean.event.changelog.ChangeLogPrepare;
import io.ebean.event.changelog.ChangeLogRegister;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetricNamingMatch;
import io.ebean.util.StringHelper;
import javax.persistence.EnumType;
@@ -24,6 +25,7 @@ import java.time.Clock;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
/**
* The configuration used for creating a Database.
@@ -115,9 +117,9 @@ public class DatabaseConfig {
private TenantCatalogProvider tenantCatalogProvider;
/**
* When true will load entity classes via ModuleInfoLoader.
* When true will load entity classes via EntityClassRegister.
* <p>
* NB: ModuleInfoLoader implementations are generated by querybean generator.
* NB: EntityClassRegister implementations are generated by querybean generator.
* Having this on and registering entity classes means we don't need to manually
* write that code or use classpath scanning to find entity classes.
*/
@@ -546,6 +548,8 @@ public class DatabaseConfig {
private String dumpMetricsOptions;
private Function<String, String> metricNaming = MetricNamingMatch.INSTANCE;
/**
* Construct a Database Configuration for programmatically creating an Database.
*/
@@ -3376,7 +3380,7 @@ public class DatabaseConfig {
}
/**
* Return true if entity classes should be loaded and registered via ModuleInfoLoader.
* Return true if entity classes should be loaded and registered via EntityClassRegister.
* <p>
* When false we either register entity classes via application code or use classpath
* scanning to find and register entity classes.
@@ -3396,6 +3400,20 @@ public class DatabaseConfig {
this.loadModuleInfo = loadModuleInfo;
}
/**
* Return the naming convention to apply to metrics names.
*/
public Function<String, String> getMetricNaming() {
return metricNaming;
}
/**
* Set the naming convention to apply to metrics names.
*/
public void setMetricNaming(Function<String, String> metricNaming) {
this.metricNaming = metricNaming;
}
public enum UuidVersion {
VERSION4,
VERSION1,
@@ -5,7 +5,7 @@ import java.util.List;
/**
* Loads and returns entity classes to register with Ebean databases.
*/
public interface ModuleInfoLoader {
public interface EntityClassRegister {
/**
* Return entity classes to register for a named DB (not default DB).
@@ -2,6 +2,7 @@ package io.ebean.meta;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
/**
* A simple MetricVisitor that can collect the desired metrics into lists.
@@ -9,27 +10,29 @@ import java.util.List;
public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerMetrics {
private final String name;
private final Function<String,String> naming;
private final List<MetaTimedMetric> timed = new ArrayList<>();
private final List<MetaQueryMetric> query = new ArrayList<>();
private final List<MetaCountMetric> count = new ArrayList<>();
public BasicMetricVisitor() {
this("db");
this("db", MetricNamingMatch.INSTANCE);
}
/**
* Construct to reset and collect everything.
*/
public BasicMetricVisitor(String name) {
this(name, true, true, true, true);
public BasicMetricVisitor(String name, Function<String,String> naming) {
this(name, naming, true, true, true, true);
}
/**
* Construct specifying reset and what to collect.
*/
public BasicMetricVisitor(String name, boolean reset, boolean collectTransactionMetrics, boolean collectQueryMetrics, boolean collectL2Metrics) {
public BasicMetricVisitor(String name, Function<String,String> naming, boolean reset, boolean collectTransactionMetrics, boolean collectQueryMetrics, boolean collectL2Metrics) {
super(reset, collectTransactionMetrics, collectQueryMetrics, collectL2Metrics);
this.name = name;
this.naming = naming;
}
@Override
@@ -37,6 +40,11 @@ public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerM
return name;
}
@Override
public Function<String, String> namingConvention() {
return naming;
}
@Override
public ServerMetricsAsJson asJson() {
return new MetricsAsJson(this);
@@ -0,0 +1,16 @@
package io.ebean.meta;
import java.util.function.Function;
/**
* Metric naming convention that is exact match.
*/
public final class MetricNamingMatch implements Function<String, String> {
public static final Function<String, String> INSTANCE = new MetricNamingMatch();
@Override
public String apply(String name) {
return name;
}
}
@@ -1,10 +1,17 @@
package io.ebean.meta;
import java.util.function.Function;
/**
* Defines visitor to read and report the transaction and query metrics.
*/
public interface MetricVisitor {
/**
* Return the naming convention that should be applied to the reported metric names.
*/
Function<String, String> namingConvention();
/**
* Return true if the metrics should be reset.
*/
+13 -8
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<!-- <parent>-->
<!-- <groupId>org.avaje</groupId>-->
@@ -14,7 +14,7 @@
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.6.6</tag>
<tag>HEAD</tag>
</scm>
<name>ebean autotune</name>
@@ -26,16 +26,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>provided</scope>
</dependency>
<!-- needed for java 11+ -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.6</version>
<scope>provided</scope>
<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>
<dependency>
@@ -55,7 +60,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
@@ -1,9 +1,9 @@
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 jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.server.autotune.model;
import javax.xml.bind.annotation.XmlRegistry;
import jakarta.xml.bind.annotation.XmlRegistry;
/**
@@ -1,10 +1,10 @@
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;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
/**
@@ -1,9 +1,9 @@
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 jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
@@ -1,9 +1,9 @@
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 jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
@@ -1,9 +1,9 @@
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 jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
@@ -1,2 +1,2 @@
@javax.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/autotune", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/autotune", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED)
package io.ebeaninternal.server.autotune.model;
@@ -3,9 +3,9 @@ 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 jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -3,9 +3,9 @@ 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 jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -10,6 +10,5 @@ module io.ebean.autotune {
requires io.ebean.api;
requires io.ebean.core;
requires java.xml;
requires java.xml.bind;
requires jakarta.xml.bind;
}
+22 -15
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean bom</name>
@@ -18,6 +18,13 @@
<!-- dependencies external to this ebean.git build -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-annotation</artifactId>
<version>${ebean-annotation.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-runner</artifactId>
@@ -71,88 +78,88 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-xml</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-autotune</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>kotlin-querybean-generator</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-postgis</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-redis</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
</dependencies>
+2 -2
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<artifactId>ebean-core-type</artifactId>
@@ -16,7 +16,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
+9 -9
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<artifactId>ebean-core</artifactId>
@@ -15,7 +15,7 @@
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.6.6</tag>
<tag>HEAD</tag>
</scm>
<dependencies>
@@ -41,19 +41,19 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
</dependency>
<dependency>
@@ -136,7 +136,7 @@
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.3</version>
<version>42.4.1</version>
<optional>true</optional>
</dependency>
@@ -144,21 +144,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
@@ -25,6 +25,11 @@ import java.util.stream.Stream;
*/
public interface SpiEbeanServer extends SpiServer, ExtendedServer, BeanCollectionLoader {
/**
* Return the NOW time from the Clock.
*/
long clockNow();
/**
* Return true if the L2 cache has been disabled.
*/
@@ -417,6 +417,8 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
/**
* Return a copy of the query.
* <p>
* Note that this does NOT copy the forUpdate property. See #2762.
*/
@Override
SpiQuery<T> copy();
@@ -1,10 +1,17 @@
package io.ebeaninternal.api;
import io.avaje.lang.Nullable;
import io.ebean.SqlQuery;
import io.ebean.Transaction;
/**
* SQL query - Internal extension to SqlQuery.
*/
public interface SpiSqlQuery extends SqlQuery, SpiSqlBinding {
/**
* Return the transaction explicitly associated to the query.
*/
@Nullable
Transaction transaction();
}
@@ -1,12 +1,7 @@
package io.ebeaninternal.server.core;
import io.ebean.config.BackgroundExecutorWrapper;
import io.ebean.config.ContainerConfig;
import io.ebean.config.DatabaseConfig;
import io.ebean.config.DatabaseConfigProvider;
import io.ebean.config.ModuleInfoLoader;
import io.ebean.config.TenantMode;
import io.ebean.config.UnderscoreNamingConvention;
import io.ebean.config.*;
import io.ebean.config.EntityClassRegister;
import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.event.ShutdownManager;
import io.ebean.service.SpiContainer;
@@ -129,7 +124,7 @@ public final class DefaultContainer implements SpiContainer {
if (config.isAutoLoadModuleInfo()) {
// auto register entity classes
boolean found = false;
for (ModuleInfoLoader loader : ServiceLoader.load(ModuleInfoLoader.class)) {
for (EntityClassRegister loader : ServiceLoader.load(EntityClassRegister.class)) {
config.addAll(loader.classesFor(config.getName(), config.isDefaultServer()));
found = true;
}
@@ -140,9 +135,9 @@ public final class DefaultContainer implements SpiContainer {
}
private void checkMissingModulePathProvides() {
URL servicesFile = ClassLoader.getSystemResource("META-INF/services/io.ebean.config.ModuleInfoLoader");
URL servicesFile = ClassLoader.getSystemResource("META-INF/services/io.ebean.config.EntityClassRegister");
if (servicesFile != null) {
log.error("module-info.java is probably missing 'provides io.ebean.config.ModuleInfoLoader with _Ebean$ModuleInfo' clause. ModuleInfoLoader exists but was not service loaded.");
log.error("module-info.java is probably missing 'provides io.ebean.config.EntityClassRegister with EbeanEntityRegister' clause. EntityClassRegister exists but was not service loaded.");
}
}
@@ -1,20 +1,9 @@
package io.ebeaninternal.server.core;
import io.ebean.meta.AbstractMetricVisitor;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaCountMetric;
import io.ebean.meta.MetaInfoManager;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetaQueryPlan;
import io.ebean.meta.MetaTimedMetric;
import io.ebean.meta.MetricData;
import io.ebean.meta.MetricVisitor;
import io.ebean.meta.QueryPlanInit;
import io.ebean.meta.QueryPlanRequest;
import io.ebean.meta.ServerMetrics;
import io.ebean.meta.ServerMetricsAsJson;
import io.ebean.meta.*;
import java.util.List;
import java.util.function.Function;
/**
* DefaultServer based implementation of MetaInfoManager.
@@ -22,9 +11,11 @@ import java.util.List;
final class DefaultMetaInfoManager implements MetaInfoManager {
private final DefaultServer server;
private final Function<String, String> naming;
DefaultMetaInfoManager(DefaultServer server) {
DefaultMetaInfoManager(DefaultServer server, Function<String, String> naming) {
this.server = server;
this.naming = naming;
}
@Override
@@ -49,7 +40,7 @@ final class DefaultMetaInfoManager implements MetaInfoManager {
@Override
public BasicMetricVisitor visitBasic() {
BasicMetricVisitor basic = new BasicMetricVisitor(server.name());
BasicMetricVisitor basic = new BasicMetricVisitor(server.name(), naming);
visitMetrics(basic);
return basic;
}
@@ -68,6 +59,11 @@ final class DefaultMetaInfoManager implements MetaInfoManager {
super(true, true, true, true);
}
@Override
public Function<String, String> namingConvention() {
return MetricNamingMatch.INSTANCE;
}
@Override
public void visitTimed(MetaTimedMetric metric) {
// ignore
@@ -213,7 +213,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
this.transactionManager = config.createTransactionManager(this, docStoreComponents.updateProcessor());
this.documentStore = docStoreComponents.documentStore();
this.queryPlanManager = config.initQueryPlanManager(transactionManager);
this.metaInfoManager = new DefaultMetaInfoManager(this);
this.metaInfoManager = new DefaultMetaInfoManager(this, this.config.getMetricNaming());
this.serverPlugins = config.getPlugins();
this.ddlGenerator = config.initDdlGenerator(this);
this.scriptRunner = new DScriptRunner(this);
@@ -1514,7 +1514,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
}
private <P> P executeSqlQuery(Function<RelationalQueryRequest, P> fun, SpiSqlQuery query) {
RelationalQueryRequest request = new RelationalQueryRequest(this, relationalQueryEngine, query, null);
RelationalQueryRequest request = new RelationalQueryRequest(this, relationalQueryEngine, query, query.transaction());
try {
request.initTransIfRequired();
return fun.apply(request);
@@ -22,9 +22,6 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest {
private int estimateCapacity;
private int rows;
/**
* Create the BeanFindRequest.
*/
RelationalQueryRequest(SpiEbeanServer server, RelationalQueryEngine engine, SqlQuery q, Transaction t) {
super(server, (SpiSqlBinding) q, t);
this.queryEngine = engine;
@@ -1482,7 +1482,7 @@ public class BeanDescriptor<T> implements BeanType<T>, STreeType, SpiBeanType {
iudMetrics.visit(visitor);
for (CQueryPlan queryPlan : queryPlanCache.values()) {
if (!queryPlan.isEmptyStats()) {
visitor.visitQuery(queryPlan.getSnapshot(visitor.reset()));
visitor.visitQuery(queryPlan.visit(visitor));
}
}
}
@@ -578,8 +578,8 @@ public final class BeanDescriptorManager implements BeanDescriptorMap, SpiBeanTy
}
private <T> String errNothingRegistered() {
return "There are no registered entities. If using query beans, that generates _Ebean$ModuleInfo.java into " +
"generated sources and is service loaded. If using module-info.java, then probably missing 'provides io.ebean.config.ModuleInfoLoader with _Ebean$ModuleInfo' clause.";
return "There are no registered entities. If using query beans, that generates EbeanEntityRegister.java into " +
"generated sources and is service loaded. If using module-info.java, then probably missing 'provides io.ebean.config.EntityClassRegister with EbeanEntityRegister' clause.";
}
private String errNotRegistered(Class<?> beanClass) {
@@ -13,6 +13,7 @@ final class DCountMetric implements CountMetric {
private final String name;
private final LongAdder count = new LongAdder();
private String reportName;
DCountMetric(String name) {
this.name = name;
@@ -50,10 +51,17 @@ final class DCountMetric implements CountMetric {
public void visit(MetricVisitor visitor) {
long val = visitor.reset() ? count.sumThenReset() : count.sum();
if (val > 0) {
final String name = reportName != null ? reportName : reportName(visitor);
visitor.visitCount(new DCountMetricStats(name, val));
}
}
String reportName(MetricVisitor visitor) {
final String tmp = visitor.namingConvention().apply(name);
this.reportName = tmp;
return tmp;
}
private static class DCountMetricStats implements CountMetricStats {
private final String name;
@@ -11,6 +11,7 @@ final class DQueryPlanMetric implements QueryPlanMetric {
private final DQueryPlanMeta meta;
private final DTimedMetric metric;
private boolean collected;
private String reportName;
DQueryPlanMetric(DQueryPlanMeta meta, DTimedMetric metric) {
this.meta = meta;
@@ -21,11 +22,18 @@ final class DQueryPlanMetric implements QueryPlanMetric {
public void visit(MetricVisitor visitor) {
TimedMetricStats stats = metric.collect(visitor.reset());
if (stats != null) {
visitor.visitQuery(new Stats(meta, stats, collected));
String name = reportName != null ? reportName : reportName(visitor);
visitor.visitQuery(new Stats(name, meta, stats, collected));
collected = true;
}
}
String reportName(MetricVisitor visitor) {
final String tmp = visitor.namingConvention().apply(meta.getName());
this.reportName = tmp;
return tmp;
}
@Override
public TimedMetric metric() {
return metric;
@@ -33,11 +41,13 @@ final class DQueryPlanMetric implements QueryPlanMetric {
private static class Stats implements MetaQueryMetric {
private final String name;
private final DQueryPlanMeta meta;
private final TimedMetricStats stats;
private final boolean collected;
private Stats(DQueryPlanMeta meta, TimedMetricStats stats, boolean collected) {
private Stats(String name, DQueryPlanMeta meta, TimedMetricStats stats, boolean collected) {
this.name = name;
this.meta = meta;
this.stats = stats;
this.collected = collected;
@@ -75,7 +85,7 @@ final class DQueryPlanMetric implements QueryPlanMetric {
@Override
public String name() {
return meta.getName();
return name;
}
@Override
@@ -19,6 +19,7 @@ final class DTimedMetric implements TimedMetric {
private final LongAdder total = new LongAdder();
private final LongAccumulator max = new LongAccumulator(Math::max, Long.MIN_VALUE);
private boolean collected;
private String reportName;
DTimedMetric(String name) {
this.name = name;
@@ -40,9 +41,6 @@ final class DTimedMetric implements TimedMetric {
add((System.nanoTime() - startNanos) / 1000L);
}
/**
* Add a value. Usually the value is Time or Bytes etc.
*/
@Override
public void add(long value) {
count.increment();
@@ -55,9 +53,6 @@ final class DTimedMetric implements TimedMetric {
return count.sum() == 0;
}
/**
* Reset all the internal counters and start time.
*/
@Override
public void reset() {
max.reset();
@@ -67,30 +62,42 @@ final class DTimedMetric implements TimedMetric {
@Override
public void visit(MetricVisitor visitor) {
DTimeMetricStats metric = collect(visitor.reset());
if (metric != null) {
visitor.visitTimed(metric);
final long countSum = visitor.reset() ? count.sumThenReset() : count.sum();
if (countSum > 0) {
final String name = reportName != null ? reportName : reportName(visitor);
visitor.visitTimed(stats(visitor.reset(), name, countSum));
}
}
@Override
public DTimeMetricStats collect(boolean reset) {
return (count.sum() == 0) ? null : getStatistics(reset);
final long countSum = reset ? count.sumThenReset() : count.sum();
if (countSum == 0) {
return null;
} else {
return stats(reset, name, countSum);
}
}
/**
* Return the current statistics resetting the internal values if reset is true.
*/
private DTimeMetricStats getStatistics(boolean reset) {
private DTimeMetricStats stats(boolean reset, String name, long countSum) {
try {
if (reset) {
return new DTimeMetricStats(name, collected, count.sumThenReset(), total.sumThenReset(), max.getThenReset());
return new DTimeMetricStats(name, collected, countSum, total.sumThenReset(), max.getThenReset());
} else {
return new DTimeMetricStats(name, collected, count.sum(), total.sum(), max.get());
return new DTimeMetricStats(name, collected, countSum, total.sum(), max.get());
}
} finally {
collected = true;
}
}
String reportName(MetricVisitor visitor) {
final String tmp = visitor.namingConvention().apply(name);
this.reportName = tmp;
return tmp;
}
}
@@ -13,6 +13,7 @@ final class DTimedProfileLocation extends DProfileLocation implements TimedProfi
private final TimedMetric timedMetric;
private final boolean overrideMetricName;
private String fullName;
private String reportName;
DTimedProfileLocation(int lineNumber, String label, TimedMetric timedMetric) {
super(lineNumber);
@@ -47,11 +48,17 @@ final class DTimedProfileLocation extends DProfileLocation implements TimedProfi
public void visit(MetricVisitor visitor) {
TimedMetricStats collect = timedMetric.collect(visitor.reset());
if (collect != null) {
if (overrideMetricName) {
collect.setName(fullName);
}
final String name = reportName != null ? reportName : reportName(visitor, collect.name());
collect.setName(name);
collect.setLocation(location());
visitor.visitTimed(collect);
}
}
private String reportName(MetricVisitor visitor, String name) {
final String defaultName = overrideMetricName ? fullName : name;
final String tmp = visitor.namingConvention().apply(defaultName);
this.reportName = tmp;
return tmp;
}
}
@@ -4,6 +4,7 @@ import io.ebean.ProfileLocation;
import io.ebean.config.dbplatform.SqlLimitResponse;
import io.ebean.core.type.DataReader;
import io.ebean.core.type.ScalarDataReader;
import io.ebean.meta.MetricVisitor;
import io.ebean.metric.MetricFactory;
import io.ebean.metric.TimedMetric;
import io.ebeaninternal.api.*;
@@ -279,8 +280,8 @@ public class CQueryPlan implements SpiQueryPlan {
/**
* Return a copy of the current query statistics.
*/
public final Snapshot getSnapshot(boolean reset) {
return stats.getSnapshot(reset);
public final Snapshot visit(MetricVisitor visitor) {
return stats.visit(visitor);
}
/**
@@ -1,6 +1,7 @@
package io.ebeaninternal.server.query;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetricVisitor;
import io.ebean.metric.TimedMetric;
import io.ebean.metric.TimedMetricStats;
@@ -13,6 +14,7 @@ public final class CQueryPlanStats {
private final TimedMetric timedMetric;
private boolean collected;
private long lastQueryTime;
private String reportName;
/**
* Construct for a given query plan.
@@ -55,23 +57,32 @@ public final class CQueryPlanStats {
/**
* Return a Snapshot of the query execution statistics potentially resetting the internal counters.
*/
Snapshot getSnapshot(boolean reset) {
TimedMetricStats collect = timedMetric.collect(reset);
Snapshot snapshot = new Snapshot(collected, queryPlan, collect);
Snapshot visit(MetricVisitor visitor) {
TimedMetricStats collect = timedMetric.collect(visitor.reset());
String name = reportName != null ? reportName : reportName(visitor);
Snapshot snapshot = new Snapshot(name, collected, queryPlan, collect);
collected = true;
return snapshot;
}
String reportName(MetricVisitor visitor) {
final String tmp = visitor.namingConvention().apply(queryPlan.getName());
this.reportName = tmp;
return tmp;
}
/**
* A snapshot of the current statistics for a query plan.
*/
static class Snapshot implements MetaQueryMetric {
private final String name;
private final boolean collected;
private final CQueryPlan queryPlan;
private final TimedMetricStats metrics;
Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics) {
Snapshot(String name, boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics) {
this.name = name;
this.collected = collected;
this.queryPlan = queryPlan;
this.metrics = metrics;
@@ -94,7 +105,7 @@ public final class CQueryPlanStats {
@Override
public String name() {
return queryPlan.getName();
return name;
}
@Override
@@ -708,6 +708,7 @@ public class DefaultOrmQuery<T> extends AbstractQuery implements SpiQuery<T> {
@Override
public SpiQuery<T> copy(SpiEbeanServer server) {
// forUpdate is NOT copied - see #2762
DefaultOrmQuery<T> copy = new DefaultOrmQuery<>(beanDescriptor, server, expressionFactory);
copy.transaction = transaction;
copy.m2mIncludeJoin = m2mIncludeJoin;
@@ -748,7 +749,6 @@ public class DefaultOrmQuery<T> extends AbstractQuery implements SpiQuery<T> {
copy.usageProfiling = usageProfiling;
copy.autoTune = autoTune;
copy.parentNode = parentNode;
copy.forUpdate = forUpdate;
copy.rawSql = rawSql;
setCancelableQuery(copy); // required to cancel findId query
return copy;
@@ -2,10 +2,7 @@ package io.ebeaninternal.server.querydefn;
import io.avaje.lang.NonNullApi;
import io.avaje.lang.Nullable;
import io.ebean.RowConsumer;
import io.ebean.RowMapper;
import io.ebean.SqlQuery;
import io.ebean.SqlRow;
import io.ebean.*;
import io.ebeaninternal.api.BindParams;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.api.SpiSqlQuery;
@@ -31,6 +28,7 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq
private int timeout;
private int bufferFetchSizeHint;
private final BindParams bindParams = new BindParams();
private Transaction transaction;
/**
* Additional supply a query detail object.
@@ -40,19 +38,34 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq
this.query = query;
}
@Override
public Transaction transaction() {
return transaction;
}
@Override
public SqlQuery usingTransaction(Transaction transaction) {
this.transaction = transaction;
return this;
}
private void transaction(Transaction transaction) {
this.transaction = transaction;
}
@Override
public void findEach(Consumer<SqlRow> consumer) {
server.findEach(this, consumer, null);
server.findEach(this, consumer, transaction);
}
@Override
public void findEachWhile(Predicate<SqlRow> consumer) {
server.findEachWhile(this, consumer, null);
server.findEachWhile(this, consumer, transaction);
}
@Override
public List<SqlRow> findList() {
return server.findList(this, null);
return server.findList(this, transaction);
}
@Override
@@ -62,7 +75,7 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq
@Override
public SqlRow findOne() {
return server.findOne(this, null);
return server.findOne(this, transaction);
}
@Override
@@ -216,6 +229,12 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq
this.type = type;
}
@Override
public TypeQuery<T> usingTransaction(Transaction transaction) {
transaction(transaction);
return this;
}
@Override
public T findOne() {
return findSingleAttribute(type);
@@ -249,6 +268,12 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq
this.mapper = mapper;
}
@Override
public TypeQuery<T> usingTransaction(Transaction transaction) {
transaction(transaction);
return this;
}
@Nullable
@Override
public T findOne() {
@@ -33,6 +33,7 @@ public final class ReadJson implements SpiJsonReader {
private final PersistenceContext persistenceContext;
private final LoadContext loadContext;
private final boolean intercept;
private final boolean enableLazyLoading;
/**
* Construct with parser and readOptions.
@@ -43,6 +44,7 @@ public final class ReadJson implements SpiJsonReader {
this.objectMapper = objectMapper;
this.persistenceContext = initPersistenceContext(readOptions);
this.loadContext = initLoadContext(desc, readOptions);
this.enableLazyLoading = readOptions != null && readOptions.isEnableLazyLoading();
// only create visitorMap, pathStack if needed ...
this.visitorMap = (readOptions == null) ? null : readOptions.getVisitorMap();
this.pathStack = (visitorMap == null && loadContext == null) ? null : new PathStack();
@@ -61,6 +63,7 @@ public final class ReadJson implements SpiJsonReader {
this.persistenceContext = source.persistenceContext;
this.loadContext = source.loadContext;
this.intercept = source.intercept;
this.enableLazyLoading = source.enableLazyLoading;
}
private LoadContext initLoadContext(BeanDescriptor<?> desc, JsonReadOptions readOptions) {
@@ -109,6 +112,9 @@ public final class ReadJson implements SpiJsonReader {
*/
@Override
public Object persistenceContextPutIfAbsent(Object id, EntityBean bean, BeanDescriptor<?> beanDesc) {
if (!enableLazyLoading) {
bean._ebean_getIntercept().setDisableLazyLoad(true);
}
if (persistenceContext == null) {
// no persistenceContext means no lazy loading either
return null;
+1 -1
View File
@@ -4,7 +4,7 @@ module io.ebean.core {
uses io.ebean.cache.ServerCachePlugin;
uses io.ebean.cache.ServerCacheNotifyPlugin;
uses io.ebean.config.DatabaseConfigProvider;
uses io.ebean.config.ModuleInfoLoader;
uses io.ebean.config.EntityClassRegister;
uses io.ebean.config.dbplatform.DatabasePlatformProvider;
uses io.ebean.datasource.DataSourceAlertFactory;
uses io.ebean.core.type.ExtraTypeFactory;
@@ -1,12 +1,55 @@
package io.ebeaninternal.server.profile;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
import io.ebean.metric.MetricFactory;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.function.Function;
import static org.assertj.core.api.Assertions.assertThat;
class BasicProfileLocationTest {
Function<String,String> naming = (String name) -> "prefix[" + name.replace('.', '-') + "]";
@Test
void metricNameFromOverride() {
DTimedProfileLocation loc = new DTimedProfileLocation(12, "", MetricFactory.get().createTimedMetric("a.b.c"));
loc.initWith("foo.label");
loc.add(42);
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
loc.visit(visitor);
List<MetaTimedMetric> result = visitor.timedMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[txn-named-foo-label]");
assertThat(result.get(0).total()).isEqualTo(42);
loc.add(21);
BasicMetricVisitor visitor2 = new BasicMetricVisitor("v", naming);
loc.visit(visitor2);
List<MetaTimedMetric> result2 = visitor2.timedMetrics();
assertThat(result2).hasSize(1);
assertThat(result2.get(0).name()).isEqualTo("prefix[txn-named-foo-label]");
assertThat(result2.get(0).total()).isEqualTo(21);
}
@Test
void metricNameFromTimed() {
DTimedProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric("a.b.c"));
loc.add(42);
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
loc.visit(visitor);
List<MetaTimedMetric> result = visitor.timedMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[a-b-c]");
}
@Test
void obtain() {
DProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric("junk"));
@@ -0,0 +1,43 @@
package io.ebeaninternal.server.profile;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaCountMetric;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.function.Function;
import static org.assertj.core.api.Assertions.assertThat;
class DCountMetricTest {
Function<String, String> naming = (String name) -> "prefix[" + name.replace('.', '-') + "]";
@Test
void visit() {
DCountMetric counter = new DCountMetric("org.hello");
counter.add(7);
{
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
counter.visit(visitor);
List<MetaCountMetric> result = visitor.countMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[org-hello]");
assertThat(result.get(0).count()).isEqualTo(7);
}
{
// second collection
counter.add(4);
counter.add(8);
BasicMetricVisitor visitor2 = new BasicMetricVisitor("v", naming);
counter.visit(visitor2);
List<MetaCountMetric> result2 = visitor2.countMetrics();
assertThat(result2).hasSize(1);
assertThat(result2.get(0).name()).isEqualTo("prefix[org-hello]");
assertThat(result2.get(0).count()).isEqualTo(12);
}
}
}
@@ -0,0 +1,47 @@
package io.ebeaninternal.server.profile;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaQueryMetric;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.function.Function;
import static org.assertj.core.api.Assertions.assertThat;
class DQueryPlanMetricTest {
Function<String, String> naming = (String name) -> "prefix[" + name.replace('.', '-') + "]";
@Test
void visit() {
DQueryPlanMeta meta = new DQueryPlanMeta(Object.class, "lab", null, "sql");
DTimedMetric metric = new DTimedMetric("org.timed.plan");
DQueryPlanMetric planMetric = new DQueryPlanMetric(meta, metric);
metric.add(560);
metric.add(260);
{
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
planMetric.visit(visitor);
List<MetaQueryMetric> result = visitor.queryMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[dto-Object_lab]");
assertThat(result.get(0).count()).isEqualTo(2);
assertThat(result.get(0).total()).isEqualTo(820);
}
metric.add(410);
{
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
planMetric.visit(visitor);
List<MetaQueryMetric> result = visitor.queryMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[dto-Object_lab]");
assertThat(result.get(0).count()).isEqualTo(1);
assertThat(result.get(0).total()).isEqualTo(410);
}
}
}
@@ -1,7 +1,12 @@
package io.ebeaninternal.server.profile;
import io.ebean.meta.BasicMetricVisitor;
import io.ebean.meta.MetaTimedMetric;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.function.Function;
import static org.assertj.core.api.Assertions.assertThat;
public class DTimedMetricTest {
@@ -52,4 +57,37 @@ public class DTimedMetricTest {
assertThat(stats.total()).isGreaterThan(10000);
assertThat(stats.max()).isEqualTo(stats.total() / 2);
}
Function<String, String> naming = (String name) -> "prefix[" + name.replace('.', '-') + "]";
@Test
void visit() {
DTimedMetric metric = new DTimedMetric("org.timed");
metric.add(560);
metric.add(500);
{
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
metric.visit(visitor);
List<MetaTimedMetric> result = visitor.timedMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[org-timed]");
assertThat(result.get(0).count()).isEqualTo(2);
assertThat(result.get(0).total()).isEqualTo(1060);
}
metric.add(160);
metric.add(100);
metric.add(150);
{
BasicMetricVisitor visitor = new BasicMetricVisitor("v", naming);
metric.visit(visitor);
List<MetaTimedMetric> result = visitor.timedMetrics();
assertThat(result).hasSize(1);
assertThat(result.get(0).name()).isEqualTo("prefix[org-timed]");
assertThat(result.get(0).count()).isEqualTo(3);
assertThat(result.get(0).total()).isEqualTo(410);
}
}
}
+13 -9
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.6</version>
<version>13.7.0</version>
</parent>
<name>ebean ddl generation</name>
@@ -28,23 +28,27 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>provided</scope>
</dependency>
<!-- needed for java 11+ -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.6</version>
<scope>provided</scope>
<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>
<!-- test dependencies -->
@@ -58,7 +62,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.6.6</version>
<version>13.7.0</version>
<scope>test</scope>
</dependency>
@@ -11,6 +11,6 @@ public class Detect {
* Return true if JAXB is present.
*/
public static boolean isJAXBPresent(DatabaseConfig config) {
return config.getClassLoadConfig().isPresent("javax.xml.bind.JAXBException");
return config.getClassLoadConfig().isPresent("jakarta.xml.bind.JAXBException");
}
}
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.math.BigInteger;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,9 +1,9 @@
package io.ebeaninternal.dbmigration.migration;
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 jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,8 +1,8 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlEnum;
import jakarta.xml.bind.annotation.XmlEnumValue;
import jakarta.xml.bind.annotation.XmlType;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,8 +1,8 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlEnum;
import jakarta.xml.bind.annotation.XmlEnumValue;
import jakarta.xml.bind.annotation.XmlType;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.XmlRegistry;
import jakarta.xml.bind.annotation.XmlRegistry;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,6 +1,6 @@
package io.ebeaninternal.dbmigration.migration;
import javax.xml.bind.annotation.*;
import jakarta.xml.bind.annotation.*;
/**
@@ -1,2 +1,2 @@
@javax.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/dbmigration", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://ebean-orm.github.io/xml/ns/dbmigration", elementFormDefault = jakarta.xml.bind.annotation.XmlNsForm.QUALIFIED)
package io.ebeaninternal.dbmigration.migration;
@@ -3,9 +3,9 @@ package io.ebeaninternal.dbmigration.migrationreader;
import io.ebeaninternal.dbmigration.migration.Migration;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -4,9 +4,9 @@ package io.ebeaninternal.dbmigration.migrationreader;
import io.ebean.util.IOUtils;
import io.ebeaninternal.dbmigration.migration.Migration;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
@@ -1,11 +1,11 @@
package io.ebeaninternal.extraddl.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;
import javax.xml.bind.annotation.XmlValue;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlValue;
/**

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