diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c09fbd01..bf03d3b50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: uses: actions/setup-java@v2 with: java-version: ${{ matrix.java_version }} - distribution: 'adopt' + distribution: 'zulu' - name: Maven cache uses: actions/cache@v2 env: diff --git a/.github/workflows/jdk-18-ea.yml b/.github/workflows/jdk-18-ea.yml new file mode 100644 index 000000000..73121f1d4 --- /dev/null +++ b/.github/workflows/jdk-18-ea.yml @@ -0,0 +1,39 @@ + +name: JDK 18-ea + +on: + workflow_dispatch: +# schedule: +# - cron: '30 6 * * *' + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [18-ea] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'zulu' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: Build with Maven + run: mvn package + diff --git a/.github/workflows/mariadb-10.6.yml b/.github/workflows/mariadb-10.6.yml new file mode 100644 index 000000000..797e948ff --- /dev/null +++ b/.github/workflows/mariadb-10.6.yml @@ -0,0 +1,35 @@ + +name: MariaDB 10.6 + +on: [workflow_dispatch] + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: mariadb 10.6 + run: mvn clean test -Dprops.file=testconfig/ebean-mariadb.properties diff --git a/.github/workflows/multi-jdk-build.yml b/.github/workflows/multi-jdk-build.yml new file mode 100644 index 000000000..f44cfac89 --- /dev/null +++ b/.github/workflows/multi-jdk-build.yml @@ -0,0 +1,39 @@ + +name: Multi-JDK Build + +on: + workflow_dispatch: + schedule: + - cron: '30 6 * * *' + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [8.0.192, 8, 11.0.3, 11, 17] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'zulu' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: Build with Maven + run: mvn package + diff --git a/.github/workflows/multi-platform-test.yml b/.github/workflows/multi-platform-test.yml new file mode 100644 index 000000000..f85636c9b --- /dev/null +++ b/.github/workflows/multi-platform-test.yml @@ -0,0 +1,45 @@ + +name: Multi-database platform test + +on: [workflow_dispatch] + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: h2 + run: mvn clean test + - name: postgres + run: mvn clean test -Dprops.file=testconfig/ebean-postgres.properties + - name: mysql + run: mvn clean test -Dprops.file=testconfig/ebean-mysql.properties + - name: sqlserver 2019 + run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver19.properties + - name: sqlserver 2017 + run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver17.properties + - name: mariadb + run: mvn clean test -Dprops.file=testconfig/ebean-mariadb.properties diff --git a/.github/workflows/mysql.yml b/.github/workflows/mysql.yml new file mode 100644 index 000000000..3de91cb2d --- /dev/null +++ b/.github/workflows/mysql.yml @@ -0,0 +1,38 @@ + +name: MySql + +on: + workflow_dispatch: + schedule: + - cron: '20 6 * * *' + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: mysql + run: mvn clean test -Dprops.file=testconfig/ebean-mysql.properties diff --git a/.github/workflows/postgres.yml b/.github/workflows/postgres.yml new file mode 100644 index 000000000..b6359e698 --- /dev/null +++ b/.github/workflows/postgres.yml @@ -0,0 +1,38 @@ + +name: Postgres + +on: + workflow_dispatch: + schedule: + - cron: '10 6 * * *' + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: postgres + run: mvn clean test -Dprops.file=testconfig/ebean-postgres.properties diff --git a/.github/workflows/sqlserver-2017-latest.yml b/.github/workflows/sqlserver-2017-latest.yml new file mode 100644 index 000000000..83649d080 --- /dev/null +++ b/.github/workflows/sqlserver-2017-latest.yml @@ -0,0 +1,37 @@ + +name: SqlServer 2017 latest + +on: [workflow_dispatch] + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} +# - name: sqlserver 2019 latest +# run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver.properties + - name: sqlserver 2017 latest + run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver17.properties diff --git a/.github/workflows/sqlserver-2019-latest.yml b/.github/workflows/sqlserver-2019-latest.yml new file mode 100644 index 000000000..fd803655f --- /dev/null +++ b/.github/workflows/sqlserver-2019-latest.yml @@ -0,0 +1,35 @@ + +name: SqlServer 2019 latest + +on: [workflow_dispatch] + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [11] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'adopt' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: sqlserver 2019 latest + run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver19.properties diff --git a/README.md b/README.md index b92e5f720..30dc2c06b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,13 @@ [![Build](https://github.com/ebean-orm/ebean/actions/workflows/build.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/build.yml) [![Maven Central : ebean](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ebean-orm/ebean/blob/master/LICENSE) +[![Multi-JDK Build](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml) +[![JDK 18-ea](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml) + +[![Postgres](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml) +[![MySql](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml) +[![MariaDB](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml) +[![SqlServer](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml) # Sponsors diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index a6d7c9718..a27749023 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean api @@ -49,7 +49,7 @@ io.ebean ebean-annotation - 7.4-FOC3 + 7.3 diff --git a/ebean-api/pom.xml.releaseBackup b/ebean-api/pom.xml.releaseBackup new file mode 100644 index 000000000..1e711bc62 --- /dev/null +++ b/ebean-api/pom.xml.releaseBackup @@ -0,0 +1,130 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean api + ebean api + ebean-api + + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + io.avaje + avaje-config + 1.5 + + + + + io.avaje + avaje-lang + 1.0 + + + + io.ebean + persistence-api + 2.2.5 + + + + io.ebean + ebean-annotation + 7.3 + + + + io.ebean + ebean-types + 2.2 + + + + io.ebean + ebean-datasource-api + ${ebean-datasource.version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + true + + + + + com.h2database + h2 + 1.4.199 + true + + + + javax.transaction + jta + 1.1 + true + + + + javax.servlet + javax.servlet-api + 3.1.0 + true + + + + io.avaje + junit + 1.0 + test + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + diff --git a/ebean-api/src/main/java/io/ebean/DtoQuery.java b/ebean-api/src/main/java/io/ebean/DtoQuery.java index 853cfccb6..7de6c2694 100644 --- a/ebean-api/src/main/java/io/ebean/DtoQuery.java +++ b/ebean-api/src/main/java/io/ebean/DtoQuery.java @@ -2,6 +2,8 @@ package io.ebean; import io.avaje.lang.NonNullApi; import io.avaje.lang.Nullable; + +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.function.Consumer; @@ -127,6 +129,13 @@ public interface DtoQuery extends CancelableQuery { */ DtoQuery setParameter(String name, Object value); + /** + * Bind the named multi-value array parameter which we would use with Postgres ANY. + *

+ * For Postgres this binds an ARRAY rather than expands into multiple bind values. + */ + DtoQuery setArrayParameter(String name, Collection values); + /** * Bind the parameter by its index position (1 based like JDBC). */ diff --git a/ebean-api/src/main/java/io/ebean/SqlUpdate.java b/ebean-api/src/main/java/io/ebean/SqlUpdate.java index 927050d3f..9ce704922 100644 --- a/ebean-api/src/main/java/io/ebean/SqlUpdate.java +++ b/ebean-api/src/main/java/io/ebean/SqlUpdate.java @@ -1,5 +1,7 @@ package io.ebean; +import java.util.Collection; + /** * A SqlUpdate for executing insert update or delete statements. *

@@ -324,6 +326,13 @@ public interface SqlUpdate { */ SqlUpdate setParameter(String name, Object param); + /** + * Bind the named multi-value array parameter which we would use with Postgres ANY. + *

+ * For Postgres this binds an ARRAY rather than expands into multiple bind values. + */ + SqlUpdate setArrayParameter(String name, Collection values); + /** * Set a named parameter that has a null value. Exactly the same as * {@link #setNullParameter(String, int)}. diff --git a/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java b/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java index bedbd7de5..0cac9909c 100644 --- a/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java @@ -396,7 +396,7 @@ public class PlatformConfig { BINARY(false, true, false), /** - * Store using DB BINARY(16). + * Store using DB BINARY(16) with optimized packing. */ BINARY_OPTIMIZED(false, true, true); diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java index 305f38efe..61d14f4a6 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java @@ -22,8 +22,8 @@ public class DB2Platform extends DatabasePlatform { this.platform = Platform.DB2; // Note: DB2 (at least LUW supports length up to 128) // TOOD: Check if we need to introduce a new platform (DB2_LUW_11 ?) - this.maxTableNameLength = 128; - this.maxConstraintNameLength = 128; + this.maxTableNameLength = 18; + this.maxConstraintNameLength = 18; this.truncateTable = "truncate table %s reuse storage ignore delete triggers immediate"; this.sqlLimiter = new Db2SqlLimiter(); diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java index 09db19312..e936194d5 100644 --- a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java +++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java @@ -24,6 +24,7 @@ public class SQLitePlatform extends DatabasePlatform { this.dbDefaultValue.setFalse("0"); this.dbDefaultValue.setTrue("1"); this.dbDefaultValue.setNow("CURRENT_TIMESTAMP"); + this.supportsResultSetConcurrencyModeUpdatable = false; dbTypeMap.put(DbType.BIT, new DbPlatformType("int")); dbTypeMap.put(DbType.BOOLEAN, new DbPlatformType("int")); diff --git a/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java b/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java index 57930a107..2f3198b65 100644 --- a/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java +++ b/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java @@ -43,6 +43,12 @@ public interface BeanPersistRequest { return transaction(); } + /** + * Return true if this request is due to cascading persist. + * False implies this is a "top level" request. + */ + boolean isCascade(); + /** * For an update or delete of a partially populated bean this is the set of * loaded properties and otherwise returns null. diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml index 7f0540dee..5f01ea3cd 100644 --- a/ebean-autotune/pom.xml +++ b/ebean-autotune/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT @@ -13,8 +13,8 @@ - scm:git:git@github.com:FOCONIS/ebean.git - ebean-parent-12.13.1-FOC1 + scm:git:git@github.com:ebean-orm/ebean.git + HEAD ebean autotune @@ -26,7 +26,7 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided diff --git a/ebean-autotune/pom.xml.releaseBackup b/ebean-autotune/pom.xml.releaseBackup new file mode 100644 index 000000000..dc7b6c0ac --- /dev/null +++ b/ebean-autotune/pom.xml.releaseBackup @@ -0,0 +1,74 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + + + + + + + scm:git:git@github.com:ebean-orm/ebean.git + HEAD + + + ebean autotune + ebean automatic query tuning module + ebean-autotune + + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + provided + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.avaje + junit + 1.0 + test + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index 67c887218..de70b12e4 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean bom @@ -71,88 +71,88 @@ io.ebean ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-core-type - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-ddl-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-externalmapping-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-externalmapping-xml - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-autotune - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-querybean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean querybean-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean kotlin-querybean-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean ebean-test - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean ebean-postgis - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-redis - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT diff --git a/ebean-bom/pom.xml.releaseBackup b/ebean-bom/pom.xml.releaseBackup new file mode 100644 index 000000000..417420c68 --- /dev/null +++ b/ebean-bom/pom.xml.releaseBackup @@ -0,0 +1,162 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean bom + ebean bill of materials pom + ebean-bom + pom + + + + + + + + + io.ebean + ebean-ddl-runner + ${ebean-ddl-runner.version} + + + + io.ebean + ebean-migration-auto + ${ebean-migration-auto.version} + + + + io.ebean + ebean-migration + ${ebean-migration.version} + + + + io.ebean + ebean-datasource-api + ${ebean-datasource.version} + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + + + + io.ebean + ebean-agent + ${ebean-agent.version} + + + + io.ebean + ebean-maven-plugin + ${ebean-maven-plugin.version} + + + + io.ebean + ebean-test-docker + ${ebean-test-docker.version} + + + + + + io.ebean + ebean + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-api + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-core-type + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-ddl-generator + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-externalmapping-api + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-externalmapping-xml + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-autotune + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-querybean + 12.13.2-SNAPSHOT + + + + io.ebean + querybean-generator + 12.13.2-SNAPSHOT + provided + + + + io.ebean + kotlin-querybean-generator + 12.13.2-SNAPSHOT + provided + + + + io.ebean + ebean-test + 12.13.2-SNAPSHOT + test + + + + io.ebean + ebean-postgis + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-redis + 12.13.2-SNAPSHOT + + + + + + + diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index 46ac37c2b..0e4062b6f 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean-core-type @@ -16,7 +16,7 @@ io.ebean ebean-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT diff --git a/ebean-core-type/pom.xml.releaseBackup b/ebean-core-type/pom.xml.releaseBackup new file mode 100644 index 000000000..3d3e11a75 --- /dev/null +++ b/ebean-core-type/pom.xml.releaseBackup @@ -0,0 +1,46 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean-core-type + ebean core type + ebean scalar types api + + + + + io.ebean + ebean-api + 12.13.2-SNAPSHOT + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index cefd28a0f..08752f040 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -3,7 +3,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean-core @@ -14,8 +14,8 @@ https://ebean.io/ - scm:git:git@github.com:FOCONIS/ebean.git - ebean-parent-12.13.1-FOC1 + scm:git:git@github.com:ebean-orm/ebean.git + HEAD @@ -41,19 +41,19 @@ io.ebean ebean-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-core-type - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-externalmapping-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT diff --git a/ebean-core/pom.xml.releaseBackup b/ebean-core/pom.xml.releaseBackup new file mode 100644 index 000000000..b250f7a0a --- /dev/null +++ b/ebean-core/pom.xml.releaseBackup @@ -0,0 +1,247 @@ + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean-core + jar + + ebean core + ebean core module + https://ebean.io/ + + + scm:git:git@github.com:ebean-orm/ebean.git + HEAD + + + + + + io.ebean + ebean-ddl-runner + 1.2 + + + + io.avaje + classpath-scanner + 6.2 + + + + io.ebean + ebean-migration-auto + 1.1 + + + + io.ebean + ebean-api + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-core-type + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-externalmapping-api + 12.13.2-SNAPSHOT + + + + org.antlr + antlr4-runtime + 4.8-1 + + + + + io.avaje + avaje-jsr305-x + 1.1 + provided + + + + + com.h2database + h2 + 1.4.199 + provided + + + + javax.transaction + javax.transaction-api + 1.3 + true + + + + + javax.validation + validation-api + 2.0.1.Final + true + + + jakarta.validation + jakarta.validation-api + 3.0.0 + true + + + + joda-time + joda-time + 2.9.7 + true + + + + + + + + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + true + + + + + org.postgresql + postgresql + 42.2.24 + true + + + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.avaje + junit + 1.0 + test + + + + + + + + + io.ebean + ebean-maven-plugin + ${ebean-maven-plugin.version} + + + test + process-test-classes + + debug=0 + + + testEnhance + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M4 + + false + false + false + + **/Test*.java + **/*Test.java + **/*Tests.java + + + + + datasource.default + ${datasource.default} + + + + dbClockDelta + ${dbClockDelta} + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.1.1 + + Ebean 12 + src/main/java/io/ebean/overview.html + io.ebeaninternal.*:io.ebeanservice:io.ebean.common:io.ebean.bean:io.ebean.service:io.ebean.metric:io.ebean.util:io.ebean.config.properties:io.ebean.config.dbplatform + true + src/main/java/com/avaje/ebean/overview.html + + + + attach-javadocs + + jar + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + + + + diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java index 151a0b899..ca813ae14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -223,6 +223,15 @@ public final class BindParams implements Serializable { return p; } + /** + * Set a named In parameter that is multi-valued. + */ + public Param setArrayParameter(String name, Collection value) { + Param p = getParam(name); + p.setInValue(new MultiValueWrapper(value)); + return p; + } + /** * Set an encryption key as a bind value. *

diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java index 3f2e97893..222f00b9a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -24,6 +24,7 @@ import io.ebeaninternal.server.querydefn.OrmUpdateProperties; import io.ebeaninternal.server.rawsql.SpiRawSql; import java.sql.Timestamp; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -399,6 +400,11 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod List getSoftDeletePredicates(); + /** + * Bind the named multi-value array parameter which we would use with Postgres ANY. + */ + void setArrayParameter(String name, Collection values); + /** * Return a copy of the query. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java index 8f66ae6eb..756c5665f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java @@ -331,6 +331,12 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate { return this; } + @Override + public SqlUpdate setArrayParameter(String name, Collection values) { + bindParams.setArrayParameter(name, values); + return this; + } + @Override public SqlUpdate setNull(String name, int jdbcType) { bindParams.setNullParameter(name, jdbcType); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index 77651c53a..396170c63 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -217,6 +217,11 @@ public final class PersistRequestBean extends PersistRequest implements BeanP return beanDescriptor.docStoreMode(type, txnMode); } + @Override + public boolean isCascade() { + return Flags.isRecurse(flags); + } + /** * Return true if the draftDirty property should be set to true for this request. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 325213933..eba1eea95 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -208,6 +208,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final EntityBean prototypeEntityBean; private final IdBinder idBinder; + private final String idSelect; private String idBinderInLHSSql; private String idBinderIdSql; private String deleteByIdSql; @@ -349,6 +350,23 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { propertiesIndex[i] = propMap.get(ebi.getProperty(i)); } } + idSelect = initIdSelect(); + } + + String initIdSelect() { + if (idProperty != null && !idProperty.name().equals("_idClass")) { + return idProperty.name(); + } else if (entityType == EntityType.EMBEDDED) { + return null; + } else { + StringJoiner sj = new StringJoiner(","); + for (BeanProperty prop : propertiesNonMany) { + if (prop.isImportedPrimaryKey()) { + sj.add(prop.name()); + } + } + return sj.toString().intern(); + } } public boolean isJacksonCorePresent() { @@ -3011,6 +3029,10 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { return idProperty; } + public String idSelect() { + return idSelect; + } + /** * Return true if this bean should be inserted rather than updated. * diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java index c69fbb265..938a4c3d4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java @@ -23,6 +23,11 @@ abstract class BeanDescriptorElement extends BeanDescriptor { this.elementHelp = elementHelp; } + @Override + String initIdSelect() { + return null; + } + private String shortName(String name) { int pos = name.lastIndexOf('.'); if (pos > 1) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java index 5776b7ccc..7f6c3d96e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java @@ -35,8 +35,7 @@ public final class ImportedIdEmbedded implements ImportedId { BeanProperty[] embeddedProps = foreignAssocOne.properties(); for (int i = 0; i < imported.length; i++) { String n = name + "." + foreignAssocOne.name() + "." + embeddedProps[i].name(); - BeanFkeyProperty fkey = new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.deployOrder()); - owner.descriptor().add(fkey); + owner.descriptor().add(new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.deployOrder())); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java index df4c3272c..fe3e8ce2e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java @@ -88,8 +88,7 @@ public final class ImportedIdSimple implements ImportedId, Comparable type = prop.getPropertyType(); - ScalarType scalarType = typeManager.getArrayScalarType(type, dbArray, prop.getGenericType(), prop.isNullable()); + ScalarType scalarType = typeManager.getArrayScalarType(type, prop.getGenericType(), prop.isNullable()); if (scalarType == null) { throw new RuntimeException("No ScalarType for @DbArray type for [" + prop.getFullBeanName() + "]"); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java similarity index 67% rename from ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java rename to ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java index fc1859074..40fc6016b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java @@ -1,4 +1,6 @@ -package io.ebeaninternal.server.deploy; +package io.ebeaninternal.server.deploy.parse; + +import io.ebeaninternal.server.deploy.ManyType; import java.util.List; import java.util.Map; @@ -7,9 +9,9 @@ import java.util.Set; /** * Determine the Many Type for a property. */ -public final class DetermineManyType { +final class DetermineManyType { - public ManyType getManyType(Class type) { + ManyType getManyType(Class type) { if (type.equals(List.class)) { return ManyType.LIST; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java index f3cced766..0632e89f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java @@ -37,8 +37,7 @@ final class DtoMetaBuilder { if (includeMethod(method)) { try { final String name = propertyName(method.getName()); - final Class propertyType = propertyType(method); - properties.add(new DtoMetaProperty(typeManager, dtoType, method, name, propertyType)); + properties.add(new DtoMetaProperty(typeManager, dtoType, method, name)); } catch (Exception e) { CoreLog.log.debug("exclude on " + dtoType + " method " + method, e); } @@ -46,10 +45,6 @@ final class DtoMetaBuilder { } } - static Class propertyType(Method method) { - return method.getParameterTypes()[0]; - } - static String propertyName(String methodName) { final String name = methodName.substring(3); return Character.toLowerCase(name.charAt(0)) + name.substring(1); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java index fe7d794a1..b73500434 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java @@ -8,6 +8,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.sql.SQLException; final class DtoMetaProperty implements DtoReadSet { @@ -19,18 +20,30 @@ final class DtoMetaProperty implements DtoReadSet { private final MethodHandle setter; private final ScalarType scalarType; - DtoMetaProperty(TypeManager typeManager, Class dtoType, Method writeMethod, String name, Class propertyType) throws IllegalAccessException, NoSuchMethodException { + DtoMetaProperty(TypeManager typeManager, Class dtoType, Method writeMethod, String name) throws IllegalAccessException, NoSuchMethodException { this.dtoType = dtoType; this.name = name; if (writeMethod != null) { - this.setter = LOOKUP.findVirtual(dtoType, writeMethod.getName(), MethodType.methodType(void.class, propertyType)); - this.scalarType = typeManager.getScalarType(propertyType); + this.setter = lookupMethodHandle(dtoType, writeMethod); + this.scalarType = typeManager.getScalarType(propertyType(writeMethod), propertyClass(writeMethod)); } else { this.scalarType = null; this.setter = null; } } + private static MethodHandle lookupMethodHandle(Class dtoType, Method method) throws NoSuchMethodException, IllegalAccessException { + return LOOKUP.findVirtual(dtoType, method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes())); + } + + static Type propertyType(Method method) { + return method.getParameters()[0].getParameterizedType(); + } + + static Class propertyClass(Method method) { + return method.getParameterTypes()[0]; + } + String getName() { return name; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java index 5b3c49aac..8120aa093 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java @@ -14,6 +14,7 @@ import io.ebeaninternal.server.dto.DtoMappingRequest; import io.ebeaninternal.server.dto.DtoQueryPlan; import javax.annotation.Nullable; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.function.Consumer; @@ -148,6 +149,16 @@ public final class DefaultDtoQuery extends AbstractQuery implements SpiDtoQue return this; } + @Override + public DtoQuery setArrayParameter(String paramName, Collection values) { + if (ormQuery != null) { + ormQuery.setArrayParameter(paramName, values); + } else { + bindParams.setArrayParameter(paramName, values); + } + return this; + } + @Override public DtoQuery setParameters(Object... values) { if (ormQuery != null) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 908490080..307b2713c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -586,9 +586,9 @@ public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery< */ @Override public void setSelectId() { - // clear select and fetch joins.. + // clear select and fetch joins detail.clear(); - select(beanDescriptor.idBinder().getIdProperty()); + select(beanDescriptor.idSelect()); } @Override @@ -1586,6 +1586,17 @@ public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery< return this; } + @Override + public void setArrayParameter(String name, Collection values) { + if (namedParams != null) { + throw new IllegalStateException("setArrayParameter() not supported when EQL parsed query"); + } + if (bindParams == null) { + bindParams = new BindParams(); + } + bindParams.setArrayParameter(name, values); + } + @Override public boolean checkPagingOrderBy() { return orderById && !useDocStore; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index f2c86bda9..8c0179a6c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -289,6 +289,18 @@ public final class DefaultTypeManager implements TypeManager { return nativeMap.get(jdbcType); } + @Override + public ScalarType getScalarType(Type propertyType, Class propertyClass) { + if (propertyType instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType)propertyType; + Type rawType = pt.getRawType(); + if (List.class == rawType || Set.class == rawType) { + return getArrayScalarType((Class)rawType, propertyType, true); + } + } + return getScalarType(propertyClass); + } + /** * This can return null if no matching ScalarType is found. */ @@ -327,7 +339,7 @@ public final class DefaultTypeManager implements TypeManager { } @Override - public ScalarType getArrayScalarType(Class type, DbArray dbArray, Type genericType, boolean nullable) { + public ScalarType getArrayScalarType(Class type, Type genericType, boolean nullable) { Type valueType = getValueType(genericType); if (type.equals(List.class)) { return getArrayScalarTypeList(valueType, nullable); @@ -366,12 +378,10 @@ public final class DefaultTypeManager implements TypeManager { Type genericType = prop.getGenericType(); boolean hasJacksonAnnotations = objectMapperPresent && checkJacksonAnnotations(prop); - boolean keepSource = prop.getMutationDetection() == MutationDetection.SOURCE - || (prop.getMutationDetection() == MutationDetection.DEFAULT && defaultJsonMutationDetection == MutationDetection.SOURCE); if (type.equals(List.class)) { DocPropertyType docType = getDocType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource); + return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); } else { return createJsonObjectMapperType(prop, dbType, docType); } @@ -379,14 +389,14 @@ public final class DefaultTypeManager implements TypeManager { if (type.equals(Set.class)) { DocPropertyType docType = getDocType(genericType); if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) { - return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource); + return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop)); } else { return createJsonObjectMapperType(prop, dbType, docType); } } if (type.equals(Map.class)) { if (!hasJacksonAnnotations && isMapValueTypeObject(genericType)) { - return ScalarTypeJsonMap.typeFor(postgres, dbType, keepSource); + return ScalarTypeJsonMap.typeFor(postgres, dbType, jsonManager.keepSource(prop)); } else { return createJsonObjectMapperType(prop, dbType, DocPropertyType.OBJECT); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java index 97592fb34..ec0808f14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java @@ -19,8 +19,13 @@ final class JsonTrim { for (int i = 0; i < len; i++) { char c = json.charAt(i); if (c == '\"') { - if (!escaped) quoted = !quoted; - else escaped = false; + if (!escaped) { + quoted = !quoted; + } else { + escaped = false; + } + } else if (escaped) { + escaped = false; } else if (quoted && c == '\\') { escaped = true; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java index 6660a9f39..25034e409 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.ebean.ModifyAwareType; import io.ebean.annotation.MutationDetection; import io.ebean.config.dbplatform.DbPlatformType; +import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; final class TypeJsonManager { @@ -25,6 +26,17 @@ final class TypeJsonManager { return objectMapper; } + boolean keepSource(DeployBeanProperty prop) { + if (prop.getMutationDetection() == MutationDetection.SOURCE) { + return true; + } else if (prop.getMutationDetection() == MutationDetection.DEFAULT) { + prop.setMutationDetection(mutationDetection); + return mutationDetection == MutationDetection.SOURCE; + } else { + return false; + } + } + String postgresType(int dbType) { if (postgres) { switch (dbType) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java index 3a7071317..692e65681 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java @@ -47,6 +47,13 @@ public interface TypeManager { */ ScalarType getScalarType(Class type, int jdbcType); + /** + * Find and return the ScalarType taking into account the property type with generics. + *

+ * For example Array based ScalarType for types like {@code List}. + */ + ScalarType getScalarType(Type propertyType, Class type); + /** * Create a ScalarType for an Enum using a mapping (rather than JPA Ordinal * or String which has limitations). @@ -64,7 +71,7 @@ public interface TypeManager { /** * Return the ScalarType used to handle DB ARRAY. */ - ScalarType getArrayScalarType(Class type, DbArray dbArray, Type genericType, boolean nullable); + ScalarType getArrayScalarType(Class type, Type genericType, boolean nullable); /** * Return the ScalarType used to handle HSTORE (Map). diff --git a/ebean-ddl-generator/pom.xml b/ebean-ddl-generator/pom.xml index 86708a1b6..4a189ed69 100644 --- a/ebean-ddl-generator/pom.xml +++ b/ebean-ddl-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean ddl generation @@ -28,14 +28,14 @@ io.ebean ebean-core-type - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided diff --git a/ebean-ddl-generator/pom.xml.releaseBackup b/ebean-ddl-generator/pom.xml.releaseBackup new file mode 100644 index 000000000..fc0e83a5f --- /dev/null +++ b/ebean-ddl-generator/pom.xml.releaseBackup @@ -0,0 +1,106 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean ddl generation + DDL and DB Migration generation + ebean-ddl-generator + + + + + io.ebean + ebean-ddl-runner + 1.2 + + + + io.ebean + ebean-migration + 12.12.1 + + + + io.ebean + ebean-core-type + 12.13.2-SNAPSHOT + provided + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + provided + + + + + io.avaje + junit + 1.0 + test + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + javax.validation + validation-api + 2.0.1.Final + test + + + + + + + + io.ebean + ebean-maven-plugin + ${ebean-maven-plugin.version} + + + test + process-test-classes + + debug=0 + + + testEnhance + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java index ec141d7f0..0bb2f7895 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java @@ -14,6 +14,7 @@ class ClickHouseDbArray { mapping.put("varchar[]", "Array(String)"); mapping.put("integer[]", "Array(UInt32)"); mapping.put("bigint[]", "Array(UInt64)"); + mapping.put("float[]", "Array(Float32)"); } /** @@ -21,6 +22,10 @@ class ClickHouseDbArray { */ static String logicalToNative(String logicalArrayType) { int colonPos = logicalArrayType.indexOf(':'); + int bracketPos = logicalArrayType.indexOf('('); + if (bracketPos > -1 && (bracketPos < colonPos || colonPos == -1)) { + colonPos = bracketPos; + } if (colonPos > -1) { logicalArrayType = logicalArrayType.substring(0, colonPos); } diff --git a/ebean-externalmapping-api/pom.xml b/ebean-externalmapping-api/pom.xml index 0834f5b86..0566534a9 100644 --- a/ebean-externalmapping-api/pom.xml +++ b/ebean-externalmapping-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean external mapping api diff --git a/ebean-externalmapping-api/pom.xml.releaseBackup b/ebean-externalmapping-api/pom.xml.releaseBackup new file mode 100644 index 000000000..72278f50b --- /dev/null +++ b/ebean-externalmapping-api/pom.xml.releaseBackup @@ -0,0 +1,30 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean external mapping api + API for mapping external named queries + ebean-externalmapping-api + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + + diff --git a/ebean-externalmapping-xml/pom.xml b/ebean-externalmapping-xml/pom.xml index 3bf48bffe..5a651b9dc 100644 --- a/ebean-externalmapping-xml/pom.xml +++ b/ebean-externalmapping-xml/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT @@ -13,8 +13,8 @@ - scm:git:git@github.com:FOCONIS/ebean.git - ebean-parent-12.13.1-FOC1 + scm:git:git@github.com:ebean-orm/ebean.git + HEAD ebean external mapping xml @@ -33,7 +33,7 @@ io.ebean ebean-externalmapping-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT @@ -59,14 +59,14 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean ebean-ddl-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test diff --git a/ebean-externalmapping-xml/pom.xml.releaseBackup b/ebean-externalmapping-xml/pom.xml.releaseBackup new file mode 100644 index 000000000..8155aa728 --- /dev/null +++ b/ebean-externalmapping-xml/pom.xml.releaseBackup @@ -0,0 +1,100 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + + + + + + + scm:git:git@github.com:ebean-orm/ebean.git + HEAD + + + ebean external mapping xml + XML implementation for mapping external named queries + ebean-externalmapping-xml + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + io.ebean + ebean-externalmapping-api + 12.13.2-SNAPSHOT + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + + + + io.avaje + classpath-scanner + 6.2 + + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + test + + + + io.ebean + ebean-ddl-generator + 12.13.2-SNAPSHOT + test + + + + io.avaje + junit + 1.0 + test + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + diff --git a/ebean-kotlin/pom.xml b/ebean-kotlin/pom.xml new file mode 100644 index 000000000..22fafea6c --- /dev/null +++ b/ebean-kotlin/pom.xml @@ -0,0 +1,104 @@ + + + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + 4.0.0 + + ebean-kotlin + + + 1.8 + 1.8 + 12.13.0 + 1.6.0 + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + provided + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + io.avaje + junit + 1.0 + test + + + + io.ebean + ebean-test + 12.13.2-SNAPSHOT + test + + + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + 1.8 + + + + compile + + compile + + + + test-compile + + test-compile + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.13.1 + + + + + + + + diff --git a/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt new file mode 100644 index 000000000..f1bc6d753 --- /dev/null +++ b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt @@ -0,0 +1,18 @@ +package org.example.domain + +import io.ebean.Model +import javax.persistence.Entity +import javax.persistence.Id +import javax.persistence.Version + +@Entity +class FooEntity(name: String) : Model() { + + @Id + var id: Long = 0 + + var name: String = name + + @Version + var version: Long = 0 +} diff --git a/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt new file mode 100644 index 000000000..ef94f3b48 --- /dev/null +++ b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt @@ -0,0 +1,21 @@ +package org.example.domain + +import io.ebean.DB +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class FooEntityTest { + + @Test + fun iud() { + + val foo = FooEntity("hello") + foo.save() + + val found = DB.find(FooEntity::class.java, foo.id) + assertThat(found).isNotNull + + found?.delete() + + } +} diff --git a/ebean-kotlin/src/test/resources/application-test.yaml b/ebean-kotlin/src/test/resources/application-test.yaml new file mode 100644 index 000000000..310638fcb --- /dev/null +++ b/ebean-kotlin/src/test/resources/application-test.yaml @@ -0,0 +1,4 @@ +ebean: + test: + platform: h2 + diff --git a/ebean-postgis/pom.xml b/ebean-postgis/pom.xml index a04e1f401..0862a5696 100644 --- a/ebean-postgis/pom.xml +++ b/ebean-postgis/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean postgis @@ -23,7 +23,7 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided @@ -74,7 +74,7 @@ io.ebean ebean-test - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test diff --git a/ebean-postgis/pom.xml.releaseBackup b/ebean-postgis/pom.xml.releaseBackup new file mode 100644 index 000000000..3d1fa16d0 --- /dev/null +++ b/ebean-postgis/pom.xml.releaseBackup @@ -0,0 +1,118 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean postgis + ebean postgis module + https://ebean.io/ + + ebean-postgis + + + 2.2.1 + + + + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + true + + + + net.postgis + postgis-jdbc + [${postgis.jdbc.version}] + + + + + org.postgresql + postgresql + 42.2.24 + provided + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + + org.geolatte + geolatte-geom + 1.0.6 + provided + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.ebean + ebean-test + 12.13.2-SNAPSHOT + test + + + + org.avaje.composite + logback + 1.1 + test + + + + io.avaje + junit + 1.0 + test + + + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + + + diff --git a/ebean-querybean/pom.xml b/ebean-querybean/pom.xml index 2ade3c32d..a6e2507d7 100644 --- a/ebean-querybean/pom.xml +++ b/ebean-querybean/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean querybean @@ -17,7 +17,7 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided @@ -56,21 +56,21 @@ io.ebean ebean-ddl-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean querybean-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean ebean-test - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test diff --git a/ebean-querybean/pom.xml.releaseBackup b/ebean-querybean/pom.xml.releaseBackup new file mode 100644 index 000000000..5ed7e1669 --- /dev/null +++ b/ebean-querybean/pom.xml.releaseBackup @@ -0,0 +1,112 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean querybean + Ebean querybean support + ebean-querybean + + + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + + io.avaje + avaje-lang + 1.0 + + + + joda-time + joda-time + 1.6 + true + + + + javax.validation + validation-api + 2.0.1.Final + true + + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.ebean + ebean-ddl-generator + 12.13.2-SNAPSHOT + test + + + + io.ebean + querybean-generator + 12.13.2-SNAPSHOT + test + + + + io.ebean + ebean-test + 12.13.2-SNAPSHOT + test + + + + io.avaje + junit + 1.0 + test + + + + org.avaje.composite + logback + 1.1 + test + + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + + diff --git a/ebean-redis/pom.xml b/ebean-redis/pom.xml index f018334c4..dca810bd2 100644 --- a/ebean-redis/pom.xml +++ b/ebean-redis/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean-redis @@ -22,35 +22,35 @@ io.ebean ebean-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean ebean-querybean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean querybean-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test io.ebean ebean-test - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test diff --git a/ebean-redis/pom.xml.releaseBackup b/ebean-redis/pom.xml.releaseBackup new file mode 100644 index 000000000..7ada5696b --- /dev/null +++ b/ebean-redis/pom.xml.releaseBackup @@ -0,0 +1,93 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean-redis + ebean redis + Ebean Redis L2 Cache + + + + + redis.clients + jedis + 3.6.3 + + + + io.ebean + ebean-api + 12.13.2-SNAPSHOT + provided + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + io.ebean + ebean-querybean + 12.13.2-SNAPSHOT + test + + + + io.ebean + querybean-generator + 12.13.2-SNAPSHOT + test + + + + io.ebean + ebean-test + 12.13.2-SNAPSHOT + test + + + + io.avaje + junit + 1.0 + test + + + + org.avaje.composite + logback + 1.1 + test + + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + + + diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index a4cd127e4..af698ce97 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean test @@ -29,14 +29,14 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT provided io.ebean ebean-ddl-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT diff --git a/ebean-test/pom.xml.releaseBackup b/ebean-test/pom.xml.releaseBackup new file mode 100644 index 000000000..b015a4544 --- /dev/null +++ b/ebean-test/pom.xml.releaseBackup @@ -0,0 +1,261 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean test + Testing support for Ebean + ebean-test + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + provided + + + + io.ebean + ebean-ddl-generator + 12.13.2-SNAPSHOT + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + true + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + true + + + + io.ebean + ebean-test-docker + 4.3 + + + + org.assertj + assertj-core + 3.14.0 + + + + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + + + + + com.h2database + h2 + 1.4.199 + + + + + + io.avaje + avaje-jsr305 + 1.1 + test + + + + io.ebean + ebean-migration + 12.12.1 + test + + + + io.avaje + mod-uuid + 1.1 + test + + + + javax.transaction + jta + 1.1 + test + + + + + javax.validation + validation-api + 2.0.1.Final + test + + + + jakarta.validation + jakarta.validation-api + 3.0.0 + test + + + + joda-time + joda-time + 2.9.7 + test + + + + javax.annotation + javax.annotation-api + 1.3.2 + test + + + commons-io + commons-io + 2.7 + test + + + + org.postgresql + postgresql + 42.2.24 + + + org.checkerframework + checker-qual + + + test + + + + com.microsoft.sqlserver + mssql-jdbc + 9.4.0.jre8 + test + + + + mysql + mysql-connector-java + 8.0.26 + test + + + + org.mariadb.jdbc + mariadb-java-client + 2.6.0 + test + + + + com.sap.cloud.db.jdbc + ngdbc + 2.3.48 + test + + + + com.oracle.database.jdbc + + ojdbc8 + 19.12.0.0 + test + + + + com.ibm.db2 + jcc + 11.5.6.0 + test + + + + org.xerial + sqlite-jdbc + 3.36.0.3 + test + + + + com.nuodb.jdbc + nuodb-jdbc + 22.0.0 + test + + + + ru.yandex.clickhouse + clickhouse-jdbc + 0.3.1-patch + test + + + + ch.qos.logback + logback-classic + 1.2.3 + test + + + + io.avaje + junit + 1.0 + test + + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.ebean.tile:enhancement:12.11.3 + io.avaje.tile:moditech-module:1.0 + + + + + + + + diff --git a/ebean-test/src/test/java/io/ebean/DtoQueryTest.java b/ebean-test/src/test/java/io/ebean/DtoQueryTest.java index 53b2b4ca4..f41928909 100644 --- a/ebean-test/src/test/java/io/ebean/DtoQueryTest.java +++ b/ebean-test/src/test/java/io/ebean/DtoQueryTest.java @@ -208,19 +208,33 @@ public class DtoQueryTest extends BaseTestCase { ResetBasicData.reset(); + LoggedSql.start(); List ids = Arrays.asList(1, 2); - List list = server().findDto(DCust.class, "select id, name from o_customer where id = any(?)") + List list = DB.findDto(DCust.class, "select id, name from o_customer where id = any(?)") .setParameter(ids) .findList(); assertThat(list).isNotEmpty(); - list = server().findDto(DCust.class, "select id, name from o_customer where id in (:idList)") + List list1 = DB.findDto(DCust.class, "select id, name from o_customer where id in (:idList)") .setParameter("idList", ids) .findList(); - assertThat(list).isNotEmpty(); + assertThat(list1).isNotEmpty(); + + + List list2 = DB.findDto(DCust.class, "select id, name from o_customer where id = any(:idList)") + .setArrayParameter("idList", ids) + .findList(); + + assertThat(list2).isNotEmpty(); + + List sql = LoggedSql.stop(); + assertThat(sql).hasSize(3); + assertThat(sql.get(0)).contains(" id = any(?)"); + assertThat(sql.get(1)).contains(" id in (?,?)"); + assertThat(sql.get(2)).contains(" id = any(?)"); } @ForPlatform(Platform.POSTGRES) diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java index 3d476132c..bd75d835c 100644 --- a/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java +++ b/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java @@ -34,8 +34,10 @@ public class DtoMetaBuilderTest { Map methods = getIncludedMethodsFor(D0.class); assertThat(methods).hasSize(2); - assertThat(DtoMetaBuilder.propertyType(methods.get("setName"))).isEqualTo(String.class); - assertThat(DtoMetaBuilder.propertyType(methods.get("setId"))).isEqualTo(long.class); + assertThat(DtoMetaProperty.propertyClass(methods.get("setName"))).isEqualTo(String.class); + assertThat(DtoMetaProperty.propertyClass(methods.get("setId"))).isEqualTo(long.class); + assertThat(DtoMetaProperty.propertyType(methods.get("setName"))).isEqualTo(String.class); + assertThat(DtoMetaProperty.propertyType(methods.get("setId"))).isEqualTo(long.class); } @Test diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java index 3762cd51b..3c3055151 100644 --- a/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java +++ b/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java @@ -5,25 +5,32 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class BasicProfileLocationTest { +class BasicProfileLocationTest { @Test - public void obtain() { + void obtain() { DProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric("junk")); + String javaVersion = System.getProperty("java.version"); assertThat(loc.obtain()).isTrue(); - assertThat(loc.fullLocation()).endsWith(":12)"); - if (System.getProperty("java.version").startsWith("1.8")) { + if (javaVersion.startsWith("1.8")) { + assertThat(loc.fullLocation()).endsWith("invoke0(Native Method:12)"); assertThat(loc.location()).isEqualTo("sun.reflect.NativeMethodAccessorImpl.invoke0"); + assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0"); + } else if (javaVersion.startsWith("18")){ + assertThat(loc.fullLocation()).endsWith("jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)"); + assertThat(loc.location()).isEqualTo("java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke"); + assertThat(loc.label()).isEqualTo("DirectMethodHandleAccessor.invoke"); } else { + assertThat(loc.fullLocation()).endsWith("jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method:12)"); assertThat(loc.location()).isEqualTo("java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0"); + assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0"); } - assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0"); } @Test - public void basic_trimPackage() { + void basic_trimPackage() { BasicProfileLocation loc = new BasicProfileLocation("com.foo.Bar.all"); assertThat(loc.obtain()).isFalse(); @@ -33,7 +40,7 @@ public class BasicProfileLocationTest { } @Test - public void basic_trimSinglePackage() { + void basic_trimSinglePackage() { BasicProfileLocation loc = new BasicProfileLocation("foo.Bar.all"); assertThat(loc.obtain()).isFalse(); diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java index c08ceeab7..27d1ad8f9 100644 --- a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java +++ b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java @@ -5,17 +5,59 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class JsonTrimTest { +class JsonTrimTest { @Test - public void trim_array() { + void trim_array() { final String trimmed = JsonTrim.trim("[{\"name\": \"one\", \"along\": 1, \"timestamp\": 1629609021559}, {\"name\": \"two\", \"along\": 2, \"timestamp\": 1629609021559}]"); assertThat(trimmed).isEqualTo("[{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559},{\"name\":\"two\",\"along\":2,\"timestamp\":1629609021559}]"); } @Test - public void trim_object() { + void trim_object() { final String trimmed = JsonTrim.trim("{\"name\": \"one\",\t \t \"along\": 1, \"timestamp\": 1629609021559}"); assertThat(trimmed).isEqualTo("{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559}"); } + + @Test + void trim_object_embeddedEscapeSlash() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\nf\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\nf\",\"b\":1}"); + } + + @Test + void trim_escapedTabNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\",\"b\":1}"); + } + + @Test + void trim_leadingEscapedNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"\\no\\t\\nf\\n\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"\\no\\t\\nf\\n\",\"b\":1}"); + } + + @Test + void trim_trailingEscapedNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\n\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\n\",\"b\":1}"); + } + + @Test + void trim_trailingEscapedSlash() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\\\\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\\\\",\"b\":1}"); + } + + @Test + void trim_object_embeddedEscaped() { + final String trimmed = JsonTrim.trim("{\"name\": \"one\nfoo\nbar\\bazz\tboo\",\t \t \n \"along\": 1}"); + assertThat(trimmed).isEqualTo("{\"name\":\"one\nfoo\nbar\\bazz\tboo\",\"along\":1}"); + } + + @Test + void trim_escaped() { + final String trimmed = JsonTrim.trim(" \t \n {\"a\": \n \"\\t1\\t2\\n3\\\\\",\t \n \"b\": \"\\t1\\t2\\n3\\\\\" , \t \n \"c\": \"\\t1\\t2\\n3\\\\\" \t \n }"); + assertThat(trimmed).isEqualTo("{\"a\":\"\\t1\\t2\\n3\\\\\",\"b\":\"\\t1\\t2\\n3\\\\\",\"c\":\"\\t1\\t2\\n3\\\\\"}"); + } } diff --git a/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java b/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java index 47eb98793..a72f07264 100644 --- a/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java +++ b/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java @@ -13,13 +13,12 @@ import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; -public class TestLoadBeanCache extends BaseTestCase { +class TestLoadBeanCache extends BaseTestCase { @Test - public void testLoad() { + void testLoad() { ResetBasicData.reset(); @@ -35,32 +34,29 @@ public class TestLoadBeanCache extends BaseTestCase { // this will hit the cache Country nz = DB.find(Country.class, "NZ"); - assertTrue(loadedNz == nz); + assertSame(loadedNz, nz); } - + @Test - public void testLoadWithFindMap() { + void testLoadWithFindMap() { ResetBasicData.reset(); - + List ids = DB.find(Customer.class).findIds(); - assertEquals(ids.size(), 4); + assertThat(ids).isNotEmpty(); DB.getDefault().pluginApi().cacheManager().clearAll(); - + // hit database LoggedSql.start(); DB.find(Customer.class).where().idIn(ids).findMap(); List sql = LoggedSql.stop(); assertThat(sql).hasSize(1); - + // hit beanCache LoggedSql.start(); DB.find(Customer.class).where().idIn(ids).findMap(); sql = LoggedSql.stop(); assertThat(sql).hasSize(0); - } - - } diff --git a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java index 54f26782e..c67e63c4a 100644 --- a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java +++ b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java @@ -5,13 +5,15 @@ import io.ebean.BaseTestCase; import io.ebean.DB; import org.junit.jupiter.api.Test; import org.tests.model.basic.TWithPreInsert; +import org.tests.model.basic.TWithPreInsertChild; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; -public class TestPreInsertValidation extends BaseTestCase { +class TestPreInsertValidation extends BaseTestCase { @Test - public void test() { + void test() { TWithPreInsert e = new TWithPreInsert(); e.setTitle("Mister"); @@ -22,15 +24,45 @@ public class TestPreInsertValidation extends BaseTestCase { // the save worked and name set in preInsert assertNotNull(e.getId()); assertNotNull(e.getName()); + assertThat(e.requestCascadeState()).isEqualTo(2); TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId()); e1.setTitle("Missus"); DB.save(e1); + + assertThat(e1.requestCascadeState()).isEqualTo(12); } @Test - public void testStatelessUpdate() { + void test_cascade() { + + TWithPreInsert e = new TWithPreInsert(); + e.setTitle("ParentCascading"); + e.children().add(new TWithPreInsertChild("Child0")); + // the perInsert should populate the + // name with should not be null + DB.save(e); + + // the save worked and name set in preInsert + assertNotNull(e.getId()); + assertNotNull(e.getName()); + assertThat(e.requestCascadeState()).isEqualTo(2); + assertThat(e.children().get(0).requestCascadeState()).isEqualTo(1); + + TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId()); + assert e1 != null; + + e1.setTitle("ParentCascading-changed"); + e1.children().get(0).setName("Child0-changed"); + DB.save(e1); + + assertThat(e1.requestCascadeState()).isEqualTo(12); + assertThat(e1.children().get(0).requestCascadeState()).isEqualTo(11); + } + + @Test + void testStatelessUpdate() { TWithPreInsert e = new TWithPreInsert(); e.setName("BeanForUpdateTest"); diff --git a/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java b/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java new file mode 100644 index 000000000..9a2d5d6ca --- /dev/null +++ b/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java @@ -0,0 +1,63 @@ +package org.tests.json; + +import io.ebean.Database; +import io.ebean.DatabaseFactory; +import io.ebean.ValuePair; +import io.ebean.annotation.ForPlatform; +import io.ebean.annotation.MutationDetection; +import io.ebean.annotation.Platform; +import io.ebean.config.DatabaseConfig; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.tests.model.json.EBasicJsonList; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class TestJsonSourceDefault { + + @Test + @ForPlatform(Platform.H2) + @Disabled + void testDirtyValues_diffSource() { + DatabaseConfig config = new DatabaseConfig(); + config.getDataSourceConfig() + .setUsername("sa") + .setPassword("") + .setUrl("jdbc:h2:mem:testJsonSourceDirtyValues"); + + config.setName("jsonSource"); + config.setDefaultServer(false); + config.setRegister(false); + config.setDdlGenerate(true); + config.setDdlRun(true); + config.setDdlExtra(false); + config.addClass(EBasicJsonList.class); + config.setJsonMutationDetection(MutationDetection.SOURCE); + Database db = DatabaseFactory.create(config); + try { + assertThat(db).isNotNull(); + + EBasicJsonList bean = new EBasicJsonList(); + bean.getTags().add("aa"); + bean.getTags().add("bb"); + + db.save(bean); + bean = db.find(EBasicJsonList.class, bean.getId()); + + bean.getTags().add("cc"); + final Map dirtyValues = db.beanState(bean).dirtyValues(); + assertThat(dirtyValues).containsOnlyKeys("tags"); + + final ValuePair diff = dirtyValues.get("tags"); + assertThat(diff.getOldValue()).isInstanceOf(List.class).asList().containsExactly("aa", "bb"); + assertThat(diff.getNewValue()).isInstanceOf(List.class).asList().containsExactly("aa", "bb", "cc"); + } finally { + if (db != null) { + db.shutdown(); + } + } + } +} diff --git a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java index 69328ce15..0a4b1a0fb 100644 --- a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java +++ b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java @@ -1,9 +1,6 @@ package org.tests.model.array; -import io.ebean.BaseTestCase; -import io.ebean.DB; -import io.ebean.Query; -import io.ebean.SqlRow; +import io.ebean.*; import io.ebean.annotation.ForPlatform; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; @@ -272,4 +269,123 @@ public class TestDbArray_basic extends BaseTestCase { assertThat(found.getUids()).hasSameElementsAs(uids); assertThat(found.getStatuses()).hasSameElementsAs(statuses); } + + @Test + @ForPlatform(Platform.POSTGRES) + public void asDto_withArray() { + DB.find(EArrayBean.class).delete(); + bean.setName("array in dto test"); + + List phNumbers = bean.getPhoneNumbers(); + phNumbers.add("4321"); + phNumbers.add("9823"); + List doubs = bean.getDoubs(); + doubs.add(1.23); + doubs.add(4.56); + DB.save(bean); + // Data is saved correctly + + LoggedSql.start(); + DtoQuery query = DB.find(EArrayBean.class) + // Interestingly writing `select("id,name,phone_numbers,doubs")` + // generates `select t0.id, t0.name, t0.id, t0.doubs` + // surprisingly changing unknown property to id + .select("id,name,phoneNumbers,doubs") + .asDto(EArrayBeanDto.class) + // Shouldn't be necessary + // But without it I see error + // Unable to map DB column phone_numbers to a property with a setter method on class org.tests.model.array.TestDbArray_basic$EArrayBeanDto + .setRelaxedMode(); + + List dtos = query.findList(); + + List sql = LoggedSql.stop(); + assertSql(sql.get(0)).contains("select t0.id, t0.name, t0.phone_numbers, t0.doubs"); + + for (EArrayBeanDto dto : dtos) { + assertThat(dto.id).isNotNull(); + assertThat(dto.name).isNotNull(); + // Failure: null + assertThat(dto.phoneNumbers).isNotNull(); + // Failure: null + assertThat(dto.doubs).isNotNull(); + } + } + + @Test + @ForPlatform(Platform.POSTGRES) + public void sqlUpdate_withArray() { + DB.find(EArrayBean.class).delete(); + bean.setName("array in sql update test"); + DB.save(bean); + // Data is saved correctly + List phNumbers = new ArrayList<>(); + phNumbers.add("4321"); + phNumbers.add("9823"); + + LoggedSql.start(); + + // Positional param works + SqlUpdate update1 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = ?") + .setParameter(1, phNumbers); + update1.execute(); + System.out.println("done"); + + // Named param fails with + // javax.persistence.PersistenceException: + // ERROR: syntax error at or near "$2" + SqlUpdate update2 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = :pns") + .setArrayParameter("pns", phNumbers); + update2.execute(); + + found = DB.find(EArrayBean.class, bean.getId()); + System.out.println(found); + assertEquals("array in sql update test", found.getName()); + assertThat(found.getPhoneNumbers()).containsExactly("4321", "9823"); + } + + public static class EArrayBeanDto { + + Integer id; + List phoneNumbers; + List doubs; + String name; + + @Override + public String toString() { + return "id:" + id + " name:" + name + " phoneNumbers:" + phoneNumbers + " doubs:" + doubs; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + + public List getDoubs() { + return doubs; + } + + public void setDoubs(List doubs) { + this.doubs = doubs; + } + } } diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java index f93378240..21398bc7a 100644 --- a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java +++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java @@ -2,10 +2,15 @@ package org.tests.model.basic; import javax.persistence.Entity; import javax.persistence.Id; +import javax.persistence.OneToMany; import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +import static javax.persistence.CascadeType.PERSIST; @Entity -public class TWithPreInsert { +public class TWithPreInsert implements TWithPreInsertCommon { @Id private Integer id; @@ -15,6 +20,14 @@ public class TWithPreInsert { private String title; + @OneToMany(cascade = PERSIST) + private List children = new ArrayList<>(); + + /** + * For testing what happened in persist controller. + */ + transient int requestCascadeState; + public Integer getId() { return id; } @@ -39,4 +52,15 @@ public class TWithPreInsert { this.title = title; } + public List children() { + return children; + } + + public int requestCascadeState() { + return requestCascadeState; + } + + public void requestCascadeState(int requestCascadeState) { + this.requestCascadeState = requestCascadeState; + } } diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java new file mode 100644 index 000000000..39a1d8dff --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java @@ -0,0 +1,58 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.validation.constraints.NotNull; + +@Entity +public class TWithPreInsertChild implements TWithPreInsertCommon { + + @Id + private Integer id; + + @NotNull + private String name; + + private String title; + + /** + * For testing what happened in persist controller. + */ + transient int requestCascadeState; + + public TWithPreInsertChild(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int requestCascadeState() { + return requestCascadeState; + } + + public void requestCascadeState(int requestCascadeState) { + this.requestCascadeState = requestCascadeState; + } +} diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java new file mode 100644 index 000000000..dc61e28ba --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java @@ -0,0 +1,14 @@ +package org.tests.model.basic; + +public interface TWithPreInsertCommon { + + String getName(); + + void setName(String name); + + String getTitle(); + + void setTitle(String title); + + void requestCascadeState(int requestCascadeState); +} diff --git a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java index 41b6fe141..03143d385 100644 --- a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java +++ b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java @@ -2,36 +2,33 @@ package org.tests.model.basic.event; import io.ebean.event.BeanPersistAdapter; import io.ebean.event.BeanPersistRequest; -import org.tests.model.basic.TWithPreInsert; +import org.tests.model.basic.TWithPreInsertCommon; public class TWithPreInsertPersistAdapter extends BeanPersistAdapter { @Override public boolean isRegisterFor(Class cls) { - return TWithPreInsert.class.equals(cls); + return TWithPreInsertCommon.class.isAssignableFrom(cls); } @Override public boolean preInsert(BeanPersistRequest request) { - - TWithPreInsert e = (TWithPreInsert) request.bean(); - if (e.getName() == null) { - e.setName("set on preInsert"); + TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean(); + if (bean.getName() == null) { + bean.setName("set on preInsert"); } + bean.requestCascadeState(request.isCascade() ? 1 : 2); return true; } @Override public boolean preUpdate(BeanPersistRequest request) { - - TWithPreInsert b = (TWithPreInsert) request.bean(); - System.out.println("preUpdate - title is: " + b.getTitle()); - if (b.getTitle() == null) { - b.setTitle("set on preUpdate"); + TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean(); + System.out.println("preUpdate - title is: " + bean.getTitle()); + if (bean.getTitle() == null) { + bean.setTitle("set on preUpdate"); } - // request.getEbeanServer().refresh(b); - // System.out.println("title is Mister:"+b.getTitle()); - + bean.requestCascadeState(request.isCascade() ? 11 : 12); return super.preUpdate(request); } diff --git a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java index 78952eb7a..2cedcc84d 100644 --- a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java +++ b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java @@ -6,18 +6,19 @@ import io.ebean.Transaction; import io.ebean.test.LoggedSql; import org.junit.jupiter.api.Test; +import java.util.Arrays; import java.util.List; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -public class TestIdClassScalar extends BaseTestCase { +class TestIdClassScalar extends BaseTestCase { - private BUser user = new BUser("Fiona"); - private BSite site = new BSite("avaje.io"); + private final BUser user = new BUser("Fiona"); + private final BSite site = new BSite("avaje.io"); @Test - public void testBEmbId_equalsHashcode() { + void testBEmbId_equalsHashcode() { BEmbId a = new BEmbId(UUID.randomUUID(), UUID.randomUUID()); BEmbId b = new BEmbId(a.getSiteId(), a.getUserId()); @@ -35,13 +36,11 @@ public class TestIdClassScalar extends BaseTestCase { assertThat(a).isNotEqualTo(d); assertThat(a.hashCode()).isNotEqualTo(d.hashCode()); - assertThat(a.hashCode()).isEqualTo(a.otherHash()); - } @Test - public void fetchMany() { + void fetchMany() { UUID siteId = UUID.randomUUID(); UUID userId = UUID.randomUUID(); @@ -59,7 +58,7 @@ public class TestIdClassScalar extends BaseTestCase { } @Test - public void insertBatch() { + void insertBatch() { UUID siteId = UUID.randomUUID(); UUID userId = UUID.randomUUID(); @@ -81,11 +80,9 @@ public class TestIdClassScalar extends BaseTestCase { } @Test - public void test() { - + void test() { DB.save(user); DB.save(site); - insertUpdateBridgeD(user, site); insertUpdateBridgeE(user, site); } @@ -94,7 +91,6 @@ public class TestIdClassScalar extends BaseTestCase { * Test where matching by db column naming convention. */ private void insertUpdateBridgeD(BUser user, BSite site) { - LoggedSql.start(); BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id); @@ -139,7 +135,6 @@ public class TestIdClassScalar extends BaseTestCase { * Test where matching by db column naming convention. */ private void insertUpdateBridgeE(BUser user, BSite site) { - LoggedSql.start(); BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user); @@ -181,4 +176,47 @@ public class TestIdClassScalar extends BaseTestCase { assertSql(sql.get(1)).contains("update bsite_user_e set access_level=? where site_id=? and user_id=?"); } + + @Test + void idClass_existsQuery() { + BUser user = new BUser("JunkUser2"); + BSite site = new BSite("JunkSite2"); + BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user); + + DB.save(user); + DB.save(site); + DB.save(access); + + boolean exists = DB.find(BSiteUserE.class) + .where().eq("user.id", user.id) + .exists(); + + assertThat(exists).isTrue(); + assertThat(DB.find(BSiteUserE.class).where().eq("user.id", user.id).findCount()).isEqualTo(1); + + DB.delete(access); + DB.deleteAll(Arrays.asList(user, site)); + } + + @Test + void idClass_existsQuery_scalarImportedProperties() { + BUser user = new BUser("JunkUser3"); + BSite site = new BSite("JunkSite3"); + DB.save(user); + DB.save(site); + + BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id); + DB.save(access); + + boolean exists = DB.find(BSiteUserD.class) + .where().eq("userId", user.id) + .exists(); + + assertThat(exists).isTrue(); + assertThat(DB.find(BSiteUserD.class).where().eq("userId", user.id).findCount()).isEqualTo(1); + + DB.delete(access); + DB.deleteAll(Arrays.asList(user, site)); + } + } diff --git a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java index 3f3f8342d..fa99f45da 100644 --- a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java +++ b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java @@ -10,11 +10,10 @@ import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; -public class TestElementCollectionBasicSet extends BaseTestCase { +class TestElementCollectionBasicSet extends BaseTestCase { @Test - public void test() { - + void test() { LoggedSql.start(); EcsPerson person = new EcsPerson("Fiona021"); @@ -172,8 +171,7 @@ public class TestElementCollectionBasicSet extends BaseTestCase { } @Test - public void json() { - + void json() { EcsPerson person = new EcsPerson("Fiona021"); person.getPhoneNumbers().add("021 1234"); person.getPhoneNumbers().add("021 4321"); diff --git a/ebean-test/src/test/resources/ebean.properties b/ebean-test/src/test/resources/ebean.properties index fc154b2c8..402facaab 100644 --- a/ebean-test/src/test/resources/ebean.properties +++ b/ebean-test/src/test/resources/ebean.properties @@ -25,7 +25,7 @@ ebean.packages=org.tests,org.etest datasource.default=h2 #datasource.h2.capturestacktrace=true -ebean.dumpMetricsOnShutdown=true +#ebean.dumpMetricsOnShutdown=true ebean.dumpMetricsOptions=sql,hash,loc #ebean.queryPlan.thresholdMicros=1000 ebean.queryPlan.enable=true @@ -182,7 +182,7 @@ datasource.nuodb.url=jdbc:com.nuodb://localhost/testdb #datasource.nuodb.driver=com.nuodb.jdbc.Driver datasource.db2.username=unit -datasource.db2.password=unit +datasource.db2.password=test datasource.db2.url=jdbc:db2://127.0.0.1:50000/unit #datasource.db2.driver=com.ibm.db2.jcc.DB2Driver diff --git a/ebean-test/testconfig/ebean-mariadb-10.3.properties b/ebean-test/testconfig/ebean-mariadb-10.3.properties index c7ef279e4..082b4dbce 100644 --- a/ebean-test/testconfig/ebean-mariadb-10.3.properties +++ b/ebean-test/testconfig/ebean-mariadb-10.3.properties @@ -4,5 +4,5 @@ ebean.test.dbName=test_ebean ebean.test.dbPassword=unit ebean.test.mariadb.version=10.3 ebean.test.mariadb.containerName=ut_mariadb-10-3 -ebean.test.sqlserver.port = 7306 +ebean.test.mariadb.port=14308 datasource.default=mariadb-103 diff --git a/ebean-test/testconfig/ebean-mariadb.properties b/ebean-test/testconfig/ebean-mariadb.properties index 165032895..a579e32bf 100644 --- a/ebean-test/testconfig/ebean-mariadb.properties +++ b/ebean-test/testconfig/ebean-mariadb.properties @@ -2,4 +2,5 @@ ebean.test.platform=mariadb ebean.test.dbName=test_ebean ebean.test.mariadb.version=10.6 ebean.test.mariadb.containerName=ut_mariadb-10-6 +ebean.test.mariadb.port=14307 datasource.default=mariadb-106 diff --git a/ebean-test/testconfig/ebean-mysql.properties b/ebean-test/testconfig/ebean-mysql.properties index dfd960fd2..9539946a9 100644 --- a/ebean-test/testconfig/ebean-mysql.properties +++ b/ebean-test/testconfig/ebean-mysql.properties @@ -2,5 +2,5 @@ ebean.test.platform=mysql ebean.test.dbName=test_ebean # note: do not conflict with mariadb port -ebean.test.sqlserver.port = 13306 +#ebean.test.mysql.port=4306 datasource.default=mysql-docker diff --git a/ebean-test/testconfig/ebean-sqlserver17.properties b/ebean-test/testconfig/ebean-sqlserver17.properties index 6da4dacc3..92efeb165 100644 --- a/ebean-test/testconfig/ebean-sqlserver17.properties +++ b/ebean-test/testconfig/ebean-sqlserver17.properties @@ -1,7 +1,10 @@ ebean.test.platform=sqlserver ebean.test.dbName=test_ebean ebean.test.sqlserver.version=2017-latest -ebean.test.sqlserver.containerName=ut_sqlserver2017 -ebean.test.sqlserver.port=1434 +ebean.test.sqlserver.containerName=local_sqlserver2017 +ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CS_AS_SC +ebean.test.sqlserver.port=9435 +ebean.test.sqlserver.url=jdbc:sqlserver://localhost:9435;databaseName=test_ebean;sendTimeAsDateTime=false + datasource.default=sqlserver2017 -ebean.sqlserver2017.databasePlatformName=sqlserver17 \ No newline at end of file +ebean.sqlserver2017.databasePlatformName=sqlserver17 diff --git a/ebean-test/testconfig/ebean-sqlserver19.properties b/ebean-test/testconfig/ebean-sqlserver19.properties new file mode 100644 index 000000000..5c8accf32 --- /dev/null +++ b/ebean-test/testconfig/ebean-sqlserver19.properties @@ -0,0 +1,13 @@ +ebean.test.platform=sqlserver +ebean.test.dbName=test_ebean +ebean.test.sqlserver.version=2019-latest +ebean.test.sqlserver.containerName=local_sqlserver2019 +ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CS_AS_SC_UTF8 +ebean.test.sqlserver.port=9434 +ebean.test.sqlserver.url=jdbc:sqlserver://localhost:9434;databaseName=test_ebean;sendTimeAsDateTime=false +datasource.default=sqlserver2019 +ebean.sqlserver2019.databasePlatformName=sqlserver17 + +## A case sensitive collation example: +#ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CI_AS_SC_UTF8 +#ebean.sqlserver2019.caseSensitiveCollation=false diff --git a/ebean/pom.xml b/ebean/pom.xml index f9d693733..2c3dacdf5 100644 --- a/ebean/pom.xml +++ b/ebean/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT ebean composite @@ -22,20 +22,20 @@ io.ebean ebean-api - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT io.ebean ebean-querybean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT diff --git a/ebean/pom.xml.releaseBackup b/ebean/pom.xml.releaseBackup new file mode 100644 index 000000000..bf039e209 --- /dev/null +++ b/ebean/pom.xml.releaseBackup @@ -0,0 +1,58 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + ebean composite + Composite of common runtime dependencies + ebean + + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + + + + io.ebean + ebean-api + 12.13.2-SNAPSHOT + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + + + + + io.ebean + ebean-querybean + 12.13.2-SNAPSHOT + + + + + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + diff --git a/kotlin-querybean-generator/pom.xml b/kotlin-querybean-generator/pom.xml index 93758d10a..e897804e2 100644 --- a/kotlin-querybean-generator/pom.xml +++ b/kotlin-querybean-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT kotlin querybean generator @@ -12,7 +12,7 @@ kotlin-querybean-generator - 1.5.30-M1 + 1.6.0 @@ -29,7 +29,7 @@ io.ebean ebean-querybean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test @@ -43,7 +43,7 @@ io.ebean ebean-core - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test @@ -64,7 +64,7 @@ io.ebean ebean-ddl-generator - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT test diff --git a/kotlin-querybean-generator/pom.xml.releaseBackup b/kotlin-querybean-generator/pom.xml.releaseBackup new file mode 100644 index 000000000..0be3286f4 --- /dev/null +++ b/kotlin-querybean-generator/pom.xml.releaseBackup @@ -0,0 +1,186 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + kotlin querybean generator + Generates Kotlin querybeans + kotlin-querybean-generator + + + 1.6.0 + + + + + + + + io.avaje + junit + 1.0 + test + + + + io.ebean + ebean-querybean + 12.13.2-SNAPSHOT + test + + + + io.ebean + ebean-datasource + ${ebean-datasource.version} + test + + + + io.ebean + ebean-core + 12.13.2-SNAPSHOT + test + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + provided + + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + io.ebean + ebean-ddl-generator + 12.13.2-SNAPSHOT + test + + + + javax.validation + validation-api + 2.0.1.Final + test + + + + + + + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + test-compile + test-compile + + test-compile + + + + test-kapt + + test-kapt + + + + src/test/kotlin + + + + io.ebean + kotlin-querybean-generator + 12.8.2 + + + + + + compile + compile + + compile + + + + src/main/java + target/generated-sources/kapt/test + target/generated-sources/kaptKotlin/test + + + + + + 1.8 + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + default-testCompile + none + + + java-test-compile + test-compile + + testCompile + + + + compile + compile + + compile + + + + + 1.8 + 1.8 + + -proc:none + + + + + io.ebean + ebean-maven-plugin + ${ebean-maven-plugin.version} + + + test + process-test-classes + + debug=1 + + + testEnhance + + + + + + + + + diff --git a/pom.xml b/pom.xml index eb2bf22f6..c4461a29e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ io.ebean ebean-parent - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT pom ebean parent @@ -108,9 +108,26 @@ ebean-querybean ebean-postgis ebean-redis - + + + + + release + + + default + + true + + + ebean-kotlin + tests + + + + foconis-release diff --git a/pom.xml.releaseBackup b/pom.xml.releaseBackup new file mode 100644 index 000000000..ba0c11c58 --- /dev/null +++ b/pom.xml.releaseBackup @@ -0,0 +1,114 @@ + + + 4.0.0 + + org.avaje + java8-oss + 3.2 + + + io.ebean + ebean-parent + 12.13.2-SNAPSHOT + pom + + ebean parent + Parent for ebean modules + https://ebean.io/ + + + scm:git:git@github.com:ebean-orm/ebean.git + HEAD + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + rbygrave + Rob Bygrave + robin.bygrave@gmail.com + + + + + false + 2.12.1 + 1.2 + 1.1 + 12.12.1 + 4.2 + 7.3 + 12.13.0 + 12.13.0 + + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + ch.qos.logback + logback-classic + 1.2.3 + test + + + + com.h2database + h2 + 1.4.199 + test + + + + + + ebean + ebean-api + ebean-bom + ebean-core-type + ebean-core + ebean-ddl-generator + ebean-autotune + ebean-externalmapping-api + ebean-externalmapping-xml + ebean-test + querybean-generator + kotlin-querybean-generator + ebean-querybean + ebean-postgis + ebean-redis + + + + + + + release + + + default + + true + + + ebean-kotlin + tests + + + + + + diff --git a/querybean-generator/pom.xml b/querybean-generator/pom.xml index 49017b306..ef25adaa8 100644 --- a/querybean-generator/pom.xml +++ b/querybean-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.1-FOC6-SNAPSHOT + 12.13.3-SNAPSHOT querybean generator diff --git a/querybean-generator/pom.xml.releaseBackup b/querybean-generator/pom.xml.releaseBackup new file mode 100644 index 000000000..d61f1d143 --- /dev/null +++ b/querybean-generator/pom.xml.releaseBackup @@ -0,0 +1,52 @@ + + + 4.0.0 + + ebean-parent + io.ebean + 12.13.2-SNAPSHOT + + + querybean generator + Querybean generator + querybean-generator + + + + + io.avaje + junit + 1.0 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.8 + 1.8 + + -proc:none + + + + io.repaint.maven + tiles-maven-plugin + 2.24 + true + + + io.avaje.tile:moditech-module:1.0 + + + + + + + diff --git a/release.properties b/release.properties new file mode 100644 index 000000000..e846a5665 --- /dev/null +++ b/release.properties @@ -0,0 +1,83 @@ +#release configuration +#Fri Dec 17 17:24:24 NZDT 2021 +projectVersionPolicyId=default +project.scm.io.ebean\:ebean-core-type.tag=HEAD +scm.branchCommitComment=@{prefix} prepare branch @{releaseLabel} +project.rel.io.ebean\:ebean-ddl-generator=12.13.2 +project.dev.io.ebean\:ebean-core=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean-api.tag=HEAD +project.scm.io.ebean\:ebean-redis.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:ebean-querybean.tag=HEAD +project.scm.io.ebean\:ebean-api.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.dev.io.ebean\:ebean-api=12.13.3-SNAPSHOT +project.rel.io.ebean\:ebean=12.13.2 +project.dev.io.ebean\:ebean-core-type=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean-ddl-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +exec.activateProfiles=release +project.dev.io.ebean\:ebean-test=12.13.3-SNAPSHOT +project.scm.io.ebean\:kotlin-querybean-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:ebean-querybean.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:ebean-bom.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:ebean-core.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.rel.io.ebean\:ebean-core-type=12.13.2 +project.rel.io.ebean\:kotlin-querybean-generator=12.13.2 +project.dev.io.ebean\:querybean-generator=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean-autotune.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +scm.commentPrefix=[maven-release-plugin] +releaseStrategyId=default +project.rel.io.ebean\:ebean-querybean=12.13.2 +project.scm.io.ebean\:ebean-externalmapping-api.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:querybean-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.dev.io.ebean\:kotlin-querybean-generator=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean-core-type.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +completedPhase=generate-release-poms +project.rel.io.ebean\:ebean-redis=12.13.2 +project.scm.io.ebean\:ebean-test.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.scm.io.ebean\:ebean-postgis.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.dev.io.ebean\:ebean-autotune=12.13.3-SNAPSHOT +project.rel.io.ebean\:ebean-api=12.13.2 +project.scm.io.ebean\:ebean-postgis.tag=HEAD +project.scm.io.ebean\:querybean-generator.tag=HEAD +project.rel.io.ebean\:querybean-generator=12.13.2 +scm.tag=ebean-parent-12.13.2 +project.rel.io.ebean\:ebean-externalmapping-xml=12.13.2 +project.scm.io.ebean\:ebean-ddl-generator.tag=HEAD +project.rel.io.ebean\:ebean-externalmapping-api=12.13.2 +project.scm.io.ebean\:ebean-externalmapping-xml.tag=HEAD +preparationGoals=clean verify +exec.pomFileName=pom.xml +project.dev.io.ebean\:ebean-externalmapping-api=12.13.3-SNAPSHOT +project.dev.io.ebean\:ebean=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.dev.io.ebean\:ebean-parent=12.13.3-SNAPSHOT +project.dev.io.ebean\:ebean-externalmapping-xml=12.13.3-SNAPSHOT +project.rel.io.ebean\:ebean-core=12.13.2 +project.dev.io.ebean\:ebean-redis=12.13.3-SNAPSHOT +project.dev.io.ebean\:ebean-postgis=12.13.3-SNAPSHOT +project.scm.io.ebean\:ebean-redis.tag=HEAD +project.scm.io.ebean\:ebean-parent.tag=HEAD +pushChanges=true +project.scm.io.ebean\:ebean-externalmapping-xml.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +project.rel.io.ebean\:ebean-test=12.13.2 +project.scm.io.ebean\:kotlin-querybean-generator.tag=HEAD +project.scm.io.ebean\:ebean-bom.tag=HEAD +project.scm.io.ebean\:ebean-autotune.tag=HEAD +project.scm.io.ebean\:ebean.tag=HEAD +project.scm.io.ebean\:ebean-core.tag=HEAD +project.rel.io.ebean\:ebean-autotune=12.13.2 +scm.rollbackCommitComment=@{prefix} rollback the release of @{releaseLabel} +remoteTagging=true +project.dev.io.ebean\:ebean-bom=12.13.3-SNAPSHOT +project.dev.io.ebean\:ebean-querybean=12.13.3-SNAPSHOT +project.rel.io.ebean\:ebean-bom=12.13.2 +project.scm.io.ebean\:ebean-parent.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git +scm.url=scm\:git\:git@github.com\:ebean-orm/ebean.git +scm.developmentCommitComment=@{prefix} prepare for next development iteration +project.scm.io.ebean\:ebean-externalmapping-api.tag=HEAD +scm.tagNameFormat=@{project.artifactId}-@{project.version} +project.scm.io.ebean\:ebean-test.tag=HEAD +project.dev.io.ebean\:ebean-ddl-generator=12.13.3-SNAPSHOT +exec.snapshotReleasePluginAllowed=false +scm.releaseCommitComment=@{prefix} prepare release @{releaseLabel} +project.rel.io.ebean\:ebean-postgis=12.13.2 +project.rel.io.ebean\:ebean-parent=12.13.2 diff --git a/tests/pom.xml b/tests/pom.xml index 9edd759f2..b3592f647 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -5,6 +5,7 @@ org.avaje java8-oss 2.3 + io.ebean @@ -19,11 +20,25 @@ true - - - - - test-kotlin - + + + jdk16plus + + [16,20] + + + test-java16 + + + + jdk15less + + [8,15] + + + test-kotlin + + + diff --git a/tests/test-java16/pom.xml b/tests/test-java16/pom.xml index 4a416d12e..0f4927da5 100644 --- a/tests/test-java16/pom.xml +++ b/tests/test-java16/pom.xml @@ -20,7 +20,7 @@ io.ebean ebean - 12.13.0-SNAPSHOT + 12.13.2-SNAPSHOT @@ -32,7 +32,7 @@ io.ebean ebean-test - 12.13.0-SNAPSHOT + 12.13.2-SNAPSHOT test @@ -58,7 +58,7 @@ io.ebean querybean-generator - 12.13.0-SNAPSHOT + 12.13.2-SNAPSHOT diff --git a/tests/test-kotlin/pom.xml b/tests/test-kotlin/pom.xml index 1321332b8..3ab10cdf5 100644 --- a/tests/test-kotlin/pom.xml +++ b/tests/test-kotlin/pom.xml @@ -7,9 +7,10 @@ org.avaje java11-oss 2.3 + - kotlin test + test-kotlin Kotlin specific tests test-kotlin 1.0 @@ -19,7 +20,7 @@ 11 12.13.0 - 1.5.31 + 1.6.0 2.12.1 true @@ -35,14 +36,14 @@ io.ebean ebean-test - 12.13.0-SNAPSHOT + 12.13.2-SNAPSHOT test io.ebean ebean-core - 12.13.0-SNAPSHOT + 12.13.2-SNAPSHOT test