diff --git a/README.md b/README.md index 636cf6fc4..dfed78f6e 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,8 @@ Build with Gradle ```groovy dependencies { - implementation "org.seasar.doma:doma-core:2.34.0" - annotationProcessor "org.seasar.doma:doma-processor:2.34.0" + implementation "org.seasar.doma:doma-core:2.35.0" + annotationProcessor "org.seasar.doma:doma-processor:2.35.0" } ``` diff --git a/docs/annotation-processing.rst b/docs/annotation-processing.rst index c5bea3fdb..2b19f3b5c 100644 --- a/docs/annotation-processing.rst +++ b/docs/annotation-processing.rst @@ -13,18 +13,6 @@ and show you how to pass them to build tools. Options ======= -doma.criteria.enabled - Whether to generate meta classes for the Criteria API. - The default value is ``true``. - -doma.criteria.prefix - The name prefix of the meta classes for the Criteria API. - The default value is an empty string. - -doma.criteria.suffix - The name suffix of the meta classes for the Criteria API. - The default value is ``_``. - doma.dao.package The package that the generated implementation classes of interfaces annotated with ``@Dao`` belong to. The specified value overrides the value of doma.dao.subpackage. @@ -62,6 +50,20 @@ doma.expr.functions The default value is ``org.seasar.doma.expr.ExpressionFunctions``. This value are used to determine which functions are available in expression comments. +doma.metamodel.enabled + Whether to generate meta classes for the Criteria API. + When the value is ``true``, metamodels are generated for all entity classes + even if they are not specified with ``metamodel = @Metamodel``. + The default value is ``false``. + +doma.metamodel.prefix + The name prefix of the metamodel classes for the Criteria API. + The default value is an empty string. + +doma.metamodel.suffix + The name suffix of the metamodel classes for the Criteria API. + The default value is ``_``. + doma.resources.dir The resource directory that contains the resource files such as a doma.compile.config file and sql files. Specify the value as an absolute path. diff --git a/docs/build.rst b/docs/build.rst index d91796034..c15fb2db5 100644 --- a/docs/build.rst +++ b/docs/build.rst @@ -35,8 +35,8 @@ Write your build.gradle as follows: .. code-block:: groovy dependencies { - implementation "org.seasar.doma:doma-core:2.34.0" - annotationProcessor "org.seasar.doma:doma-processor:2.34.0" + implementation "org.seasar.doma:doma-core:2.35.0" + annotationProcessor "org.seasar.doma:doma-processor:2.35.0" } To simplify your build.script, we recommend that you use the `Doma Compile Plugin`_. diff --git a/docs/criteria-api.rst b/docs/criteria-api.rst index f9859ac65..79b1f8526 100644 --- a/docs/criteria-api.rst +++ b/docs/criteria-api.rst @@ -5,25 +5,21 @@ Criteria API .. contents:: :depth: 4 -.. warning:: - - The criteria API is an experimental feature. - Introduction ============ -There are two kind of DSLs in the Criteria API: +There are two kinds of DSLs in the Criteria API: * The Entityql DSL * The NativeSql DSL -Both require predefined Entity classes and the meta classes generated by Doma's annotation processors. +Both require predefined Entity classes and metamodel classes. We use the following Entity classes to show you some examples: .. code-block:: java - @Entity + @Entity(metamodel = @Metamodel) public class Employee { @Id private Integer employeeId; @@ -45,7 +41,7 @@ We use the following Entity classes to show you some examples: .. code-block:: java - @Entity + @Entity(metamodel = @Metamodel) public class Department { @Id private Integer departmentId; @@ -59,12 +55,21 @@ We use the following Entity classes to show you some examples: // getter and setter } -Each of the above classes has a corresponding meta class - ``Employee_`` and ``Department_``. -These meta classes allow you to make your query typesafe. +Note that both of the above classes are annotated with ``@Entity(metamodel = @Metamodel)``. +The ``metamodel = @Metamodel`` indicates that the annotated entity +has a corresponding metamodel class generated by Doma's annotation processor . + +In our examples, the metamodel classes are ``Employee_`` and ``Department_``. +These metamodels allow you to make your query typesafe. + +You can customize the name of the metamodels by the Metamodel annotation elements. -You can customize the name of the meta classes by specifying annotation processor options. -See :doc:`annotation-processing` and check the `doma.criteria.prefix` -and the `doma.criteria.suffix` options. +To customize all metamodels in bulk, you can use the annotation processor options. +See :doc:`annotation-processing` and check the following options: + +* doma.metamodel.enabled +* doma.metamodel.prefix +* doma.metamodel.suffix Entityql DSL ------------ @@ -129,7 +134,7 @@ This class has the following methods: * insert * update -You can use instantiate the ``NativeSql`` class as follows: +You can instantiate the ``NativeSql`` class as follows: .. code-block:: java @@ -162,6 +167,45 @@ The above query issues the following SQL statement: having count(*) > ? order by count(*) asc +The difference between two DSLs +------------------------------- + +The biggest difference between two DSLs is that the Entityql DSL removes duplicated data +from the fetched results, but the NativeSQL DSL doesn't. + +See the following example: + +.. code-block:: java + + Department_ d = new Department_(); + Employee_ e = new Employee_(); + + // (1) Use Entityql DSL + List list1 = + entityql.from(d).innerJoin(e, on -> on.eq(d.departmentId, e.departmentId)).fetch(); + + // (2) Use NativeSql DSL + List list2 = + nativeSql.from(d).innerJoin(e, on -> on.eq(d.departmentId, e.departmentId)).fetch(); + + System.out.println(list1.size()); // 3 + System.out.println(list2.size()); // 14 + +Both (1) and (2) issue the same SQL statement as follows: + +.. code-block:: java + + select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, t0_.LOCATION,t0_.VERSION + from DEPARTMENT t0_ + inner join EMPLOYEE t1_ on (t0_.DEPARTMENT_ID = t1_.DEPARTMENT_ID) + +The ResultSet contains 14 rows, but the Entityql DSL returns only 3 rows +because it removes duplicate Department entities. +The Entityql DSL uses the id properties to know the uniqueness of the entities. + +On the other hand, the NativeSql DSL returns the data as it retrieves from the database. +It puts results into entity objects, but it handles them as the plain DTOs. + Select statement ================ @@ -170,11 +214,12 @@ Select settings (Entityql, NativeSql) We support the following settings: +* allowEmptyWhere * comment -* queryTimeout -* sqlLogType * fetchSize * maxRows +* queryTimeout +* sqlLogType They are all optional. You can apply them as follows: @@ -184,11 +229,12 @@ You can apply them as follows: Employee_ e = new Employee_(); List list = entityql.from(e, settings -> { + settings.setAllowEmptyWhere(false); settings.setComment("all employees"); - settings.setSqlLogType(SqlLogType.RAW); - settings.setQueryTimeout(1000); settings.setFetchSize(100); settings.setMaxRows(100); + settings.setSqlLogType(SqlLogType.RAW); + settings.setQueryTimeout(1000); }).fetch(); Fetching (Entityql, NativeSql) @@ -205,7 +251,7 @@ Both Entityql DSL and NativeSql DSL support the following methods to fetch data Employee_ e = new Employee_(); - // The fetch method returns results as list. + // The fetch method returns results as a list. List list = entityql.from(e).fetch(); @@ -225,7 +271,7 @@ Both Entityql DSL and NativeSql DSL support the following methods to fetch data Streaming (NativeSql) --------------------- -The NativeSql Dsl supports the following methods: +The NativeSql DSL supports the following methods: * mapStream * collect @@ -283,7 +329,7 @@ The above query issues the following SQL statement: select t0_.EMPLOYEE_NAME, t0_.EMPLOYEE_NO from EMPLOYEE t0_ Up to 9 numbers, the column results are held by ``Tuple2`` to ``Tuple9``. -For more than 9 numbers, the results are held by ``List``. +For more than 9 numbers, the results are held by ``Row``. .. _criteria_where: @@ -553,7 +599,7 @@ Dynamic associate (Entityql) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When you use the above dynamic join expression, the association must be optional. -To do it, pass ``AssociationOption.OPTIONAL`` to the associate method: +To do it, pass the result of ``AssociationOption.optional()`` to the associate method: .. code-block:: java @@ -577,9 +623,40 @@ To do it, pass ``AssociationOption.OPTIONAL`` to the associate method: employee.setDepartment(department); department.getEmployeeList().add(employee); }, - AssociationOption.OPTIONAL) + AssociationOption.optional()) + .fetch(); + +Fetch multiple entities at once (NativeSql) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When the select method accepts multiple metamodels, +the fetch method returns the tuple of the corresponding entities: + +.. code-block:: java + + Employee_ e = new Employee_(); + Department_ d = new Department_(); + + List> list = + nativeSql + .from(d) + .leftJoin(e, on -> on.eq(d.departmentId, e.departmentId)) + .where(c -> c.eq(d.departmentId, 4)) + .select(d, e) .fetch(); +The above query issues the following SQL statement: + +.. code-block:: sql + + select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, t0_.LOCATION, + t0_.VERSION, t1_.EMPLOYEE_ID, t1_.EMPLOYEE_NO, t1_.EMPLOYEE_NAME, t1_.MANAGER_ID, + t1_.HIREDATE, t1_.SALARY, t1_.DEPARTMENT_ID, t1_.ADDRESS_ID, t1_.VERSION + from DEPARTMENT t0_ left outer join EMPLOYEE t1_ on (t0_.DEPARTMENT_ID = t1_.DEPARTMENT_ID) + where t0_.DEPARTMENT_ID = ? + +The entity included in the tuple should be null when the all properties of the entity are null. + Aggregate Functions (NativeSql) ------------------------------- @@ -588,11 +665,12 @@ We support the following aggregate functions: * avg(property) * count() * count(property) +* countDistinct(property) * max(property) * min(property) * sum(property) -These are defined in the ``org.seasar.doma.jdbc.criteria.AggregateFunctions`` class. +These are defined in the ``org.seasar.doma.jdbc.criteria.expression.Expressions`` class. Use them with static import. For example, you can pass the ``sum`` function to the select method: @@ -767,13 +845,13 @@ The above query issues the following SQL statement: t0_.SALARY, t0_.DEPARTMENT_ID, t0_.ADDRESS_ID, t0_.VERSION from EMPLOYEE t0_ order by t0_.EMPLOYEE_NO asc - limit 5 offset 3 + offset 3 rows fetch first 5 rows only Dynamic Limit and Offset expression (Entityql, NativeSql) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A limit expressions uses only non-null value to build a LIMIT clause. -When the value is null ,the built statement doesn't have any LIMIT clause. +A limit expressions uses only non-null value to build a FETCH FIRST clause. +When the value is null ,the built statement doesn't have any FETCH FIRST clause. As well as, an offset expressions uses only non-null value to build a OFFSET clause. When the value is null ,the built statement doesn't have any OFFSET clause. @@ -853,11 +931,13 @@ Delete settings (Entityql, NativeSql) We support the following settings: +* allowEmptyWhere +* batchSize * comment +* ignoreVersion * queryTimeout * sqlLogType -* allowEmptyWhere -* batchSize +* suppressOptimisticLockException They are all optional. @@ -868,11 +948,13 @@ You can apply them as follows: Employee_ e = new Employee_(); int count = nativeSql.delete(e, settings -> { + settings.setAllowEmptyWhere(true); + settings.setBatchSize(20); settings.setComment("delete all"); + settings.setIgnoreVersion(true); settings.setQueryTimeout(1000); settings.setSqlLogType(SqlLogType.RAW); - settings.setAllowEmptyWhere(true); - settings.setBatchSize(20); + settings.setSuppressOptimisticLockException(true); }).execute(); .. note:: @@ -889,7 +971,7 @@ Delete statement (Entityql) Employee employee = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetchOne(); - Employee result = entityql.delete(e, employee).execute(); + Result result = entityql.delete(e, employee).execute(); The above query issues the following SQL statement: @@ -906,7 +988,7 @@ Batch Delete is also supported: List employees = entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); - List results = entityql.delete(e, employees).execute(); + BatchResult result = entityql.delete(e, employees).execute(); The execute method may throw following exceptions: @@ -946,6 +1028,8 @@ You can apply them as follows: .. code-block:: java + Department_ d = new Department_(); + int count = nativeSql .insert(d, settings -> { @@ -977,7 +1061,7 @@ Insert statement (Entityql) department.setDepartmentName("aaa"); department.setLocation("bbb"); - Department result = entityql.insert(d, department).execute(); + Result result = entityql.insert(d, department).execute(); The above query issues the following SQL statement: @@ -996,7 +1080,7 @@ Batch Insert is also supported: Department department2 = ...; List departments = Arrays.asList(department, department2); - List results = entityql.insert(d, departments).execute(); + BatchResult result = entityql.insert(d, departments).execute(); The execute method may throw following exceptions: @@ -1033,6 +1117,27 @@ The execute method may throw following exceptions: * UniqueConstraintException: if an unique constraint is violated +We also support the INSERT SELECT syntax as follows: + +.. code-block:: java + + Department_ da = new Department_("DEPARTMENT_ARCHIVE"); + Department_ d = new Department_(); + + int count = + nativeSql + .insert(da) + .select(c -> c.from(d).where(cc -> cc.in(d.departmentId, Arrays.asList(1, 2))).select()) + .execute(); + +The above query issues the following SQL statement: + +.. code-block:: sql + + insert into DEPARTMENT_ARCHIVE (DEPARTMENT_ID, DEPARTMENT_NO, DEPARTMENT_NAME, + LOCATION, VERSION) select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, + t0_.LOCATION, t0_.VERSION from DEPARTMENT t0_ where t0_.DEPARTMENT_ID in (?, ?) + Update statement ============================ @@ -1044,11 +1149,13 @@ Update settings (Entityql, NativeSql) We support the following settings: +* allowEmptyWhere +* batchSize * comment +* ignoreVersion * queryTimeout * sqlLogType -* allowEmptyWhere -* batchSize +* suppressOptimisticLockException They are all optional. @@ -1059,11 +1166,13 @@ You can apply them as follows: Employee_ e = new Employee_(); int count = nativeSql.update(e, settings -> { + settings.setAllowEmptyWhere(true); + settings.setBatchSize(20); settings.setComment("update all"); + settings.setIgnoreVersion(true); settings.setQueryTimeout(1000); settings.setSqlLogType(SqlLogType.RAW); - settings.setAllowEmptyWhere(true); - settings.setBatchSize(20); + settings.setSuppressOptimisticLockException(true); }).set(c -> { c.value(e.employeeName, "aaa"); }).execute(); @@ -1084,7 +1193,7 @@ Update statement (Entityql) employee.setEmployeeName("aaa"); employee.setSalary(new Salary("2000")); - Employee result = entityql.update(e, employee).execute(); + Result result = entityql.update(e, employee).execute(); The above query issues the following SQL statement: @@ -1103,7 +1212,7 @@ Batch Update is also supported: Employee employee2 = ...; List departments = Arrays.asList(employee, employee2); - List results = entityql.update(e, employees).execute(); + BatchResult result = entityql.update(e, employees).execute(); The execute method may throw following exceptions: @@ -1139,6 +1248,55 @@ The execute method may throw following exceptions: * UniqueConstraintException: if an unique constraint is violated +Property Expressions (Entityql, NativeSql) +========================================== + +We support the following expressions: + +Arithmetic Expressions: + +* add - (+) +* sub - (-) +* mul - (*) +* div - (/) +* mod - (%) + +String Expression: + +* concat + +Literal Expression: + +* literal (for String and int) + +These are defined in the ``org.seasar.doma.jdbc.criteria.expression.Expressions`` class. +Use them with static import. + +The expressions are useful to update a column relative to current column value: + +.. code-block:: java + + Employee_ e = new Employee_(); + + int count = + nativeSql + .update(e) + .set( + c -> { + c.value(e.employeeName, concat("[", concat(e.employeeName, "]"))); + c.value(e.version, add(e.version, literal(1))); + }) + .where(c -> c.eq(e.employeeId, 1)) + .execute(); + +The above query issues the following SQL statement: + +.. code-block:: sql + + update EMPLOYEE t0_ set t0_.EMPLOYEE_NAME = concat('[', concat(t0_.EMPLOYEE_NAME, ']')), + t0_.VERSION = (t0_.VERSION + 1) + where t0_.EMPLOYEE_ID = ? + Tips ==== @@ -1161,6 +1319,31 @@ To get a ``config`` object, call ``Config.get(this)`` in the default method as f } } +Overwriting the table name (Entityql, NativeSql) +------------------------------------------------ + +A metamodel constructor accepts the qualified table name and +the metamodel overwrites its table name. + +It is useful to handle two tables that have the same data structure: + +.. code-block:: java + + Department_ da = new Department_("DEPARTMENT_ARCHIVE"); + Department_ d = new Department_(); + + int count = + nativeSql + .insert(da) + .select(c -> c.from(d).select()) + .execute(); + +.. code-block:: sql + + insert into DEPARTMENT_ARCHIVE (DEPARTMENT_ID, DEPARTMENT_NO, DEPARTMENT_NAME, + LOCATION, VERSION) select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, + t0_.LOCATION, t0_.VERSION from DEPARTMENT t0_ + Debugging (Entityql, NativeSql) ------------------------------- @@ -1205,14 +1388,13 @@ You can also get the ``Sql`` object by calling the ``peek`` method. The above code prints as follows: -.. code-block:: sh +.. code-block:: sql select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, t0_.LOCATION, t0_.VERSION from DEPARTMENT t0_ select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, t0_.LOCATION, t0_.VERSION from DEPARTMENT t0_ where t0_.DEPARTMENT_NAME = ? select t0_.DEPARTMENT_ID, t0_.DEPARTMENT_NO, t0_.DEPARTMENT_NAME, t0_.LOCATION, t0_.VERSION from DEPARTMENT t0_ where t0_.DEPARTMENT_NAME = 'SALES' order by t0_.LOCATION asc select t0_.LOCATION from DEPARTMENT t0_ where t0_.DEPARTMENT_NAME = 'SALES' order by t0_.LOCATION asc - Sample projects =============== diff --git a/docs/kotlin-support.rst b/docs/kotlin-support.rst index f45519dd3..1c8997d55 100644 --- a/docs/kotlin-support.rst +++ b/docs/kotlin-support.rst @@ -99,8 +99,8 @@ Add the dependencies using the `kapt` and `implementation` configuration in your .. code-block:: groovy dependencies { - implementation "org.seasar.doma:doma-core:2.34.0" - kapt "org.seasar.doma:doma-processor:2.34.0" + implementation "org.seasar.doma:doma-core:2.35.0" + kapt "org.seasar.doma:doma-processor:2.35.0" } To simplify your build.script, we recommend you use diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 9f8db4431..a6a0943eb 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -2,6 +2,20 @@ Release notes ============= +v2.35.0: 2020-05-17 +====================== + +* `GH426 `_ + Improve the Criteria API documents +* `GH425 `_ + Enhance the Criteria API +* `GH424 `_ + Generate Metamodel classes effectively +* `GH423 `_ + Reload a typeElement with its canonical name to avoid the eclipse bug +* `GH422 `_ + Optimize generation code + v2.34.0: 2020-05-10 ====================== diff --git a/doma-core/src/main/java/org/seasar/doma/Entity.java b/doma-core/src/main/java/org/seasar/doma/Entity.java index f73ab47be..84500d8ec 100644 --- a/doma-core/src/main/java/org/seasar/doma/Entity.java +++ b/doma-core/src/main/java/org/seasar/doma/Entity.java @@ -111,4 +111,13 @@ * @return whether the entity class is immutable */ boolean immutable() default false; + + /** + * The metamodel information for the Criteria API. + * + *

If specified, the metamodel class is generated by the annotation processor. + * + * @return the metamodel + */ + Metamodel metamodel() default @Metamodel(); } diff --git a/doma-core/src/main/java/org/seasar/doma/Metamodel.java b/doma-core/src/main/java/org/seasar/doma/Metamodel.java new file mode 100644 index 000000000..dd8019f31 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/Metamodel.java @@ -0,0 +1,34 @@ +package org.seasar.doma; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Indicates a metamodel class. + * + *

For example, the name of the metamodel is "MyEmployeeMetamodel" when you specify the prefix + * and the suffix as follows: + * + *

+ * @Entity(metamodel = @Metamodel(prefix = "My", suffix="Metamodel")
+ * public class Employee {
+ *     ...
+ * }
+ * 
+ * + *

If both the {@code prefix} and the {@code suffix} are empty, the values of the following + * annotation processing options are used: + * + *

    + *
  • doma.metamodel.prefix + *
  • doma.metamodel.suffix + *
+ */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Metamodel { + /** @return the prefix for the metamodel class */ + String prefix() default ""; + + /** @return the suffix for the metamodel class */ + String suffix() default ""; +} diff --git a/doma-core/src/main/java/org/seasar/doma/internal/Artifact.java b/doma-core/src/main/java/org/seasar/doma/internal/Artifact.java index c088112c8..dd02983df 100644 --- a/doma-core/src/main/java/org/seasar/doma/internal/Artifact.java +++ b/doma-core/src/main/java/org/seasar/doma/internal/Artifact.java @@ -7,7 +7,7 @@ public final class Artifact { private static final String NAME = "Doma"; - private static final String VERSION = "2.34.0"; + private static final String VERSION = "2.35.0"; public static String getName() { return NAME; diff --git a/doma-core/src/main/java/org/seasar/doma/internal/ClassNames.java b/doma-core/src/main/java/org/seasar/doma/internal/ClassNames.java index 9d07d4afe..a9687ed9e 100644 --- a/doma-core/src/main/java/org/seasar/doma/internal/ClassNames.java +++ b/doma-core/src/main/java/org/seasar/doma/internal/ClassNames.java @@ -43,16 +43,10 @@ public static ClassName newExternalDomainTypeClassName(CharSequence externalDoma return new ExternalDomainClassNameBuilder(externalDomainClassName).build(); } - public static ClassName newEntityDefClassNameBuilder( - CharSequence entityClassName, String criteriaPrefix, String criteriaSuffix) { - assertNotNull(entityClassName, criteriaPrefix, criteriaSuffix); - return new DefClassNameBuilder(entityClassName, criteriaPrefix, criteriaSuffix).build(); - } - - public static ClassName newEmbeddableDefClassNameBuilder( - CharSequence entityClassName, String criteriaPrefix, String criteriaSuffix) { - assertNotNull(entityClassName, criteriaPrefix, criteriaSuffix); - return new DefClassNameBuilder(entityClassName, criteriaPrefix, criteriaSuffix).build(); + public static ClassName newEntityMetamodelClassNameBuilder( + CharSequence entityClassName, String metamodelPrefix, String metamodelSuffix) { + assertNotNull(entityClassName, metamodelPrefix, metamodelSuffix); + return new MetamodelClassNameBuilder(entityClassName, metamodelPrefix, metamodelSuffix).build(); } private static class ClassNameBuilder { @@ -101,11 +95,11 @@ protected String prefix() { } } - private static class DefClassNameBuilder extends ClassNameBuilder { + private static class MetamodelClassNameBuilder extends ClassNameBuilder { private final String criteriaPrefix; private final String criteriaSuffix; - public DefClassNameBuilder( + public MetamodelClassNameBuilder( CharSequence binaryName, String criteriaPrefix, String criteriaSuffix) { super(binaryName); this.criteriaPrefix = criteriaPrefix; diff --git a/doma-core/src/main/java/org/seasar/doma/internal/EmbeddableDesc.java b/doma-core/src/main/java/org/seasar/doma/internal/EmbeddableDesc.java deleted file mode 100644 index 339ac3d64..000000000 --- a/doma-core/src/main/java/org/seasar/doma/internal/EmbeddableDesc.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.seasar.doma.internal; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface EmbeddableDesc { - Class value(); -} diff --git a/doma-core/src/main/java/org/seasar/doma/internal/EntityDesc.java b/doma-core/src/main/java/org/seasar/doma/internal/EntityDesc.java deleted file mode 100644 index cfe58c3b2..000000000 --- a/doma-core/src/main/java/org/seasar/doma/internal/EntityDesc.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.seasar.doma.internal; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface EntityDesc { - Class value(); -} diff --git a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/dialect/MysqlPagingTransformer.java b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/dialect/MysqlPagingTransformer.java index dffbc6333..206e4ddf2 100644 --- a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/dialect/MysqlPagingTransformer.java +++ b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/dialect/MysqlPagingTransformer.java @@ -7,7 +7,7 @@ public class MysqlPagingTransformer extends StandardPagingTransformer { - protected static String MAXIMUM_LIMIT = "18446744073709551615"; + public static String MAXIMUM_LIMIT = "18446744073709551615"; public MysqlPagingTransformer(long offset, long limit) { super(offset, limit); diff --git a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/BasicScalar.java b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/BasicScalar.java index 95a43f48d..0cb7b6e75 100644 --- a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/BasicScalar.java +++ b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/BasicScalar.java @@ -9,6 +9,11 @@ public class BasicScalar implements Scalar { protected final Wrapper wrapper; + public BasicScalar(Wrapper wrapper) { + AssertionUtil.assertNotNull(wrapper); + this.wrapper = wrapper; + } + public BasicScalar(Supplier> supplier) { AssertionUtil.assertNotNull(supplier); this.wrapper = supplier.get(); diff --git a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/OptionalBasicScalar.java b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/OptionalBasicScalar.java index 0756a4964..9e4734bab 100644 --- a/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/OptionalBasicScalar.java +++ b/doma-core/src/main/java/org/seasar/doma/internal/jdbc/scalar/OptionalBasicScalar.java @@ -9,6 +9,12 @@ public class OptionalBasicScalar implements Scalar protected final Wrapper wrapper; + public OptionalBasicScalar(Wrapper wrapper) { + AssertionUtil.assertNotNull(wrapper); + this.wrapper = wrapper; + AssertionUtil.assertNotNull(wrapper); + } + public OptionalBasicScalar(Supplier> supplier) { AssertionUtil.assertNotNull(supplier); this.wrapper = supplier.get(); diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/AggregateFunctions.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/AggregateFunctions.java deleted file mode 100644 index e0bffaa2a..000000000 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/AggregateFunctions.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.seasar.doma.jdbc.criteria; - -import org.seasar.doma.jdbc.criteria.declaration.AggregateFunction; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; - -public final class AggregateFunctions { - - public static AggregateFunction.Avg avg(PropertyDef propertyDef) { - return new AggregateFunction.Avg<>(propertyDef); - } - - public static AggregateFunction.Count count() { - return new AggregateFunction.Count(AggregateFunction.Asterisk); - } - - public static AggregateFunction.Count count(PropertyDef propertyDef) { - return new AggregateFunction.Count(propertyDef); - } - - public static AggregateFunction.Max max(PropertyDef propertyDef) { - return new AggregateFunction.Max<>(propertyDef); - } - - public static AggregateFunction.Min min(PropertyDef propertyDef) { - return new AggregateFunction.Min<>(propertyDef); - } - - public static AggregateFunction.Sum sum(PropertyDef propertyDef) { - return new AggregateFunction.Sum<>(propertyDef); - } -} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/Entityql.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/Entityql.java index 5a8728e36..1154145d1 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/Entityql.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/Entityql.java @@ -3,14 +3,16 @@ import java.util.List; import java.util.Objects; import java.util.function.Consumer; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.criteria.context.DeleteSettings; import org.seasar.doma.jdbc.criteria.context.InsertSettings; import org.seasar.doma.jdbc.criteria.context.SelectContext; import org.seasar.doma.jdbc.criteria.context.SelectSettings; import org.seasar.doma.jdbc.criteria.context.UpdateSettings; import org.seasar.doma.jdbc.criteria.declaration.SelectFromDeclaration; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.criteria.statement.EntityqlBatchDeleteStatement; import org.seasar.doma.jdbc.criteria.statement.EntityqlBatchInsertStatement; import org.seasar.doma.jdbc.criteria.statement.EntityqlBatchUpdateStatement; @@ -28,123 +30,132 @@ public Entityql(Config config) { this.config = Objects.requireNonNull(config); } - public EntityqlSelectStatement from(EntityDef entityDef) { - Objects.requireNonNull(entityDef); - return from(entityDef, options -> {}); + public EntityqlSelectStatement from(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + return from(entityMetamodel, settings -> {}); } public EntityqlSelectStatement from( - EntityDef entityDef, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(settingsConsumer); - SelectContext context = new SelectContext(entityDef); + SelectContext context = new SelectContext(entityMetamodel); settingsConsumer.accept(context.getSettings()); SelectFromDeclaration declaration = new SelectFromDeclaration(context); return new EntityqlSelectStatement<>(config, declaration); } - public Statement update(EntityDef entityDef, ENTITY entity) { - Objects.requireNonNull(entityDef); + public Statement> update( + EntityMetamodel entityMetamodel, ENTITY entity) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); - return update(entityDef, entity, options -> {}); + return update(entityMetamodel, entity, settings -> {}); } - public Statement update( - EntityDef entityDef, ENTITY entity, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + public Statement> update( + EntityMetamodel entityMetamodel, + ENTITY entity, + Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); Objects.requireNonNull(settingsConsumer); UpdateSettings settings = new UpdateSettings(); settingsConsumer.accept(settings); - return new EntityqlUpdateStatement<>(config, entityDef, entity, settings); + return new EntityqlUpdateStatement<>(config, entityMetamodel, entity, settings); } - public Statement delete(EntityDef entityDef, ENTITY entity) { - Objects.requireNonNull(entityDef); + public Statement> delete( + EntityMetamodel entityMetamodel, ENTITY entity) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); - return delete(entityDef, entity, options -> {}); + return delete(entityMetamodel, entity, settings -> {}); } - public Statement delete( - EntityDef entityDef, ENTITY entity, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + public Statement> delete( + EntityMetamodel entityMetamodel, + ENTITY entity, + Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); Objects.requireNonNull(settingsConsumer); DeleteSettings settings = new DeleteSettings(); settingsConsumer.accept(settings); - return new EntityqlDeleteStatement<>(config, entityDef, entity, settings); + return new EntityqlDeleteStatement<>(config, entityMetamodel, entity, settings); } - public Statement insert(EntityDef entityDef, ENTITY entity) { - Objects.requireNonNull(entityDef); + public Statement> insert( + EntityMetamodel entityMetamodel, ENTITY entity) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); - return insert(entityDef, entity, options -> {}); + return insert(entityMetamodel, entity, settings -> {}); } - public Statement insert( - EntityDef entityDef, ENTITY entity, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + public Statement> insert( + EntityMetamodel entityMetamodel, + ENTITY entity, + Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entity); Objects.requireNonNull(settingsConsumer); InsertSettings settings = new InsertSettings(); settingsConsumer.accept(settings); - return new EntityqlInsertStatement<>(config, entityDef, entity, settings); + return new EntityqlInsertStatement<>(config, entityMetamodel, entity, settings); } - public Statement> update( - EntityDef entityDef, List entities) { - Objects.requireNonNull(entityDef); + public Statement> update( + EntityMetamodel entityMetamodel, List entities) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); - return update(entityDef, entities, options -> {}); + return update(entityMetamodel, entities, settings -> {}); } - public Statement> update( - EntityDef entityDef, + public Statement> update( + EntityMetamodel entityMetamodel, List entities, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); Objects.requireNonNull(settingsConsumer); UpdateSettings settings = new UpdateSettings(); settingsConsumer.accept(settings); - return new EntityqlBatchUpdateStatement<>(config, entityDef, entities, settings); + return new EntityqlBatchUpdateStatement<>(config, entityMetamodel, entities, settings); } - public Statement> delete( - EntityDef entityDef, List entities) { - Objects.requireNonNull(entityDef); + public Statement> delete( + EntityMetamodel entityMetamodel, List entities) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); - return delete(entityDef, entities, options -> {}); + return delete(entityMetamodel, entities, settings -> {}); } - public Statement> delete( - EntityDef entityDef, + public Statement> delete( + EntityMetamodel entityMetamodel, List entities, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); Objects.requireNonNull(settingsConsumer); DeleteSettings settings = new DeleteSettings(); settingsConsumer.accept(settings); - return new EntityqlBatchDeleteStatement<>(config, entityDef, entities, settings); + return new EntityqlBatchDeleteStatement<>(config, entityMetamodel, entities, settings); } - public Statement> insert( - EntityDef entityDef, List entities) { - Objects.requireNonNull(entityDef); + public Statement> insert( + EntityMetamodel entityMetamodel, List entities) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); - return insert(entityDef, entities, options -> {}); + return insert(entityMetamodel, entities, settings -> {}); } - public Statement> insert( - EntityDef entityDef, + public Statement> insert( + EntityMetamodel entityMetamodel, List entities, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(entities); Objects.requireNonNull(settingsConsumer); InsertSettings settings = new InsertSettings(); settingsConsumer.accept(settings); - return new EntityqlBatchInsertStatement<>(config, entityDef, entities, settings); + return new EntityqlBatchInsertStatement<>(config, entityMetamodel, entities, settings); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/NativeSql.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/NativeSql.java index 59b40f650..ed0b007a0 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/NativeSql.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/NativeSql.java @@ -18,7 +18,7 @@ import org.seasar.doma.jdbc.criteria.declaration.InsertDeclaration; import org.seasar.doma.jdbc.criteria.declaration.SelectFromDeclaration; import org.seasar.doma.jdbc.criteria.declaration.UpdateDeclaration; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.criteria.statement.NativeSqlDeleteStarting; import org.seasar.doma.jdbc.criteria.statement.NativeSqlInsertStarting; import org.seasar.doma.jdbc.criteria.statement.NativeSqlSelectStarting; @@ -33,62 +33,62 @@ public NativeSql(Config config) { this.config = Objects.requireNonNull(config); } - public NativeSqlSelectStarting from(EntityDef entityDef) { - return from(entityDef, (options) -> {}); + public NativeSqlSelectStarting from(EntityMetamodel entityMetamodel) { + return from(entityMetamodel, (settings) -> {}); } public NativeSqlSelectStarting from( - EntityDef entityDef, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(settingsConsumer); - SelectContext context = new SelectContext(entityDef); + SelectContext context = new SelectContext(entityMetamodel); settingsConsumer.accept(context.getSettings()); SelectFromDeclaration declaration = new SelectFromDeclaration(context); Function> factory = - query -> new EntityProvider<>(entityDef.asType(), query, false); - return new NativeSqlSelectStarting<>(config, declaration, entityDef, factory); + query -> new EntityProvider<>(entityMetamodel.asType(), query, false); + return new NativeSqlSelectStarting<>(config, declaration, entityMetamodel, factory); } - public NativeSqlUpdateStarting update(EntityDef entityDef) { - Objects.requireNonNull(entityDef); - return this.update(entityDef, options -> {}); + public NativeSqlUpdateStarting update(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + return this.update(entityMetamodel, settings -> {}); } public NativeSqlUpdateStarting update( - EntityDef entityDef, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(settingsConsumer); - UpdateContext context = new UpdateContext(entityDef); + UpdateContext context = new UpdateContext(entityMetamodel); settingsConsumer.accept(context.getSettings()); UpdateDeclaration declaration = new UpdateDeclaration(context); return new NativeSqlUpdateStarting(config, declaration); } - public NativeSqlDeleteStarting delete(EntityDef entityDef) { - Objects.requireNonNull(entityDef); - return this.delete(entityDef, options -> {}); + public NativeSqlDeleteStarting delete(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + return this.delete(entityMetamodel, settings -> {}); } public NativeSqlDeleteStarting delete( - EntityDef entityDef, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(settingsConsumer); - DeleteContext context = new DeleteContext(entityDef); + DeleteContext context = new DeleteContext(entityMetamodel); settingsConsumer.accept(context.getSettings()); DeleteDeclaration declaration = new DeleteDeclaration(context); return new NativeSqlDeleteStarting(config, declaration); } - public NativeSqlInsertStarting insert(EntityDef entityDef) { - Objects.requireNonNull(entityDef); - return this.insert(entityDef, options -> {}); + public NativeSqlInsertStarting insert(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + return this.insert(entityMetamodel, settings -> {}); } public NativeSqlInsertStarting insert( - EntityDef entityDef, Consumer settingsConsumer) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer settingsConsumer) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(settingsConsumer); - InsertContext context = new InsertContext(entityDef); + InsertContext context = new InsertContext(entityMetamodel); settingsConsumer.accept(context.getSettings()); InsertDeclaration declaration = new InsertDeclaration(context); return new NativeSqlInsertStarting(config, declaration); diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/AssociateCommand.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/AssociateCommand.java index c51c4c84f..16da90747 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/AssociateCommand.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/AssociateCommand.java @@ -11,7 +11,7 @@ import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.command.SelectCommand; import org.seasar.doma.jdbc.criteria.context.SelectContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.Query; import org.seasar.doma.jdbc.query.SelectQuery; @@ -29,12 +29,12 @@ public AssociateCommand(SelectContext context, SelectQuery query) { @SuppressWarnings("unchecked") public List execute() { Map cache = new LinkedHashMap<>(); - List> entityDefs = context.allEntityDefs(); + List> entityMetamodels = context.allEntityDefs(); SelectCommand> command = - new SelectCommand<>(query, new EntityPoolIterationHandler(entityDefs)); + new SelectCommand<>(query, new EntityPoolIterationHandler(entityMetamodels)); List entityPools = command.execute(); for (EntityPool entityPool : entityPools) { - Map, Object> associationCandidate = new LinkedHashMap<>(); + Map, Object> associationCandidate = new LinkedHashMap<>(); for (Map.Entry e : entityPool.entrySet()) { EntityKey key = e.getKey(); EntityData data = e.getValue(); @@ -42,29 +42,29 @@ public List execute() { cache.computeIfAbsent( key, k -> { - EntityDef entityDef = k.getEntityDef(); - EntityType entityType = (EntityType) entityDef.asType(); + EntityMetamodel entityMetamodel = k.getEntityMetamodel(); + EntityType entityType = (EntityType) entityMetamodel.asType(); Object newEntity = entityType.newEntity(data.getStates()); if (!entityType.isImmutable()) { entityType.saveCurrentStates(newEntity); } return newEntity; }); - associationCandidate.put(key.getEntityDef(), entity); + associationCandidate.put(key.getEntityMetamodel(), entity); } associate(associationCandidate); } return (List) cache.entrySet().stream() - .filter(e -> e.getKey().getEntityDef() == context.entityDef) + .filter(e -> e.getKey().getEntityMetamodel() == context.entityMetamodel) .map(Map.Entry::getValue) .collect(toList()); } - private void associate(Map, Object> associationCandidate) { - for (Map.Entry, EntityDef>, BiConsumer> e : + private void associate(Map, Object> associationCandidate) { + for (Map.Entry, EntityMetamodel>, BiConsumer> e : context.associations.entrySet()) { - Pair, EntityDef> pair = e.getKey(); + Pair, EntityMetamodel> pair = e.getKey(); BiConsumer associator = e.getValue(); Object entity1 = associationCandidate.get(pair.fst); Object entity2 = associationCandidate.get(pair.snd); diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/DataRow.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/DataRow.java new file mode 100644 index 000000000..80a44d9e8 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/DataRow.java @@ -0,0 +1,11 @@ +package org.seasar.doma.jdbc.criteria.command; + +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; + +public interface DataRow { + + ENTITY get(EntityMetamodel entityEntityMetamodel); + + PROPERTY get(PropertyMetamodel propertyMetamodel); +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityKey.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityKey.java index ed4e4b1a1..7a31a1163 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityKey.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityKey.java @@ -3,20 +3,20 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public final class EntityKey { - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final List items; - public EntityKey(EntityDef entityDef, List items) { - this.entityDef = Objects.requireNonNull(entityDef); + public EntityKey(EntityMetamodel entityMetamodel, List items) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(items); this.items = Collections.unmodifiableList(items); } - public EntityDef getEntityDef() { - return entityDef; + public EntityMetamodel getEntityMetamodel() { + return entityMetamodel; } @Override @@ -24,11 +24,11 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof EntityKey)) return false; EntityKey entityKey = (EntityKey) o; - return entityDef.equals(entityKey.entityDef) && items.equals(entityKey.items); + return entityMetamodel.equals(entityKey.entityMetamodel) && items.equals(entityKey.items); } @Override public int hashCode() { - return Objects.hash(entityDef, items); + return Objects.hash(entityMetamodel, items); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolIterationHandler.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolIterationHandler.java index b60fc53e4..8083b8e1d 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolIterationHandler.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolIterationHandler.java @@ -5,20 +5,20 @@ import org.seasar.doma.internal.jdbc.command.AbstractIterationHandler; import org.seasar.doma.internal.jdbc.command.ResultListCallback; import org.seasar.doma.jdbc.ObjectProvider; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.query.SelectQuery; public class EntityPoolIterationHandler extends AbstractIterationHandler> { - private final List> entityDefs; + private final List> entityMetamodels; - public EntityPoolIterationHandler(List> entityDefs) { + public EntityPoolIterationHandler(List> entityMetamodels) { super(new ResultListCallback<>()); - this.entityDefs = Objects.requireNonNull(entityDefs); + this.entityMetamodels = Objects.requireNonNull(entityMetamodels); } @Override protected ObjectProvider createObjectProvider(SelectQuery query) { - return new EntityPoolProvider(entityDefs, query); + return new EntityPoolProvider(entityMetamodels, query); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolProvider.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolProvider.java index dee1486dd..16aa6a313 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolProvider.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/EntityPoolProvider.java @@ -2,8 +2,6 @@ import static java.util.stream.Collectors.toList; -import java.sql.CallableStatement; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -12,28 +10,21 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; -import org.seasar.doma.DomaNullPointerException; -import org.seasar.doma.internal.jdbc.command.JdbcValueGetter; -import org.seasar.doma.jdbc.JdbcMappable; -import org.seasar.doma.jdbc.JdbcMappingFunction; -import org.seasar.doma.jdbc.JdbcMappingVisitor; import org.seasar.doma.jdbc.ObjectProvider; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityPropertyType; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.entity.Property; import org.seasar.doma.jdbc.query.Query; -import org.seasar.doma.jdbc.type.JdbcType; -import org.seasar.doma.wrapper.Wrapper; public class EntityPoolProvider implements ObjectProvider { - private final List> entityDefs; - private final JdbcMappingVisitor jdbcMappingVisitor; + private final List> entityMetamodels; + private final FetchSupport fetchSupport; - public EntityPoolProvider(List> entityDefs, Query query) { - this.entityDefs = Objects.requireNonNull(entityDefs); + public EntityPoolProvider(List> entityMetamodels, Query query) { + this.entityMetamodels = Objects.requireNonNull(entityMetamodels); Objects.requireNonNull(query); - this.jdbcMappingVisitor = query.getConfig().getDialect().getJdbcMappingVisitor(); + this.fetchSupport = new FetchSupport(query); } @Override @@ -42,13 +33,13 @@ public EntityPool get(ResultSet resultSet) throws SQLException { Objects.requireNonNull(resultSet); EntityPool entityPool = new EntityPool(); int index = 1; - for (EntityDef entityDef : entityDefs) { - EntityType entityType = entityDef.asType(); + for (EntityMetamodel entityMetamodel : entityMetamodels) { + EntityType entityType = entityMetamodel.asType(); List> propertyTypes = entityType.getEntityPropertyTypes(); List props = new ArrayList<>(propertyTypes.size()); for (EntityPropertyType propertyType : propertyTypes) { Property property = (Property) propertyType.createProperty(); - Object rawValue = fetch(resultSet, property, index++); + Object rawValue = fetchSupport.fetch(resultSet, property, index++); props.add(new Prop(propertyType, property, rawValue)); } if (props.stream().allMatch(p -> p.rawValue == null)) { @@ -56,14 +47,14 @@ public EntityPool get(ResultSet resultSet) throws SQLException { } EntityKey key; if (entityType.getIdPropertyTypes().isEmpty()) { - key = new EntityKey(entityDef, Collections.singletonList(new Object())); + key = new EntityKey(entityMetamodel, Collections.singletonList(new Object())); } else { List items = props.stream() .filter(it -> it.propType.isId()) .map(it -> it.prop.getWrapper().get()) .collect(toList()); - key = new EntityKey(entityDef, items); + key = new EntityKey(entityMetamodel, items); } Map> states = props.stream().collect(Collectors.toMap(p -> p.propType.getName(), p -> p.prop)); @@ -73,14 +64,6 @@ public EntityPool get(ResultSet resultSet) throws SQLException { return entityPool; } - private Object fetch(ResultSet resultSet, JdbcMappable mappable, int index) - throws SQLException { - Wrapper wrapper = mappable.getWrapper(); - JdbcValueGetterProxy proxy = new JdbcValueGetterProxy(new JdbcValueGetter(resultSet, index)); - wrapper.accept(jdbcMappingVisitor, proxy, mappable); - return proxy.rawValue; - } - private static class Prop { private final EntityPropertyType propType; private final Property prop; @@ -92,62 +75,4 @@ public Prop(EntityPropertyType propType, Property prop, Object this.rawValue = rawValue; } } - - private static class JdbcValueGetterProxy implements JdbcMappingFunction { - private final JdbcValueGetter jdbcValueGetter; - Object rawValue; - - JdbcValueGetterProxy(JdbcValueGetter jdbcValueGetter) { - Objects.requireNonNull(jdbcValueGetter); - this.jdbcValueGetter = jdbcValueGetter; - } - - @Override - public R apply(Wrapper wrapper, JdbcType jdbcType) throws SQLException { - JdbcTypeProxy proxy = new JdbcTypeProxy<>(jdbcType); - R result = jdbcValueGetter.apply(wrapper, proxy); - rawValue = proxy.rawValue; - return result; - } - } - - private static class JdbcTypeProxy implements JdbcType { - private final JdbcType jdbcType; - T rawValue; - - JdbcTypeProxy(JdbcType jdbcType) { - Objects.requireNonNull(jdbcType); - this.jdbcType = jdbcType; - } - - @Override - public T getValue(ResultSet resultSet, int index) - throws DomaNullPointerException, SQLException { - T value = jdbcType.getValue(resultSet, index); - rawValue = value; - return value; - } - - @Override - public void setValue(PreparedStatement preparedStatement, int index, T value) - throws SQLException { - jdbcType.setValue(preparedStatement, index, value); - } - - @Override - public void registerOutParameter(CallableStatement callableStatement, int index) - throws SQLException { - jdbcType.registerOutParameter(callableStatement, index); - } - - @Override - public T getValue(CallableStatement callableStatement, int index) throws SQLException { - return jdbcType.getValue(callableStatement, index); - } - - @Override - public String convertToLogFormat(T value) { - return jdbcType.convertToLogFormat(value); - } - } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/FetchSupport.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/FetchSupport.java new file mode 100644 index 000000000..609db6383 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/FetchSupport.java @@ -0,0 +1,91 @@ +package org.seasar.doma.jdbc.criteria.command; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Objects; +import org.seasar.doma.DomaNullPointerException; +import org.seasar.doma.internal.jdbc.command.JdbcValueGetter; +import org.seasar.doma.jdbc.JdbcMappable; +import org.seasar.doma.jdbc.JdbcMappingFunction; +import org.seasar.doma.jdbc.JdbcMappingVisitor; +import org.seasar.doma.jdbc.query.Query; +import org.seasar.doma.jdbc.type.JdbcType; +import org.seasar.doma.wrapper.Wrapper; + +public class FetchSupport { + + private final JdbcMappingVisitor jdbcMappingVisitor; + + public FetchSupport(Query query) { + Objects.requireNonNull(query); + this.jdbcMappingVisitor = query.getConfig().getDialect().getJdbcMappingVisitor(); + } + + public Object fetch(ResultSet resultSet, JdbcMappable mappable, int index) + throws SQLException { + Wrapper wrapper = mappable.getWrapper(); + JdbcValueGetterProxy proxy = new JdbcValueGetterProxy(new JdbcValueGetter(resultSet, index)); + wrapper.accept(jdbcMappingVisitor, proxy, mappable); + return proxy.rawValue; + } + + private static class JdbcValueGetterProxy implements JdbcMappingFunction { + private final JdbcValueGetter jdbcValueGetter; + Object rawValue; + + JdbcValueGetterProxy(JdbcValueGetter jdbcValueGetter) { + Objects.requireNonNull(jdbcValueGetter); + this.jdbcValueGetter = jdbcValueGetter; + } + + @Override + public R apply(Wrapper wrapper, JdbcType jdbcType) throws SQLException { + JdbcTypeProxy proxy = new JdbcTypeProxy<>(jdbcType); + R result = jdbcValueGetter.apply(wrapper, proxy); + rawValue = proxy.rawValue; + return result; + } + } + + private static class JdbcTypeProxy implements JdbcType { + private final JdbcType jdbcType; + T rawValue; + + JdbcTypeProxy(JdbcType jdbcType) { + Objects.requireNonNull(jdbcType); + this.jdbcType = jdbcType; + } + + @Override + public T getValue(ResultSet resultSet, int index) + throws DomaNullPointerException, SQLException { + T value = jdbcType.getValue(resultSet, index); + rawValue = value; + return value; + } + + @Override + public void setValue(PreparedStatement preparedStatement, int index, T value) + throws SQLException { + jdbcType.setValue(preparedStatement, index, value); + } + + @Override + public void registerOutParameter(CallableStatement callableStatement, int index) + throws SQLException { + jdbcType.registerOutParameter(callableStatement, index); + } + + @Override + public T getValue(CallableStatement callableStatement, int index) throws SQLException { + return jdbcType.getValue(callableStatement, index); + } + + @Override + public String convertToLogFormat(T value) { + return jdbcType.convertToLogFormat(value); + } + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedResultProvider.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedResultProvider.java index 17adf1982..6713832a7 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedResultProvider.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/command/MappedResultProvider.java @@ -2,37 +2,69 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.function.Function; import org.seasar.doma.internal.jdbc.command.AbstractObjectProvider; -import org.seasar.doma.jdbc.JdbcMappingVisitor; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; -import org.seasar.doma.jdbc.criteria.statement.Row; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityPropertyType; +import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.entity.Property; import org.seasar.doma.jdbc.query.Query; public class MappedResultProvider extends AbstractObjectProvider { - private final Function mapper; - private final JdbcMappingVisitor jdbcMappingVisitor; + private final FetchSupport fetchSupport; + private final Function mapper; - public MappedResultProvider(Query query, Function mapper) { + public MappedResultProvider(Query query, Function mapper) { Objects.requireNonNull(query); + this.fetchSupport = new FetchSupport(query); this.mapper = Objects.requireNonNull(mapper); - this.jdbcMappingVisitor = query.getConfig().getDialect().getJdbcMappingVisitor(); } @Override @SuppressWarnings("unchecked") public RESULT get(ResultSet resultSet) throws SQLException { - Row row = - new Row() { + DataRow dataRow = + new DataRow() { int index = 1; @Override - public PROPERTY get(PropertyDef propertyDef) { + public ENTITY get(EntityMetamodel entityMetamodel) { + List> propertyDefs = entityMetamodel.allPropertyMetamodels(); + Map> states = new HashMap<>(propertyDefs.size()); + List rawValues = new ArrayList<>(propertyDefs.size()); + for (PropertyMetamodel propertyDef : propertyDefs) { + EntityPropertyType propertyType = propertyDef.asType(); + Property property = (Property) propertyType.createProperty(); + try { + Object rawValue = fetchSupport.fetch(resultSet, property, index++); + rawValues.add(rawValue); + } catch (SQLException e) { + throw new UncheckedSQLException(e); + } + states.put(propertyType.getName(), property); + } + if (rawValues.stream().allMatch(Objects::isNull)) { + return null; + } + EntityType entityType = entityMetamodel.asType(); + ENTITY entity = entityType.newEntity(states); + if (!entityType.isImmutable()) { + entityType.saveCurrentStates(entity); + } + return entity; + } + + @Override + public PROPERTY get(PropertyMetamodel propertyDef) { Property property = propertyDef.asType().createProperty(); try { - fetch(resultSet, property, index++, jdbcMappingVisitor); + fetchSupport.fetch(resultSet, property, index++); } catch (SQLException e) { throw new UncheckedSQLException(e); } @@ -40,7 +72,7 @@ public PROPERTY get(PropertyDef propertyDef) { } }; try { - return mapper.apply(row); + return mapper.apply(dataRow); } catch (UncheckedSQLException e) { throw e.getCause(); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Context.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Context.java index af4d86316..e41d2d9e6 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Context.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Context.java @@ -1,15 +1,11 @@ package org.seasar.doma.jdbc.criteria.context; import java.util.List; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public interface Context { - List> getEntityDefs(); - - List getWhere(); - - void setWhere(List where); + List> getEntityMetamodels(); Settings getSettings(); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteContext.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteContext.java index c6fb58f8b..c33329221 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteContext.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteContext.java @@ -4,32 +4,22 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class DeleteContext implements Context { - public final EntityDef entityDef; - public final List> entityDefs; + public final EntityMetamodel entityMetamodel; + public final List> entityMetamodels; public List where = new ArrayList<>(); public final DeleteSettings settings = new DeleteSettings(); - public DeleteContext(EntityDef entityDef) { - this.entityDef = Objects.requireNonNull(entityDef); - this.entityDefs = Collections.singletonList(entityDef); + public DeleteContext(EntityMetamodel entityMetamodel) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); + this.entityMetamodels = Collections.singletonList(entityMetamodel); } @Override - public List> getEntityDefs() { - return entityDefs; - } - - @Override - public List getWhere() { - return where; - } - - @Override - public void setWhere(List where) { - this.where = where; + public List> getEntityMetamodels() { + return entityMetamodels; } @Override diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteSettings.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteSettings.java index 10f70de43..b414af94c 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteSettings.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/DeleteSettings.java @@ -3,6 +3,8 @@ public class DeleteSettings extends Settings { private int batchSize = 0; private boolean allowEmptyWhere; + private boolean ignoreVersion; + private boolean suppressOptimisticLockException; public int getBatchSize() { return batchSize; @@ -19,4 +21,20 @@ public boolean getAllowEmptyWhere() { public void setAllowEmptyWhere(boolean allowEmptyWhere) { this.allowEmptyWhere = allowEmptyWhere; } + + public boolean getIgnoreVersion() { + return ignoreVersion; + } + + public void setIgnoreVersion(boolean ignoreVersion) { + this.ignoreVersion = ignoreVersion; + } + + public boolean getSuppressOptimisticLockException() { + return suppressOptimisticLockException; + } + + public void setSuppressOptimisticLockException(boolean suppressOptimisticLockException) { + this.suppressOptimisticLockException = suppressOptimisticLockException; + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/InsertContext.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/InsertContext.java index 16fda4020..83844244a 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/InsertContext.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/InsertContext.java @@ -5,32 +5,23 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class InsertContext implements Context { - public final EntityDef entityDef; - public final List> entityDefs; + public final EntityMetamodel entityMetamodel; + public final List> entityMetamodels; public final Map values = new LinkedHashMap<>(); public final InsertSettings settings = new InsertSettings(); + public SelectContext selectContext; - public InsertContext(EntityDef entityDef) { - this.entityDef = Objects.requireNonNull(entityDef); - this.entityDefs = Collections.singletonList(entityDef); + public InsertContext(EntityMetamodel entityMetamodel) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); + this.entityMetamodels = Collections.singletonList(entityMetamodel); } @Override - public List> getEntityDefs() { - return entityDefs; - } - - @Override - public List getWhere() { - throw new UnsupportedOperationException(); - } - - @Override - public void setWhere(List where) { - throw new UnsupportedOperationException(); + public List> getEntityMetamodels() { + return entityMetamodels; } @Override diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Join.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Join.java index cc45130d2..beea21e59 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Join.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Join.java @@ -3,15 +3,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class Join { - public final EntityDef entityDef; + public final EntityMetamodel entityMetamodel; public final JoinKind kind; public final List on = new ArrayList<>(); - public Join(EntityDef entityDef, JoinKind kind) { - this.entityDef = Objects.requireNonNull(entityDef); + public Join(EntityMetamodel entityMetamodel, JoinKind kind) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.kind = Objects.requireNonNull(kind); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Operand.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Operand.java index 27c611c09..613570494 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Operand.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Operand.java @@ -7,23 +7,23 @@ import org.seasar.doma.internal.jdbc.sql.ScalarInParameter; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.InParameter; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public interface Operand { R accept(Visitor visitor); - class Param implements Operand { - private final PropertyDef propertyDef; + final class Param implements Operand { + private final PropertyMetamodel propertyMetamodel; private final Object value; - public Param(PropertyDef propertyDef, Object value) { - this.propertyDef = Objects.requireNonNull(propertyDef); + public Param(PropertyMetamodel propertyMetamodel, Object value) { + this.propertyMetamodel = Objects.requireNonNull(propertyMetamodel); this.value = value; } public InParameter createInParameter(Config config) { - Class clazz = propertyDef.asClass(); + Class clazz = propertyMetamodel.asClass(); Supplier> supplier = Scalars.wrap(value, clazz, false, config.getClassHelper()); return new ScalarInParameter<>(supplier.get()); } @@ -32,12 +32,26 @@ public InParameter createInParameter(Config config) { public R accept(Visitor visitor) { return visitor.visit(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Param)) return false; + Param param = (Param) o; + return propertyMetamodel.equals(param.propertyMetamodel) + && Objects.equals(value, param.value); + } + + @Override + public int hashCode() { + return Objects.hash(propertyMetamodel, value); + } } - class Prop implements Operand { - public final PropertyDef value; + final class Prop implements Operand { + public final PropertyMetamodel value; - public Prop(PropertyDef value) { + public Prop(PropertyMetamodel value) { this.value = Objects.requireNonNull(value); } @@ -45,6 +59,19 @@ public Prop(PropertyDef value) { public R accept(Visitor visitor) { return visitor.visit(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Prop)) return false; + Prop prop = (Prop) o; + return value.equals(prop.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } interface Visitor { diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/OrderByItem.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/OrderByItem.java index f820eb5ef..bdc4e4e4c 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/OrderByItem.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/OrderByItem.java @@ -1,16 +1,16 @@ package org.seasar.doma.jdbc.criteria.context; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public interface OrderByItem { void accept(Visitor visitor); class Name implements OrderByItem { - public final PropertyDef value; + public final PropertyMetamodel value; - public Name(PropertyDef value) { + public Name(PropertyMetamodel value) { this.value = Objects.requireNonNull(value); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Projection.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Projection.java index ffd0a88d5..0305ae9e0 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Projection.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Projection.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public interface Projection { All All = new All() {}; @@ -20,15 +20,15 @@ public R accept(Visitor visitor) { } class List implements Projection { - public final java.util.List> propertyDefs; + public final java.util.List> propertyMetamodels; - public List(PropertyDef... propertyDefs) { - this(Arrays.asList(propertyDefs)); + public List(PropertyMetamodel... propertyMetamodels) { + this(Arrays.asList(propertyMetamodels)); } - public List(java.util.List> propertyDefs) { - Objects.requireNonNull(propertyDefs); - this.propertyDefs = Collections.unmodifiableList(propertyDefs); + public List(java.util.List> propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + this.propertyMetamodels = Collections.unmodifiableList(propertyMetamodels); } @Override diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectContext.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectContext.java index 52de75c54..be1cfa8c2 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectContext.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectContext.java @@ -10,48 +10,39 @@ import java.util.function.BiConsumer; import java.util.stream.Stream; import org.seasar.doma.internal.util.Pair; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.DistinctOption; import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; public class SelectContext implements Context { - public final EntityDef entityDef; + public final EntityMetamodel entityMetamodel; public Projection projection = Projection.All; - public DistinctOption distinct = DistinctOption.DISABLED; + public DistinctOption distinct = DistinctOption.none(); public final List joins = new ArrayList<>(); public List where = new ArrayList<>(); - public final List> groupBy = new ArrayList<>(); + public final List> groupBy = new ArrayList<>(); public List having = new ArrayList<>(); public final List> orderBy = new ArrayList<>(); public Integer limit; public Integer offset; - public ForUpdate forUpdate = new ForUpdate(ForUpdateOption.DISABLED); - public final Map, EntityDef>, BiConsumer> associations = - new LinkedHashMap<>(); + public ForUpdate forUpdate = new ForUpdate(ForUpdateOption.none()); + public final Map, EntityMetamodel>, BiConsumer> + associations = new LinkedHashMap<>(); public final SelectSettings settings = new SelectSettings(); - public SelectContext(EntityDef entityDef) { - this.entityDef = Objects.requireNonNull(entityDef); + public SelectContext(EntityMetamodel entityMetamodel) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); } @Override - public List> getEntityDefs() { - List> entityDefs = new ArrayList<>(); - entityDefs.add(entityDef); - List> joinedEntityDefs = joins.stream().map(j -> j.entityDef).collect(toList()); - entityDefs.addAll(joinedEntityDefs); - return entityDefs; - } - - @Override - public List getWhere() { - return where; - } - - @Override - public void setWhere(List where) { - this.where = where; + public List> getEntityMetamodels() { + List> entityMetamodels = new ArrayList<>(); + entityMetamodels.add(entityMetamodel); + List> joinedEntityMetamodels = + joins.stream().map(j -> j.entityMetamodel).collect(toList()); + entityMetamodels.addAll(joinedEntityMetamodels); + return entityMetamodels; } @Override @@ -59,29 +50,29 @@ public SelectSettings getSettings() { return settings; } - public List> allEntityDefs() { - Stream> a = Stream.of(entityDef); - Stream> b = + public List> allEntityDefs() { + Stream> a = Stream.of(entityMetamodel); + Stream> b = associations.keySet().stream().flatMap(pair -> Stream.of(pair.fst, pair.snd)); return Stream.concat(a, b).distinct().collect(toList()); } - public List> allPropertyDefs() { + public List> allPropertyMetamodels() { return projection.accept( - new Projection.Visitor>>() { + new Projection.Visitor>>() { @Override - public List> visit(Projection.All all) { + public List> visit(Projection.All all) { return allEntityDefs().stream() - .flatMap(it -> it.allPropertyDefs().stream()) + .flatMap(it -> it.allPropertyMetamodels().stream()) .collect(toList()); } @Override - public List> visit(Projection.List list) { - if (list.propertyDefs.isEmpty()) { + public List> visit(Projection.List list) { + if (list.propertyMetamodels.isEmpty()) { return visit(Projection.All); } - return list.propertyDefs; + return list.propertyMetamodels; } }); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectSettings.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectSettings.java index 49d3968dd..23f0c46c4 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectSettings.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/SelectSettings.java @@ -1,9 +1,18 @@ package org.seasar.doma.jdbc.criteria.context; public class SelectSettings extends Settings { + private boolean allowEmptyWhere = true; private int fetchSize = 0; private int maxRows = 0; + public boolean getAllowEmptyWhere() { + return allowEmptyWhere; + } + + public void setAllowEmptyWhere(boolean allowEmptyWhere) { + this.allowEmptyWhere = allowEmptyWhere; + } + public int getFetchSize() { return fetchSize; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Settings.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Settings.java index a304ca105..a070b874d 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Settings.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/Settings.java @@ -1,5 +1,6 @@ package org.seasar.doma.jdbc.criteria.context; +import java.util.Objects; import org.seasar.doma.jdbc.SqlLogType; public class Settings { @@ -12,6 +13,7 @@ public String getComment() { } public void setComment(String comment) { + Objects.requireNonNull(comment); this.comment = comment; } @@ -20,6 +22,7 @@ public SqlLogType getSqlLogType() { } public void setSqlLogType(SqlLogType sqlLogType) { + Objects.requireNonNull(sqlLogType); this.sqlLogType = sqlLogType; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateContext.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateContext.java index 19431a6ed..b3a9fcc9a 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateContext.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateContext.java @@ -6,33 +6,23 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class UpdateContext implements Context { - public final EntityDef entityDef; - public final List> entityDefs; - public final Map set = new LinkedHashMap<>(); + public final EntityMetamodel entityMetamodel; + public final List> entityMetamodels; + public final Map set = new LinkedHashMap<>(); public List where = new ArrayList<>(); public final UpdateSettings settings = new UpdateSettings(); - public UpdateContext(EntityDef entityDef) { - this.entityDef = Objects.requireNonNull(entityDef); - this.entityDefs = Collections.singletonList(entityDef); + public UpdateContext(EntityMetamodel entityMetamodel) { + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); + this.entityMetamodels = Collections.singletonList(entityMetamodel); } @Override - public List> getEntityDefs() { - return entityDefs; - } - - @Override - public List getWhere() { - return where; - } - - @Override - public void setWhere(List where) { - this.where = where; + public List> getEntityMetamodels() { + return entityMetamodels; } @Override diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateSettings.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateSettings.java index 6e4bf596a..23cc0afc7 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateSettings.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/context/UpdateSettings.java @@ -1,8 +1,10 @@ package org.seasar.doma.jdbc.criteria.context; public class UpdateSettings extends Settings { - int batchSize = 0; - boolean allowEmptyWhere; + private int batchSize = 0; + private boolean allowEmptyWhere; + private boolean ignoreVersion; + private boolean suppressOptimisticLockException; public int getBatchSize() { return batchSize; @@ -19,4 +21,20 @@ public boolean getAllowEmptyWhere() { public void setAllowEmptyWhere(boolean allowEmptyWhere) { this.allowEmptyWhere = allowEmptyWhere; } + + public boolean getIgnoreVersion() { + return ignoreVersion; + } + + public void setIgnoreVersion(boolean ignoreVersion) { + this.ignoreVersion = ignoreVersion; + } + + public boolean getSuppressOptimisticLockException() { + return suppressOptimisticLockException; + } + + public void setSuppressOptimisticLockException(boolean suppressOptimisticLockException) { + this.suppressOptimisticLockException = suppressOptimisticLockException; + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ComparisonDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ComparisonDeclaration.java index 469b1d2f7..9579a4103 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ComparisonDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ComparisonDeclaration.java @@ -1,101 +1,119 @@ package org.seasar.doma.jdbc.criteria.declaration; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; import java.util.function.Function; -import org.seasar.doma.jdbc.criteria.context.Context; +import java.util.function.Supplier; import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.Operand; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; -public abstract class ComparisonDeclaration { +public abstract class ComparisonDeclaration { - protected final CONTEXT context; + private final Supplier> getter; + private final Consumer> setter; - protected ComparisonDeclaration(CONTEXT context) { - this.context = Objects.requireNonNull(context); + protected ComparisonDeclaration( + Supplier> getter, Consumer> setter) { + this.getter = Objects.requireNonNull(getter); + this.setter = Objects.requireNonNull(setter); } - public void eq(PropertyDef left, PROPERTY right) { + public void eq(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Eq(new Operand.Prop(left), new Operand.Param(left, right))); } - public void eq(PropertyDef left, PropertyDef right) { + public void eq(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Eq(new Operand.Prop(left), new Operand.Prop(right))); } - public void ne(PropertyDef left, PROPERTY right) { + public void ne(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Ne(new Operand.Prop(left), new Operand.Param(left, right))); } - public void ne(PropertyDef left, PropertyDef right) { + public void ne(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Ne(new Operand.Prop(left), new Operand.Prop(right))); } - public void gt(PropertyDef left, PROPERTY right) { + public void gt(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Gt(new Operand.Prop(left), new Operand.Param(left, right))); } - public void gt(PropertyDef left, PropertyDef right) { + public void gt(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Gt(new Operand.Prop(left), new Operand.Prop(right))); } - public void ge(PropertyDef left, PROPERTY right) { + public void ge(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Ge(new Operand.Prop(left), new Operand.Param(left, right))); } - public void ge(PropertyDef left, PropertyDef right) { + public void ge(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Ge(new Operand.Prop(left), new Operand.Prop(right))); } - public void lt(PropertyDef left, PROPERTY right) { + public void lt(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Lt(new Operand.Prop(left), new Operand.Param(left, right))); } - public void lt(PropertyDef left, PropertyDef right) { + public void lt(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Lt(new Operand.Prop(left), new Operand.Prop(right))); } - public void le(PropertyDef left, PROPERTY right) { + public void le(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add(new Criterion.Le(new Operand.Prop(left), new Operand.Param(left, right))); } - public void le(PropertyDef left, PropertyDef right) { + public void le(PropertyMetamodel left, PropertyMetamodel right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.Le(new Operand.Prop(left), new Operand.Prop(right))); } public void and(Runnable block) { + Objects.requireNonNull(block); runBlock(block, Criterion.And::new); } public void or(Runnable block) { + Objects.requireNonNull(block); runBlock(block, Criterion.Or::new); } public void not(Runnable block) { + Objects.requireNonNull(block); runBlock(block, Criterion.Not::new); } - protected abstract void runBlock( - Runnable block, Function, Criterion> newCriterion); + private void runBlock(Runnable block, Function, Criterion> factory) { + List preservedList = getter.get(); + List newList = new ArrayList<>(); + setter.accept(newList); + block.run(); + setter.accept(preservedList); + if (!newList.isEmpty()) { + add(factory.apply(newList)); + } + } - protected abstract void add(Criterion criterion); + protected void add(Criterion criterion) { + getter.get().add(criterion); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/HavingDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/HavingDeclaration.java index 56ea0c75c..9afc8bcec 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/HavingDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/HavingDeclaration.java @@ -1,31 +1,12 @@ package org.seasar.doma.jdbc.criteria.declaration; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import org.seasar.doma.jdbc.criteria.context.Criterion; +import java.util.Objects; import org.seasar.doma.jdbc.criteria.context.SelectContext; -public class HavingDeclaration extends ComparisonDeclaration { +public class HavingDeclaration extends ComparisonDeclaration { public HavingDeclaration(SelectContext context) { - super(context); - } - - @Override - protected void runBlock(Runnable block, Function, Criterion> newCriterion) { - List preservedWhere = context.having; - List newWhere = new ArrayList<>(); - context.having = newWhere; - block.run(); - context.having = preservedWhere; - if (!newWhere.isEmpty()) { - add(newCriterion.apply(newWhere)); - } - } - - @Override - protected void add(Criterion criterion) { - context.having.add(criterion); + super(() -> context.having, h -> context.having = h); + Objects.requireNonNull(context); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertDeclaration.java index ff6c2a8c0..633f08369 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertDeclaration.java @@ -2,7 +2,9 @@ import java.util.Objects; import java.util.function.Consumer; +import java.util.function.Function; import org.seasar.doma.jdbc.criteria.context.InsertContext; +import org.seasar.doma.jdbc.criteria.context.SubSelectContext; public class InsertDeclaration { @@ -21,4 +23,10 @@ public void values(Consumer block) { ValuesDeclaration declaration = new ValuesDeclaration(context); block.accept(declaration); } + + public void select(Function> block) { + InsertSelectDeclaration declaration = new InsertSelectDeclaration(); + SubSelectContext subSelectContext = block.apply(declaration); + context.selectContext = subSelectContext.context; + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertSelectDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertSelectDeclaration.java new file mode 100644 index 000000000..11045b262 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/InsertSelectDeclaration.java @@ -0,0 +1,10 @@ +package org.seasar.doma.jdbc.criteria.declaration; + +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; + +public class InsertSelectDeclaration { + + public SubSelectFromDeclaration from(EntityMetamodel entityMetamodel) { + return new SubSelectFromDeclaration(entityMetamodel); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/JoinDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/JoinDeclaration.java index b3096f557..3aa0ef814 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/JoinDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/JoinDeclaration.java @@ -4,7 +4,7 @@ import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.Join; import org.seasar.doma.jdbc.criteria.context.Operand; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public class JoinDeclaration { @@ -18,27 +18,39 @@ private void add(Criterion criterion) { join.on.add(criterion); } - public void eq(PropertyDef left, PropertyDef right) { + public void eq(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Eq(new Operand.Prop(left), new Operand.Prop(right))); } - public void ne(PropertyDef left, PropertyDef right) { + public void ne(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Ne(new Operand.Prop(left), new Operand.Prop(right))); } - public void ge(PropertyDef left, PropertyDef right) { + public void ge(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Ge(new Operand.Prop(left), new Operand.Prop(right))); } - public void gt(PropertyDef left, PropertyDef right) { + public void gt(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Gt(new Operand.Prop(left), new Operand.Prop(right))); } - public void le(PropertyDef left, PropertyDef right) { + public void le(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Le(new Operand.Prop(left), new Operand.Prop(right))); } - public void lt(PropertyDef left, PropertyDef right) { + public void lt(PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); add(new Criterion.Lt(new Operand.Prop(left), new Operand.Prop(right))); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/OrderByNameDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/OrderByNameDeclaration.java index 4c572cd4d..8b544e543 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/OrderByNameDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/OrderByNameDeclaration.java @@ -4,7 +4,7 @@ import org.seasar.doma.internal.util.Pair; import org.seasar.doma.jdbc.criteria.context.OrderByItem; import org.seasar.doma.jdbc.criteria.context.SelectContext; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public class OrderByNameDeclaration { @@ -14,15 +14,15 @@ public OrderByNameDeclaration(SelectContext context) { this.context = Objects.requireNonNull(context); } - public void asc(PropertyDef propertyDef) { - Objects.requireNonNull(propertyDef); - Pair pair = new Pair<>(new OrderByItem.Name(propertyDef), "asc"); + public void asc(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + Pair pair = new Pair<>(new OrderByItem.Name(propertyMetamodel), "asc"); context.orderBy.add(pair); } - public void desc(PropertyDef propertyDef) { - Objects.requireNonNull(propertyDef); - Pair pair = new Pair<>(new OrderByItem.Name(propertyDef), "desc"); + public void desc(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + Pair pair = new Pair<>(new OrderByItem.Name(propertyMetamodel), "desc"); context.orderBy.add(pair); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SelectFromDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SelectFromDeclaration.java index e87a48ea1..969ff1e70 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SelectFromDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SelectFromDeclaration.java @@ -1,6 +1,7 @@ package org.seasar.doma.jdbc.criteria.declaration; import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -11,8 +12,8 @@ import org.seasar.doma.jdbc.criteria.context.JoinKind; import org.seasar.doma.jdbc.criteria.context.Projection; import org.seasar.doma.jdbc.criteria.context.SelectContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.AssociationOption; import org.seasar.doma.jdbc.criteria.option.DistinctOption; import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; @@ -34,23 +35,24 @@ public void distinct(DistinctOption distinctOption) { context.distinct = distinctOption; } - public void innerJoin(EntityDef entityDef, Consumer block) { - Objects.requireNonNull(entityDef); + public void innerJoin(EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(block); - join(entityDef, block, JoinKind.INNER); + join(entityMetamodel, block, JoinKind.INNER); } - public void leftJoin(EntityDef entityDef, Consumer block) { - Objects.requireNonNull(entityDef); + public void leftJoin(EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(block); - join(entityDef, block, JoinKind.LEFT); + join(entityMetamodel, block, JoinKind.LEFT); } - private void join(EntityDef entityDef, Consumer block, JoinKind joinKind) { - Objects.requireNonNull(entityDef); + private void join( + EntityMetamodel entityMetamodel, Consumer block, JoinKind joinKind) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(block); Objects.requireNonNull(joinKind); - Join join = new Join(entityDef, joinKind); + Join join = new Join(entityMetamodel, joinKind); JoinDeclaration declaration = new JoinDeclaration(join); block.accept(declaration); if (!join.on.isEmpty()) { @@ -64,8 +66,8 @@ public void where(Consumer block) { block.accept(declaration); } - public void groupBy(PropertyDef... propertyDefs) { - context.groupBy.addAll(Arrays.asList(propertyDefs)); + public void groupBy(PropertyMetamodel... propertyMetamodels) { + context.groupBy.addAll(Arrays.asList(propertyMetamodels)); } public void having(Consumer block) { @@ -89,31 +91,37 @@ public void offset(Integer offset) { } public void forUpdate(ForUpdateOption option) { + Objects.requireNonNull(option); context.forUpdate = new ForUpdate(option); } - public void select(PropertyDef... propertyDefs) { - context.projection = new Projection.List(propertyDefs); + public void select(List> propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + int i = 0; + for (PropertyMetamodel propertyMetamodel : propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels, "propertyMetamodels: " + i); + } + context.projection = new Projection.List(propertyMetamodels); } @SuppressWarnings("unchecked") public void associate( - EntityDef first, - EntityDef second, + EntityMetamodel first, + EntityMetamodel second, BiConsumer associator, - AssociationOption kind) { + AssociationOption option) { Objects.requireNonNull(first); Objects.requireNonNull(second); Objects.requireNonNull(associator); - Objects.requireNonNull(kind); - if (!context.getEntityDefs().contains(first)) { - if (kind == AssociationOption.MANDATORY) { + Objects.requireNonNull(option); + if (!context.getEntityMetamodels().contains(first)) { + if (option == AssociationOption.Kind.MANDATORY) { throw new DomaException(Message.DOMA6001, "first"); } return; } - if (!context.getEntityDefs().contains(second)) { - if (kind == AssociationOption.MANDATORY) { + if (!context.getEntityMetamodels().contains(second)) { + if (option == AssociationOption.Kind.MANDATORY) { throw new DomaException(Message.DOMA6001, "second"); } return; diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SetDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SetDeclaration.java index a11343c4f..71b5794fa 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SetDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SetDeclaration.java @@ -3,7 +3,7 @@ import java.util.Objects; import org.seasar.doma.jdbc.criteria.context.Operand; import org.seasar.doma.jdbc.criteria.context.UpdateContext; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public class SetDeclaration { @@ -13,8 +13,15 @@ public SetDeclaration(UpdateContext context) { this.context = Objects.requireNonNull(context); } - public void value(PropertyDef left, PROPERTY right) { + public void value(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); context.set.put(new Operand.Prop(left), new Operand.Param(left, right)); } + + public void value( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + context.set.put(new Operand.Prop(left), new Operand.Prop(right)); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SubSelectFromDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SubSelectFromDeclaration.java index 0ca074d63..2bee4de62 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SubSelectFromDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/SubSelectFromDeclaration.java @@ -1,33 +1,36 @@ package org.seasar.doma.jdbc.criteria.declaration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.function.Consumer; import org.seasar.doma.jdbc.criteria.context.Projection; import org.seasar.doma.jdbc.criteria.context.SelectContext; import org.seasar.doma.jdbc.criteria.context.SubSelectContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; public class SubSelectFromDeclaration { private final SelectFromDeclaration declaration; - public SubSelectFromDeclaration(EntityDef entityDef) { - Objects.requireNonNull(entityDef); - SelectContext context = new SelectContext(entityDef); + public SubSelectFromDeclaration(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + SelectContext context = new SelectContext(entityMetamodel); this.declaration = new SelectFromDeclaration(context); } public SubSelectFromDeclaration innerJoin( - EntityDef entityDef, Consumer block) { - declaration.innerJoin(entityDef, block); + EntityMetamodel entityMetamodel, Consumer block) { + declaration.innerJoin(entityMetamodel, block); return this; } public SubSelectFromDeclaration leftJoin( - EntityDef entityDef, Consumer block) { - declaration.leftJoin(entityDef, block); + EntityMetamodel entityMetamodel, Consumer block) { + declaration.leftJoin(entityMetamodel, block); return this; } @@ -41,16 +44,41 @@ public SubSelectFromDeclaration orderBy(Consumer block) return this; } - public SubSelectContext select(PropertyDef propertyDef) { + public SubSelectContext select() { SelectContext context = declaration.getContext(); - context.projection = new Projection.List(propertyDef); + return new SubSelectContext<>(context); + } + + public SubSelectContext select(EntityMetamodel entityMetamodel) { + SelectContext context = declaration.getContext(); + context.projection = new Projection.List(entityMetamodel.allPropertyMetamodels()); + return new SubSelectContext<>(context); + } + + public SubSelectContext select( + PropertyMetamodel propertyMetamodel) { + SelectContext context = declaration.getContext(); + context.projection = new Projection.List(propertyMetamodel); return new SubSelectContext<>(context); } public SubSelectContext> select( - PropertyDef first, PropertyDef second) { + PropertyMetamodel first, PropertyMetamodel second) { SelectContext context = declaration.getContext(); context.projection = new Projection.List(first, second); return new SubSelectContext<>(context); } + + public SubSelectContext> select( + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel... propertyMetamodels) { + SelectContext context = declaration.getContext(); + List> list = new ArrayList<>(2 + propertyMetamodels.length); + list.add(propertyMetamodel1); + list.add(propertyMetamodel2); + list.addAll(Arrays.asList(propertyMetamodels)); + context.projection = new Projection.List(list); + return new SubSelectContext<>(context); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ValuesDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ValuesDeclaration.java index ff52027e8..afa0bb1f1 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ValuesDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/ValuesDeclaration.java @@ -3,7 +3,7 @@ import java.util.Objects; import org.seasar.doma.jdbc.criteria.context.InsertContext; import org.seasar.doma.jdbc.criteria.context.Operand; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public class ValuesDeclaration { @@ -13,7 +13,7 @@ public ValuesDeclaration(InsertContext context) { this.context = Objects.requireNonNull(context); } - public void value(PropertyDef left, PROPERTY right) { + public void value(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); context.values.put(new Operand.Prop(left), new Operand.Param(left, right)); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/WhereDeclaration.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/WhereDeclaration.java index dbbc39472..1ca5dfabc 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/WhereDeclaration.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/WhereDeclaration.java @@ -2,69 +2,82 @@ import static java.util.stream.Collectors.toList; -import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.function.Function; -import org.seasar.doma.jdbc.criteria.context.Context; import org.seasar.doma.jdbc.criteria.context.Criterion; +import org.seasar.doma.jdbc.criteria.context.DeleteContext; import org.seasar.doma.jdbc.criteria.context.Operand; +import org.seasar.doma.jdbc.criteria.context.SelectContext; import org.seasar.doma.jdbc.criteria.context.SubSelectContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.context.UpdateContext; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.LikeOption; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; -public class WhereDeclaration extends ComparisonDeclaration { +public class WhereDeclaration extends ComparisonDeclaration { - public WhereDeclaration(Context context) { - super(context); + public WhereDeclaration(SelectContext context) { + super(() -> context.where, w -> context.where = w); + Objects.requireNonNull(context); } - public void isNull(PropertyDef propertyDef) { - Objects.requireNonNull(propertyDef); - add(new Criterion.IsNull(new Operand.Prop(propertyDef))); + public WhereDeclaration(DeleteContext context) { + super(() -> context.where, w -> context.where = w); + Objects.requireNonNull(context); } - public void isNotNull(PropertyDef propertyDef) { - Objects.requireNonNull(propertyDef); - add(new Criterion.IsNotNull(new Operand.Prop(propertyDef))); + public WhereDeclaration(UpdateContext context) { + super(() -> context.where, w -> context.where = w); + Objects.requireNonNull(context); } - public void like(PropertyDef left, PROPERTY right) { + public void isNull(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + add(new Criterion.IsNull(new Operand.Prop(propertyMetamodel))); + } + + public void isNotNull(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + add(new Criterion.IsNotNull(new Operand.Prop(propertyMetamodel))); + } + + public void like(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add( new Criterion.Like( - new Operand.Prop(left), new Operand.Param(left, right), LikeOption.NONE)); + new Operand.Prop(left), new Operand.Param(left, right), LikeOption.none())); } - public void like(PropertyDef left, PROPERTY right, LikeOption option) { + public void like(PropertyMetamodel left, PROPERTY right, LikeOption option) { Objects.requireNonNull(left); add(new Criterion.Like(new Operand.Prop(left), new Operand.Param(left, right), option)); } - public void notLike(PropertyDef left, PROPERTY right) { + public void notLike(PropertyMetamodel left, PROPERTY right) { Objects.requireNonNull(left); add( new Criterion.NotLike( - new Operand.Prop(left), new Operand.Param(left, right), LikeOption.NONE)); + new Operand.Prop(left), new Operand.Param(left, right), LikeOption.none())); } - public void notLike(PropertyDef left, PROPERTY right, LikeOption option) { + public void notLike( + PropertyMetamodel left, PROPERTY right, LikeOption option) { Objects.requireNonNull(left); add(new Criterion.NotLike(new Operand.Prop(left), new Operand.Param(left, right), option)); } - public void between(PropertyDef propertyDef, PROPERTY start, PROPERTY end) { - Objects.requireNonNull(propertyDef); + public void between( + PropertyMetamodel propertyMetamodel, PROPERTY start, PROPERTY end) { + Objects.requireNonNull(propertyMetamodel); add( new Criterion.Between( - new Operand.Prop(propertyDef), - new Operand.Param(propertyDef, start), - new Operand.Param(propertyDef, end))); + new Operand.Prop(propertyMetamodel), + new Operand.Param(propertyMetamodel, start), + new Operand.Param(propertyMetamodel, end))); } - public void in(PropertyDef left, List right) { + public void in(PropertyMetamodel left, List right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add( @@ -73,7 +86,7 @@ public void in(PropertyDef left, List right) { right.stream().map(p -> new Operand.Param(left, p)).collect(toList()))); } - public void notIn(PropertyDef left, List right) { + public void notIn(PropertyMetamodel left, List right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add( @@ -82,20 +95,20 @@ public void notIn(PropertyDef left, List right) { right.stream().map(p -> new Operand.Param(left, p)).collect(toList()))); } - public void in(PropertyDef left, SubSelectContext right) { + public void in(PropertyMetamodel left, SubSelectContext right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.InSubQuery(new Operand.Prop(left), right.context)); } - public void notIn(PropertyDef left, SubSelectContext right) { + public void notIn(PropertyMetamodel left, SubSelectContext right) { Objects.requireNonNull(left); Objects.requireNonNull(right); add(new Criterion.NotInSubQuery(new Operand.Prop(left), right.context)); } public void in( - Tuple2, PropertyDef> left, + Tuple2, PropertyMetamodel> left, List> right) { Operand.Prop prop1 = new Operand.Prop(left.getItem1()); Operand.Prop prop2 = new Operand.Prop(left.getItem2()); @@ -112,7 +125,7 @@ public void in( } public void notIn( - Tuple2, PropertyDef> left, + Tuple2, PropertyMetamodel> left, List> right) { Operand.Prop prop1 = new Operand.Prop(left.getItem1()); Operand.Prop prop2 = new Operand.Prop(left.getItem2()); @@ -129,7 +142,7 @@ public void notIn( } public void in( - Tuple2, PropertyDef> left, + Tuple2, PropertyMetamodel> left, SubSelectContext> right) { Objects.requireNonNull(left); Objects.requireNonNull(right); @@ -139,7 +152,7 @@ public void in( } public void notIn( - Tuple2, PropertyDef> left, + Tuple2, PropertyMetamodel> left, SubSelectContext> right) { Objects.requireNonNull(left); Objects.requireNonNull(right); @@ -158,36 +171,7 @@ public void notExists(SubSelectContext subSelectContext) { add(new Criterion.NotExists(subSelectContext.context)); } - public SubSelectFromDeclaration from(EntityDef entityDef) { - return new SubSelectFromDeclaration(entityDef); - } - - public void and(Runnable block) { - runBlock(block, Criterion.And::new); - } - - public void or(Runnable block) { - runBlock(block, Criterion.Or::new); - } - - public void not(Runnable block) { - runBlock(block, Criterion.Not::new); - } - - @Override - protected void runBlock(Runnable block, Function, Criterion> newCriterion) { - List preservedWhere = context.getWhere(); - List newWhere = new ArrayList<>(); - context.setWhere(newWhere); - block.run(); - context.setWhere(preservedWhere); - if (!newWhere.isEmpty()) { - add(newCriterion.apply(newWhere)); - } - } - - @Override - protected void add(Criterion criterion) { - context.getWhere().add(criterion); + public SubSelectFromDeclaration from(EntityMetamodel entityMetamodel) { + return new SubSelectFromDeclaration(entityMetamodel); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EmbeddableDef.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EmbeddableDef.java deleted file mode 100644 index 6706df69d..000000000 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EmbeddableDef.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.seasar.doma.jdbc.criteria.def; - -import java.util.List; - -public interface EmbeddableDef { - List> allPropertyDefs(); -} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EntityDef.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EntityDef.java deleted file mode 100644 index 6dce05d13..000000000 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/EntityDef.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.seasar.doma.jdbc.criteria.def; - -import java.util.List; -import org.seasar.doma.jdbc.entity.EntityType; - -public interface EntityDef { - - EntityType asType(); - - List> allPropertyDefs(); -} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/PropertyDef.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/PropertyDef.java deleted file mode 100644 index 5c95f13f2..000000000 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/PropertyDef.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.seasar.doma.jdbc.criteria.def; - -import org.seasar.doma.jdbc.entity.EntityPropertyType; - -public interface PropertyDef { - - Class asClass(); - - EntityPropertyType asType(); - - String getName(); -} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/AggregateFunction.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/AggregateFunction.java similarity index 64% rename from doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/AggregateFunction.java rename to doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/AggregateFunction.java index bbbc8a49d..b0f6a995e 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/declaration/AggregateFunction.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/AggregateFunction.java @@ -1,4 +1,4 @@ -package org.seasar.doma.jdbc.criteria.declaration; +package org.seasar.doma.jdbc.criteria.expression; import java.util.Objects; import java.util.Optional; @@ -8,23 +8,23 @@ import org.seasar.doma.internal.jdbc.scalar.Scalar; import org.seasar.doma.internal.jdbc.sql.ScalarInParameter; import org.seasar.doma.jdbc.InParameter; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityPropertyType; import org.seasar.doma.jdbc.entity.NamingType; import org.seasar.doma.jdbc.entity.Property; import org.seasar.doma.wrapper.LongWrapper; import org.seasar.doma.wrapper.Wrapper; -public interface AggregateFunction extends PropertyDef { +public interface AggregateFunction extends PropertyMetamodel { Asterisk Asterisk = new Asterisk(); - PropertyDef argument(); + PropertyMetamodel argument(); abstract class AbstractFunction implements AggregateFunction { private final String name; - private final PropertyDef argument; + private final PropertyMetamodel argument; - protected AbstractFunction(String name, PropertyDef argument) { + protected AbstractFunction(String name, PropertyMetamodel argument) { Objects.requireNonNull(name); Objects.requireNonNull(argument); this.name = name; @@ -47,7 +47,7 @@ public Class asClass() { } @Override - public PropertyDef argument() { + public PropertyMetamodel argument() { return argument; } @@ -67,16 +67,31 @@ public int hashCode() { class Avg extends AbstractFunction { - public Avg(PropertyDef argument) { + public Avg(PropertyMetamodel argument) { super("avg", argument); } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } } class Count extends AbstractFunction { private final LongEntityPropertyType propertyType = new LongEntityPropertyType(); - public Count(PropertyDef argument) { + public final boolean distinct; + + public Count(PropertyMetamodel argument) { + this(argument, false); + } + + public Count(PropertyMetamodel argument, boolean distinct) { super("count", argument); + this.distinct = distinct; } @Override @@ -88,29 +103,61 @@ public Class asClass() { public EntityPropertyType asType() { return propertyType; } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } } class Max extends AbstractFunction { - public Max(PropertyDef argument) { + public Max(PropertyMetamodel argument) { super("max", argument); } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } } class Min extends AbstractFunction { - public Min(PropertyDef argument) { + public Min(PropertyMetamodel argument) { super("min", argument); } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } } class Sum extends AbstractFunction { - public Sum(PropertyDef argument) { + public Sum(PropertyMetamodel argument) { super("sum", argument); } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } } - class Asterisk implements PropertyDef { + class Asterisk implements PropertyMetamodel { private final LongEntityPropertyType propertyType = new LongEntityPropertyType(); private Asterisk() {} @@ -129,6 +176,28 @@ public Class asClass() { public EntityPropertyType asType() { return propertyType; } + + @Override + public void accept(Visitor visitor) { + if (visitor instanceof AggregateFunction.Visitor) { + AggregateFunction.Visitor v = (AggregateFunction.Visitor) visitor; + v.visit(this); + } + } + } + + interface Visitor { + void visit(AggregateFunction.Avg avg); + + void visit(AggregateFunction.Count count); + + void visit(AggregateFunction.Max max); + + void visit(AggregateFunction.Min min); + + void visit(AggregateFunction.Sum sum); + + void visit(AggregateFunction.Asterisk asterisk); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/ArithmeticExpression.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/ArithmeticExpression.java new file mode 100644 index 000000000..f1e5ff783 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/ArithmeticExpression.java @@ -0,0 +1,159 @@ +package org.seasar.doma.jdbc.criteria.expression; + +import java.util.Objects; +import org.seasar.doma.jdbc.criteria.context.Operand; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityPropertyType; + +public interface ArithmeticExpression extends PropertyMetamodel { + + abstract class AbstractArithmeticExpression implements ArithmeticExpression { + private final PropertyMetamodel propertyMetamodel; + public final Operand left; + public final Operand right; + + protected AbstractArithmeticExpression( + PropertyMetamodel propertyMetamodel, Operand left, Operand right) { + this.propertyMetamodel = Objects.requireNonNull(propertyMetamodel); + this.left = Objects.requireNonNull(left); + this.right = Objects.requireNonNull(right); + } + + @Override + public Class asClass() { + return propertyMetamodel.asClass(); + } + + @Override + public EntityPropertyType asType() { + return propertyMetamodel.asType(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AbstractArithmeticExpression)) return false; + AbstractArithmeticExpression that = (AbstractArithmeticExpression) o; + return propertyMetamodel.equals(that.propertyMetamodel) + && left.equals(that.left) + && right.equals(that.right); + } + + @Override + public int hashCode() { + return Objects.hash(propertyMetamodel, left, right); + } + } + + class Add extends AbstractArithmeticExpression { + + public Add(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "+"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof ArithmeticExpression.Visitor) { + ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor; + v.visit(this); + } + } + } + + class Sub extends AbstractArithmeticExpression { + + public Sub(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "-"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof ArithmeticExpression.Visitor) { + ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor; + v.visit(this); + } + } + } + + class Mul extends AbstractArithmeticExpression { + + public Mul(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "*"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof ArithmeticExpression.Visitor) { + ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor; + v.visit(this); + } + } + } + + class Div extends AbstractArithmeticExpression { + + public Div(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "/"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof ArithmeticExpression.Visitor) { + ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor; + v.visit(this); + } + } + } + + class Mod extends AbstractArithmeticExpression { + + public Mod(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "%"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof ArithmeticExpression.Visitor) { + ArithmeticExpression.Visitor v = (ArithmeticExpression.Visitor) visitor; + v.visit(this); + } + } + } + + interface Visitor { + void visit(Add add); + + void visit(Sub sub); + + void visit(Mul mul); + + void visit(Div div); + + void visit(Mod div); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/Expressions.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/Expressions.java new file mode 100644 index 000000000..18c4dd431 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/Expressions.java @@ -0,0 +1,182 @@ +package org.seasar.doma.jdbc.criteria.expression; + +import java.util.Objects; +import org.seasar.doma.jdbc.criteria.context.Operand; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; + +public class Expressions { + + public static PropertyMetamodel literal(String value) { + Objects.requireNonNull(value); + return new LiteralExpression.StringLiteral(value); + } + + public static PropertyMetamodel literal(int value) { + Objects.requireNonNull(value); + return new LiteralExpression.IntLiteral(value); + } + + public static ArithmeticExpression.Add add( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new ArithmeticExpression.Add<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static ArithmeticExpression.Add add( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new ArithmeticExpression.Add<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Add add( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new ArithmeticExpression.Add<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Sub sub( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new ArithmeticExpression.Sub<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static ArithmeticExpression.Sub sub( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new ArithmeticExpression.Sub<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Sub sub( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new ArithmeticExpression.Sub<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Mul mul( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new ArithmeticExpression.Mul<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static ArithmeticExpression.Mul mul( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new ArithmeticExpression.Mul<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Mul mul( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new ArithmeticExpression.Mul<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Div div( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new ArithmeticExpression.Div<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static ArithmeticExpression.Div div( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new ArithmeticExpression.Div<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Div div( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new ArithmeticExpression.Div<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Mod mod( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new ArithmeticExpression.Mod<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static ArithmeticExpression.Mod mod( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new ArithmeticExpression.Mod<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static ArithmeticExpression.Mod mod( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new ArithmeticExpression.Mod<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static StringExpression.Concat concat( + PropertyMetamodel left, PROPERTY right) { + Objects.requireNonNull(left); + return new StringExpression.Concat<>( + left, new Operand.Prop(left), new Operand.Param(left, right)); + } + + public static StringExpression.Concat concat( + PROPERTY left, PropertyMetamodel right) { + Objects.requireNonNull(right); + return new StringExpression.Concat<>( + right, new Operand.Param(right, left), new Operand.Prop(right)); + } + + public static StringExpression.Concat concat( + PropertyMetamodel left, PropertyMetamodel right) { + Objects.requireNonNull(left); + Objects.requireNonNull(right); + return new StringExpression.Concat<>(left, new Operand.Prop(left), new Operand.Prop(right)); + } + + public static AggregateFunction.Avg avg( + PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Avg<>(propertyMetamodel); + } + + public static AggregateFunction.Count count() { + return new AggregateFunction.Count(AggregateFunction.Asterisk); + } + + public static AggregateFunction.Count count(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Count(propertyMetamodel); + } + + public static AggregateFunction.Count countDistinct(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Count(propertyMetamodel, true); + } + + public static AggregateFunction.Max max( + PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Max<>(propertyMetamodel); + } + + public static AggregateFunction.Min min( + PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Min<>(propertyMetamodel); + } + + public static AggregateFunction.Sum sum( + PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + return new AggregateFunction.Sum<>(propertyMetamodel); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/LiteralExpression.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/LiteralExpression.java new file mode 100644 index 000000000..9ec5d84d7 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/LiteralExpression.java @@ -0,0 +1,104 @@ +package org.seasar.doma.jdbc.criteria.expression; + +import java.util.Objects; +import org.seasar.doma.DomaIllegalArgumentException; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityPropertyType; + +public interface LiteralExpression extends PropertyMetamodel { + + String toString(); + + abstract class AbstractLiteralExpression implements LiteralExpression { + protected final PROPERTY value; + + protected AbstractLiteralExpression(PROPERTY value) { + this.value = Objects.requireNonNull(value); + } + + @Override + public Class asClass() { + return value.getClass(); + } + + @Override + public EntityPropertyType asType() { + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AbstractLiteralExpression)) return false; + AbstractLiteralExpression that = (AbstractLiteralExpression) o; + return value.equals(that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + } + + class StringLiteral extends AbstractLiteralExpression { + + private static final char QUOTATION = '\''; + + public StringLiteral(String value) { + super(Objects.requireNonNull(value)); + if (value.indexOf(QUOTATION) > -1) { + throw new DomaIllegalArgumentException( + "value", "The value must not contain the single quotation."); + } + } + + @Override + public String toString() { + return QUOTATION + value + QUOTATION; + } + + @Override + public String getName() { + return value; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof LiteralExpression.Visitor) { + LiteralExpression.Visitor v = (LiteralExpression.Visitor) visitor; + v.visit(this); + } + } + } + + class IntLiteral extends AbstractLiteralExpression { + + public IntLiteral(int value) { + super(value); + } + + @Override + public String toString() { + return Integer.toString(value); + } + + @Override + public String getName() { + return Integer.toString(value); + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof LiteralExpression.Visitor) { + LiteralExpression.Visitor v = (LiteralExpression.Visitor) visitor; + v.visit(this); + } + } + } + + interface Visitor { + void visit(StringLiteral stringLiteral); + + void visit(IntLiteral intLiteral); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/StringExpression.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/StringExpression.java new file mode 100644 index 000000000..6b57ae805 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/expression/StringExpression.java @@ -0,0 +1,71 @@ +package org.seasar.doma.jdbc.criteria.expression; + +import java.util.Objects; +import org.seasar.doma.jdbc.criteria.context.Operand; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityPropertyType; + +public interface StringExpression extends PropertyMetamodel { + + abstract class AbstractStringExpression implements StringExpression { + private final PropertyMetamodel propertyMetamodel; + public final Operand left; + public final Operand right; + + protected AbstractStringExpression( + PropertyMetamodel propertyMetamodel, Operand left, Operand right) { + this.propertyMetamodel = Objects.requireNonNull(propertyMetamodel); + this.left = Objects.requireNonNull(left); + this.right = Objects.requireNonNull(right); + } + + @Override + public Class asClass() { + return propertyMetamodel.asClass(); + } + + @Override + public EntityPropertyType asType() { + return propertyMetamodel.asType(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof StringExpression.AbstractStringExpression)) return false; + AbstractStringExpression that = (AbstractStringExpression) o; + return propertyMetamodel.equals(that.propertyMetamodel) + && left.equals(that.left) + && right.equals(that.right); + } + + @Override + public int hashCode() { + return Objects.hash(propertyMetamodel, left, right); + } + } + + class Concat extends AbstractStringExpression { + + public Concat(PropertyMetamodel propertyDef, Operand left, Operand right) { + super(propertyDef, left, right); + } + + @Override + public String getName() { + return "concat"; + } + + @Override + public void accept(PropertyMetamodel.Visitor visitor) { + if (visitor instanceof StringExpression.Visitor) { + StringExpression.Visitor v = (StringExpression.Visitor) visitor; + v.visit(this); + } + } + } + + interface Visitor { + void visit(StringExpression.Concat concat); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/DefaultPropertyDef.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/DefaultPropertyMetamodel.java similarity index 65% rename from doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/DefaultPropertyDef.java rename to doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/DefaultPropertyMetamodel.java index 8ba4bdb90..70bb874ee 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/def/DefaultPropertyDef.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/DefaultPropertyMetamodel.java @@ -1,16 +1,16 @@ -package org.seasar.doma.jdbc.criteria.def; +package org.seasar.doma.jdbc.criteria.metamodel; import java.util.Objects; import org.seasar.doma.jdbc.entity.EntityPropertyType; import org.seasar.doma.jdbc.entity.EntityType; -public class DefaultPropertyDef implements PropertyDef { +public class DefaultPropertyMetamodel implements PropertyMetamodel { private final Class clazz; private final EntityType entityType; private final String name; - public DefaultPropertyDef(Class clazz, EntityType entityType, String name) { + public DefaultPropertyMetamodel(Class clazz, EntityType entityType, String name) { this.clazz = Objects.requireNonNull(clazz); this.entityType = Objects.requireNonNull(entityType); this.name = Objects.requireNonNull(name); @@ -30,4 +30,9 @@ public Class asClass() { public String getName() { return name; } + + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityMetamodel.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityMetamodel.java new file mode 100644 index 000000000..bb5a0d4c6 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityMetamodel.java @@ -0,0 +1,11 @@ +package org.seasar.doma.jdbc.criteria.metamodel; + +import java.util.List; +import org.seasar.doma.jdbc.entity.EntityType; + +public interface EntityMetamodel { + + EntityType asType(); + + List> allPropertyMetamodels(); +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityTypeProxy.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityTypeProxy.java new file mode 100644 index 000000000..18070cd71 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/EntityTypeProxy.java @@ -0,0 +1,185 @@ +package org.seasar.doma.jdbc.criteria.metamodel; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Function; +import org.seasar.doma.DomaIllegalArgumentException; +import org.seasar.doma.jdbc.entity.EntityPropertyType; +import org.seasar.doma.jdbc.entity.EntityType; +import org.seasar.doma.jdbc.entity.GeneratedIdPropertyType; +import org.seasar.doma.jdbc.entity.NamingType; +import org.seasar.doma.jdbc.entity.PostDeleteContext; +import org.seasar.doma.jdbc.entity.PostInsertContext; +import org.seasar.doma.jdbc.entity.PostUpdateContext; +import org.seasar.doma.jdbc.entity.PreDeleteContext; +import org.seasar.doma.jdbc.entity.PreInsertContext; +import org.seasar.doma.jdbc.entity.PreUpdateContext; +import org.seasar.doma.jdbc.entity.Property; +import org.seasar.doma.jdbc.entity.TenantIdPropertyType; +import org.seasar.doma.jdbc.entity.VersionPropertyType; + +public class EntityTypeProxy implements EntityType { + + private final EntityType entityType; + private final String qualifiedTableName; + + public EntityTypeProxy(EntityType entityType, String qualifiedTableName) { + this.entityType = Objects.requireNonNull(entityType); + this.qualifiedTableName = Objects.requireNonNull(qualifiedTableName); + if (qualifiedTableName.contains("'")) { + throw new DomaIllegalArgumentException( + "qualifiedTableName", "The qualifiedTableName must not contain the single quotation(')."); + } + if (qualifiedTableName.contains(";")) { + throw new DomaIllegalArgumentException( + "qualifiedTableName", "The qualifiedTableName must not contain the semicolon(;)."); + } + if (qualifiedTableName.contains("--")) { + throw new DomaIllegalArgumentException( + "qualifiedTableName", "The qualifiedTableName must not contain the two hyphens(--)."); + } + if (qualifiedTableName.contains("/")) { + throw new DomaIllegalArgumentException( + "qualifiedTableName", "The qualifiedTableName must not contain the slash(/)."); + } + } + + @Override + public boolean isImmutable() { + return entityType.isImmutable(); + } + + @Override + public String getName() { + return entityType.getName(); + } + + @Override + public String getCatalogName() { + return entityType.getCatalogName(); + } + + @Override + public String getSchemaName() { + return entityType.getSchemaName(); + } + + @Override + public String getTableName() { + return entityType.getTableName(); + } + + @Override + public String getTableName(BiFunction namingFunction) { + return entityType.getTableName(namingFunction); + } + + @Override + public String getQualifiedTableName() { + return entityType.getQualifiedTableName(); + } + + @Override + public String getQualifiedTableName(Function quoteFunction) { + return entityType.getQualifiedTableName(quoteFunction); + } + + @Override + public String getQualifiedTableName( + BiFunction namingFunction, + Function quoteFunction) { + return qualifiedTableName; + } + + @Override + public boolean isQuoteRequired() { + return entityType.isQuoteRequired(); + } + + @Override + public NamingType getNamingType() { + return entityType.getNamingType(); + } + + @Override + public GeneratedIdPropertyType getGeneratedIdPropertyType() { + return entityType.getGeneratedIdPropertyType(); + } + + @Override + public VersionPropertyType getVersionPropertyType() { + return entityType.getVersionPropertyType(); + } + + @Override + public TenantIdPropertyType getTenantIdPropertyType() { + return entityType.getTenantIdPropertyType(); + } + + @Override + public List> getIdPropertyTypes() { + return entityType.getIdPropertyTypes(); + } + + @Override + public EntityPropertyType getEntityPropertyType(String __name) { + return entityType.getEntityPropertyType(__name); + } + + @Override + public List> getEntityPropertyTypes() { + return entityType.getEntityPropertyTypes(); + } + + @Override + public ENTITY newEntity(Map> __args) { + return entityType.newEntity(__args); + } + + @Override + public Class getEntityClass() { + return entityType.getEntityClass(); + } + + @Override + public void saveCurrentStates(ENTITY entity) { + entityType.saveCurrentStates(entity); + } + + @Override + public ENTITY getOriginalStates(ENTITY entity) { + return entityType.getOriginalStates(entity); + } + + @Override + public void preInsert(ENTITY entity, PreInsertContext context) { + entityType.preInsert(entity, context); + } + + @Override + public void preUpdate(ENTITY entity, PreUpdateContext context) { + entityType.preUpdate(entity, context); + } + + @Override + public void preDelete(ENTITY entity, PreDeleteContext context) { + entityType.preDelete(entity, context); + } + + @Override + public void postInsert(ENTITY entity, PostInsertContext context) { + entityType.postInsert(entity, context); + } + + @Override + public void postUpdate(ENTITY entity, PostUpdateContext context) { + entityType.postUpdate(entity, context); + } + + @Override + public void postDelete(ENTITY entity, PostDeleteContext context) { + entityType.postDelete(entity, context); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/PropertyMetamodel.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/PropertyMetamodel.java new file mode 100644 index 000000000..2ca1302a8 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/metamodel/PropertyMetamodel.java @@ -0,0 +1,18 @@ +package org.seasar.doma.jdbc.criteria.metamodel; + +import org.seasar.doma.jdbc.entity.EntityPropertyType; + +public interface PropertyMetamodel { + + Class asClass(); + + EntityPropertyType asType(); + + String getName(); + + void accept(Visitor visitor); + + interface Visitor { + void visit(PropertyMetamodel propertyMetamodel); + } +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/AssociationOption.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/AssociationOption.java index a8bf529d5..201b9a79e 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/AssociationOption.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/AssociationOption.java @@ -1,6 +1,16 @@ package org.seasar.doma.jdbc.criteria.option; -public enum AssociationOption { - MANDATORY, - OPTIONAL +public interface AssociationOption { + enum Kind implements AssociationOption { + MANDATORY, + OPTIONAL + } + + static AssociationOption mandatory() { + return Kind.MANDATORY; + } + + static AssociationOption optional() { + return Kind.OPTIONAL; + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/DistinctOption.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/DistinctOption.java index df12edb93..50f3adc72 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/DistinctOption.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/DistinctOption.java @@ -1,6 +1,16 @@ package org.seasar.doma.jdbc.criteria.option; -public enum DistinctOption { - ENABLED, - DISABLED +public interface DistinctOption { + enum Kind implements DistinctOption { + NONE, + BASIC + } + + static DistinctOption none() { + return Kind.NONE; + } + + static DistinctOption basic() { + return Kind.BASIC; + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/ForUpdateOption.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/ForUpdateOption.java index 7c0c1c3a0..9521b95e0 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/ForUpdateOption.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/ForUpdateOption.java @@ -1,7 +1,100 @@ package org.seasar.doma.jdbc.criteria.option; -public enum ForUpdateOption { - WAIT, - NOWAIT, - DISABLED +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; + +public interface ForUpdateOption { + + static ForUpdateOption none() { + return None.INSTANCE; + } + + static ForUpdateOption basic(PropertyMetamodel... propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + return new Basic(Arrays.asList(propertyMetamodels)); + } + + static ForUpdateOption noWait(PropertyMetamodel... propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + return new NoWait(Arrays.asList(propertyMetamodels)); + } + + static ForUpdateOption wait(int seconds, PropertyMetamodel... propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + return new Wait(seconds, Arrays.asList(propertyMetamodels)); + } + + void accept(Visitor visitor); + + class None implements ForUpdateOption { + private static final None INSTANCE = new None(); + + private None() {} + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Basic implements ForUpdateOption { + public final List> propertyMetamodels; + + public Basic(List> propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + this.propertyMetamodels = Collections.unmodifiableList(propertyMetamodels); + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class NoWait implements ForUpdateOption { + public final List> propertyMetamodels; + + public NoWait(List> propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + this.propertyMetamodels = Collections.unmodifiableList(propertyMetamodels); + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Wait implements ForUpdateOption { + public final int second; + public final List> propertyMetamodels; + + public Wait(int second, List> propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + this.second = second; + this.propertyMetamodels = Collections.unmodifiableList(propertyMetamodels); + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + interface Visitor { + default void visit(None none) {} + + void visit(Basic basic); + + void visit(NoWait wait); + + void visit(Wait noWait); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/LikeOption.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/LikeOption.java index 7decae52b..f4590edd6 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/LikeOption.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/option/LikeOption.java @@ -1,9 +1,126 @@ package org.seasar.doma.jdbc.criteria.option; -public enum LikeOption { - NONE, - ESCAPE, - PREFIX, - INFIX, - SUFFIX +import java.util.Objects; + +public interface LikeOption { + + char DEFAULT_ESCAPE_CHAR = '$'; + + static LikeOption none() { + return None.INSTANCE; + } + + static LikeOption escape() { + return new Escape(DEFAULT_ESCAPE_CHAR); + } + + static LikeOption escape(char escapeChar) { + return new Escape(escapeChar); + } + + static LikeOption prefix() { + return new Prefix(DEFAULT_ESCAPE_CHAR); + } + + static LikeOption prefix(char escapeChar) { + return new Prefix(escapeChar); + } + + static LikeOption infix() { + return new Infix(DEFAULT_ESCAPE_CHAR); + } + + static LikeOption infix(char escapeChar) { + return new Infix(escapeChar); + } + + static LikeOption suffix() { + return new Suffix(DEFAULT_ESCAPE_CHAR); + } + + static LikeOption suffix(char escapeChar) { + return new Suffix(escapeChar); + } + + void accept(Visitor visitor); + + class None implements LikeOption { + private static final None INSTANCE = new None(); + + private None() {} + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Escape implements LikeOption { + public final char escapeChar; + + public Escape(char escapeChar) { + this.escapeChar = escapeChar; + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Prefix implements LikeOption { + public final char escapeChar; + + public Prefix(char escapeChar) { + this.escapeChar = escapeChar; + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Infix implements LikeOption { + public final char escapeChar; + + public Infix(char escapeChar) { + this.escapeChar = escapeChar; + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + class Suffix implements LikeOption { + public final char escapeChar; + + public Suffix(char escapeChar) { + this.escapeChar = escapeChar; + } + + @Override + public void accept(Visitor visitor) { + Objects.requireNonNull(visitor); + visitor.visit(this); + } + } + + interface Visitor { + void visit(None none); + + void visit(Escape escape); + + void visit(Prefix prefix); + + void visit(Infix infix); + + void visit(Suffix suffix); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/AliasManager.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/AliasManager.java index f94718657..a46792efe 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/AliasManager.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/AliasManager.java @@ -3,15 +3,17 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Function; import org.seasar.doma.jdbc.criteria.context.Context; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public class AliasManager { private final AliasManager parent; - private final Map, String> entityAliasMap = new HashMap<>(); - private final Map, String> propertyAliasMap = new HashMap<>(); - private int index; + private final Map, String> entityAliasMap = new HashMap<>(); + private final Map, String> propertyAliasMap = new HashMap<>(); + private final int index; public AliasManager(Context context) { this(context, null); @@ -20,34 +22,36 @@ public AliasManager(Context context) { public AliasManager(Context context, AliasManager parent) { Objects.requireNonNull(context); this.parent = parent; - index = parent != null ? parent.index : 0; - for (EntityDef entityDef : context.getEntityDefs()) { + int index = parent != null ? parent.index : 0; + for (EntityMetamodel entityMetamodel : context.getEntityMetamodels()) { String alias = "t" + index + "_"; index++; - entityAliasMap.put(entityDef, alias); - for (PropertyDef propertyDef : entityDef.allPropertyDefs()) { - propertyAliasMap.put(propertyDef, alias); + entityAliasMap.put(entityMetamodel, alias); + for (PropertyMetamodel propertyMetamodel : entityMetamodel.allPropertyMetamodels()) { + propertyAliasMap.put(propertyMetamodel, alias); } } + this.index = index; } - public String getAlias(EntityDef entityDef) { - if (parent != null) { - String alias = parent.getAlias(entityDef); - if (alias != null) { - return alias; - } - } - return entityAliasMap.get(entityDef); + public String getAlias(EntityMetamodel entityMetamodel) { + return getAlias(entityMetamodel, AliasManager::getAlias, entityAliasMap::get); + } + + public String getAlias(PropertyMetamodel propertyMetamodel) { + return getAlias(propertyMetamodel, AliasManager::getAlias, propertyAliasMap::get); } - public String getAlias(PropertyDef propertyDef) { + private String getAlias( + KEY key, + BiFunction getParentAlias, + Function getCurrentAlias) { if (parent != null) { - String alias = parent.getAlias(propertyDef); + String alias = getParentAlias.apply(parent, key); if (alias != null) { return alias; } } - return propertyAliasMap.get(propertyDef); + return getCurrentAlias.apply(key); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java index 3c63180df..31e80e71f 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/BuilderSupport.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Objects; import java.util.function.BiFunction; -import java.util.function.Consumer; import java.util.function.Function; import org.seasar.doma.DomaException; import org.seasar.doma.expr.ExpressionFunctions; @@ -14,9 +13,12 @@ import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.Operand; import org.seasar.doma.jdbc.criteria.context.SelectContext; -import org.seasar.doma.jdbc.criteria.declaration.AggregateFunction; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.expression.AggregateFunction; +import org.seasar.doma.jdbc.criteria.expression.ArithmeticExpression; +import org.seasar.doma.jdbc.criteria.expression.LiteralExpression; +import org.seasar.doma.jdbc.criteria.expression.StringExpression; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.LikeOption; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; import org.seasar.doma.jdbc.entity.EntityPropertyType; @@ -29,6 +31,8 @@ public class BuilderSupport { private final Function commenter; private final PreparedSqlBuilder buf; private final AliasManager aliasManager; + private final Operand.Visitor operandVisitor; + private final PropertyMetamodelVisitor propertyMetamodelVisitor; public BuilderSupport( Config config, @@ -38,58 +42,34 @@ public BuilderSupport( this.config = Objects.requireNonNull(config); this.commenter = Objects.requireNonNull(commenter); this.buf = Objects.requireNonNull(buf); - this.aliasManager = aliasManager; + this.aliasManager = Objects.requireNonNull(aliasManager); + this.operandVisitor = new OperandVisitor(); + this.propertyMetamodelVisitor = new PropertyMetamodelVisitor(); } - public void table(EntityDef entityDef) { - EntityType entityType = entityDef.asType(); + public void table(EntityMetamodel entityMetamodel) { + EntityType entityType = entityMetamodel.asType(); buf.appendSql( entityType.getQualifiedTableName( config.getNaming()::apply, config.getDialect()::applyQuote)); - if (aliasManager != null) { - buf.appendSql(" "); - String alias = aliasManager.getAlias(entityDef); - if (alias == null) { - throw new DomaException(Message.DOMA6003, entityType.getName()); - } - buf.appendSql(alias); + buf.appendSql(" "); + String alias = aliasManager.getAlias(entityMetamodel); + if (alias == null) { + throw new DomaException(Message.DOMA6003, entityType.getName()); } + buf.appendSql(alias); + } + + public void operand(Operand operand) { + operand.accept(operandVisitor); } public void column(Operand.Prop prop) { column(prop.value); } - public void column(PropertyDef propertyDef) { - Consumer> appendColumn = - (p) -> { - if (p == AggregateFunction.Asterisk) { - buf.appendSql(AggregateFunction.Asterisk.getName()); - } else { - if (aliasManager != null) { - String alias = aliasManager.getAlias(p); - if (alias == null) { - throw new DomaException(Message.DOMA6004, p.getName()); - } - buf.appendSql(alias); - buf.appendSql("."); - } - EntityPropertyType propertyType = p.asType(); - buf.appendSql( - propertyType.getColumnName( - config.getNaming()::apply, config.getDialect()::applyQuote)); - } - }; - - if (propertyDef instanceof AggregateFunction) { - AggregateFunction function = (AggregateFunction) propertyDef; - buf.appendSql(function.getName()); - buf.appendSql("("); - appendColumn.accept(function.argument()); - buf.appendSql(")"); - } else { - appendColumn.accept(propertyDef); - } + public void column(PropertyMetamodel propertyMetamodel) { + propertyMetamodel.accept(propertyMetamodelVisitor); } public void param(Operand.Param param) { @@ -102,256 +82,24 @@ private void param(InParameter parameter) { } public void visitCriterion(int index, Criterion criterion) { - Criterion.Visitor visitor = new CriterionVisitor(index); - criterion.accept(visitor); - } - - private void equality(Operand.Prop left, Operand right, String op) { - if (isParamNull(right)) { - if (op.equals("=")) { - isNull(left); - } else if (op.equals("<>")) { - isNotNull(left); - } else { - throw new IllegalStateException("The operator is illegal. " + op); - } - } else { - comparison(left, right, op); - } - } - - private boolean isParamNull(Operand operand) { - return operand.accept( - new Operand.Visitor() { - - @Override - public Boolean visit(Operand.Param operand) { - InParameter parameter = operand.createInParameter(config); - return parameter.getWrapper().get() == null; - } - - @Override - public Boolean visit(Operand.Prop operand) { - return false; - } - }); - } - - private void comparison(Operand.Prop left, Operand right, String op) { - column(left); - buf.appendSql(" " + op + " "); - right.accept( - new Operand.Visitor() { - @Override - public Void visit(Operand.Param operand) { - param(operand); - return null; - } - - @Override - public Void visit(Operand.Prop operand) { - column(operand); - return null; - } - }); - } - - private void isNull(Operand.Prop prop) { - column(prop); - buf.appendSql(" is null"); - } - - private void isNotNull(Operand.Prop prop) { - column(prop); - buf.appendSql(" is not null"); - } - - private void like(Operand.Prop left, Operand right, LikeOption option, boolean not) { - column(left); - if (not) { - buf.appendSql(" not"); - } - buf.appendSql(" like "); - right.accept( - new Operand.Visitor() { - @Override - public Void visit(Operand.Param param) { - InParameter parameter = param.createInParameter(config); - Object value = parameter.getWrapper().get(); - if (value == null || option == LikeOption.NONE) { - param(parameter); - } else { - char escapeChar = '$'; - BiFunction transformer = getTransformer(option); - String newValue = transformer.apply(value.toString(), escapeChar); - param(new BasicInParameter<>(() -> new StringWrapper(newValue))); - buf.appendSql(" escape '" + escapeChar + "'"); - } - return null; - } - - private BiFunction getTransformer(LikeOption option) { - ExpressionFunctions functions = config.getDialect().getExpressionFunctions(); - switch (option) { - case ESCAPE: - return functions::escape; - case PREFIX: - return functions::prefix; - case INFIX: - return functions::infix; - case SUFFIX: - return functions::suffix; - default: - throw new AssertionError("unreachable. " + option); - } - } - - @Override - public Void visit(Operand.Prop prop) { - column(prop); - return null; - } - }); - } - - private void between(Operand.Prop prop, Operand.Param begin, Operand.Param end) { - column(prop); - buf.appendSql(" between "); - param(begin); - buf.appendSql(" and "); - param(end); - } - - private void inSingle(Operand.Prop left, List right, boolean not) { - column(left); - if (not) { - buf.appendSql(" not"); - } - buf.appendSql(" in ("); - if (right.isEmpty()) { - buf.appendSql("null"); - } else { - for (Operand.Param p : right) { - param(p); - buf.appendSql(", "); - } - buf.cutBackSql(2); - } - buf.appendSql(")"); - } - - public void inSingleSubQuery(Operand.Prop left, SelectContext right, boolean not) { - column(left); - if (not) { - buf.appendSql(" not"); - } - buf.appendSql(" in ("); - AliasManager child = new AliasManager(right, aliasManager); - SelectBuilder builder = new SelectBuilder(config, right, commenter, buf, child); - builder.interpret(); - buf.appendSql(")"); - } - - private void inPair( - Tuple2 left, - List> right, - boolean not) { - buf.appendSql("("); - column(left.getItem1()); - buf.appendSql(", "); - column(left.getItem2()); - buf.appendSql(")"); - if (not) { - buf.appendSql(" not"); - } - buf.appendSql(" in ("); - if (right.isEmpty()) { - buf.appendSql("null, null"); - } else { - right.forEach( - pair -> { - buf.appendSql("("); - param(pair.getItem1()); - buf.appendSql(", "); - param(pair.getItem2()); - buf.appendSql("), "); - }); - buf.cutBackSql(2); - } - buf.appendSql(")"); - } - - private void inPairSubQuery( - Tuple2 left, SelectContext right, boolean not) { - buf.appendSql("("); - column(left.getItem1()); - buf.appendSql(", "); - column(left.getItem2()); - buf.appendSql(")"); - if (not) { - buf.appendSql(" not"); - } - buf.appendSql(" in ("); - AliasManager child = new AliasManager(right, aliasManager); - SelectBuilder builder = new SelectBuilder(config, right, commenter, buf, child); - builder.interpret(); - buf.appendSql(")"); - } - - public void exists(SelectContext context, boolean not) { - if (not) { - buf.appendSql("not "); - } - buf.appendSql("exists ("); - AliasManager child = new AliasManager(context, aliasManager); - SelectBuilder builder = new SelectBuilder(config, context, commenter, buf, child); - builder.interpret(); - buf.appendSql(")"); - } - - private void and(List criterionList, int index) { - binaryLogicalOperator(criterionList, index, "and"); + criterion.accept(new CriterionVisitor(index)); } - private void or(List criterionList, int index) { - binaryLogicalOperator(criterionList, index, "or"); - } - - private void binaryLogicalOperator(List criterionList, int index, String operator) { - if (!criterionList.isEmpty()) { - if (index > 0) { - buf.cutBackSql(5); - } - if (index != 0) { - buf.appendSql(" " + operator + " "); - } - buf.appendSql("("); - int i = 0; - for (Criterion c : criterionList) { - visitCriterion(i++, c); - buf.appendSql(" and "); - } - buf.cutBackSql(5); - buf.appendSql(")"); + private class OperandVisitor implements Operand.Visitor { + @Override + public Void visit(Operand.Param param) { + param(param); + return null; } - } - private void not(List criterionList) { - if (!criterionList.isEmpty()) { - buf.appendSql("not "); - buf.appendSql("("); - int index = 0; - for (Criterion c : criterionList) { - visitCriterion(index++, c); - buf.appendSql(" and "); - } - buf.cutBackSql(5); - buf.appendSql(")"); + @Override + public Void visit(Operand.Prop prop) { + column(prop); + return null; } } private class CriterionVisitor implements Criterion.Visitor { - private final int index; public CriterionVisitor(int index) { @@ -477,5 +225,357 @@ public void visit(Criterion.Or criterion) { public void visit(Criterion.Not criterion) { not(criterion.criterionList); } + + private void equality(Operand.Prop left, Operand right, String op) { + if (isParamNull(right)) { + if (op.equals("=")) { + isNull(left); + } else if (op.equals("<>")) { + isNotNull(left); + } else { + throw new IllegalStateException("The operator is illegal. " + op); + } + } else { + comparison(left, right, op); + } + } + + private boolean isParamNull(Operand operand) { + return operand.accept( + new Operand.Visitor() { + + @Override + public Boolean visit(Operand.Param operand) { + InParameter parameter = operand.createInParameter(config); + return parameter.getWrapper().get() == null; + } + + @Override + public Boolean visit(Operand.Prop operand) { + return false; + } + }); + } + + private void comparison(Operand.Prop left, Operand right, String op) { + column(left); + buf.appendSql(" " + op + " "); + right.accept(operandVisitor); + } + + private void isNull(Operand.Prop prop) { + column(prop); + buf.appendSql(" is null"); + } + + private void isNotNull(Operand.Prop prop) { + column(prop); + buf.appendSql(" is not null"); + } + + private void like(Operand.Prop left, Operand right, LikeOption option, boolean not) { + column(left); + if (not) { + buf.appendSql(" not"); + } + buf.appendSql(" like "); + right.accept( + new OperandVisitor() { + @Override + public Void visit(Operand.Param param) { + InParameter parameter = param.createInParameter(config); + Object value = parameter.getWrapper().get(); + if (value == null) { + return super.visit(param); + } + ExpressionFunctions functions = config.getDialect().getExpressionFunctions(); + option.accept( + new LikeOption.Visitor() { + @Override + public void visit(LikeOption.None none) { + param(param); + } + + @Override + public void visit(LikeOption.Escape escape) { + appendNewValue(functions::escape, escape.escapeChar); + } + + @Override + public void visit(LikeOption.Prefix prefix) { + appendNewValue(functions::prefix, prefix.escapeChar); + } + + @Override + public void visit(LikeOption.Infix infix) { + appendNewValue(functions::infix, infix.escapeChar); + } + + @Override + public void visit(LikeOption.Suffix suffix) { + appendNewValue(functions::suffix, suffix.escapeChar); + } + + private void appendNewValue( + BiFunction function, char escapeChar) { + String newValue = function.apply(value.toString(), escapeChar); + param(new BasicInParameter<>(() -> new StringWrapper(newValue))); + buf.appendSql(" escape '" + escapeChar + "'"); + } + }); + return null; + } + }); + } + + private void between(Operand.Prop prop, Operand.Param begin, Operand.Param end) { + column(prop); + buf.appendSql(" between "); + param(begin); + buf.appendSql(" and "); + param(end); + } + + private void inSingle(Operand.Prop left, List right, boolean not) { + column(left); + if (not) { + buf.appendSql(" not"); + } + buf.appendSql(" in ("); + if (right.isEmpty()) { + buf.appendSql("null"); + } else { + for (Operand.Param p : right) { + param(p); + buf.appendSql(", "); + } + buf.cutBackSql(2); + } + buf.appendSql(")"); + } + + public void inSingleSubQuery(Operand.Prop left, SelectContext right, boolean not) { + column(left); + if (not) { + buf.appendSql(" not"); + } + buf.appendSql(" in ("); + AliasManager child = new AliasManager(right, aliasManager); + SelectBuilder builder = new SelectBuilder(config, right, commenter, buf, child); + builder.interpret(); + buf.appendSql(")"); + } + + private void inPair( + Tuple2 left, + List> right, + boolean not) { + buf.appendSql("("); + column(left.getItem1()); + buf.appendSql(", "); + column(left.getItem2()); + buf.appendSql(")"); + if (not) { + buf.appendSql(" not"); + } + buf.appendSql(" in ("); + if (right.isEmpty()) { + buf.appendSql("null, null"); + } else { + right.forEach( + pair -> { + buf.appendSql("("); + param(pair.getItem1()); + buf.appendSql(", "); + param(pair.getItem2()); + buf.appendSql("), "); + }); + buf.cutBackSql(2); + } + buf.appendSql(")"); + } + + private void inPairSubQuery( + Tuple2 left, SelectContext right, boolean not) { + buf.appendSql("("); + column(left.getItem1()); + buf.appendSql(", "); + column(left.getItem2()); + buf.appendSql(")"); + if (not) { + buf.appendSql(" not"); + } + buf.appendSql(" in ("); + AliasManager child = new AliasManager(right, aliasManager); + SelectBuilder builder = new SelectBuilder(config, right, commenter, buf, child); + builder.interpret(); + buf.appendSql(")"); + } + + public void exists(SelectContext context, boolean not) { + if (not) { + buf.appendSql("not "); + } + buf.appendSql("exists ("); + AliasManager child = new AliasManager(context, aliasManager); + SelectBuilder builder = new SelectBuilder(config, context, commenter, buf, child); + builder.interpret(); + buf.appendSql(")"); + } + + private void and(List criterionList, int index) { + binaryLogicalOperator(criterionList, index, "and"); + } + + private void or(List criterionList, int index) { + binaryLogicalOperator(criterionList, index, "or"); + } + + private void binaryLogicalOperator(List criterionList, int index, String operator) { + if (!criterionList.isEmpty()) { + if (index > 0) { + buf.cutBackSql(5); + } + if (index != 0) { + buf.appendSql(" " + operator + " "); + } + buf.appendSql("("); + int i = 0; + for (Criterion c : criterionList) { + visitCriterion(i++, c); + buf.appendSql(" and "); + } + buf.cutBackSql(5); + buf.appendSql(")"); + } + } + + private void not(List criterionList) { + if (!criterionList.isEmpty()) { + buf.appendSql("not "); + buf.appendSql("("); + int index = 0; + for (Criterion c : criterionList) { + visitCriterion(index++, c); + buf.appendSql(" and "); + } + buf.cutBackSql(5); + buf.appendSql(")"); + } + } + } + + class PropertyMetamodelVisitor + implements PropertyMetamodel.Visitor, + ArithmeticExpression.Visitor, + StringExpression.Visitor, + LiteralExpression.Visitor, + AggregateFunction.Visitor { + + @Override + public void visit(PropertyMetamodel propertyMetamodel) { + String alias = aliasManager.getAlias(propertyMetamodel); + if (alias == null) { + throw new DomaException(Message.DOMA6004, propertyMetamodel.getName()); + } + buf.appendSql(alias); + buf.appendSql("."); + EntityPropertyType propertyType = propertyMetamodel.asType(); + buf.appendSql( + propertyType.getColumnName(config.getNaming()::apply, config.getDialect()::applyQuote)); + } + + @Override + public void visit(ArithmeticExpression.Add add) { + binaryOperator(add.getName(), add.left, add.right); + } + + @Override + public void visit(ArithmeticExpression.Sub sub) { + binaryOperator(sub.getName(), sub.left, sub.right); + } + + @Override + public void visit(ArithmeticExpression.Mul mul) { + binaryOperator(mul.getName(), mul.left, mul.right); + } + + @Override + public void visit(ArithmeticExpression.Div div) { + binaryOperator(div.getName(), div.left, div.right); + } + + @Override + public void visit(ArithmeticExpression.Mod mod) { + binaryOperator(mod.getName(), mod.left, mod.right); + } + + @Override + public void visit(StringExpression.Concat concat) { + CriteriaBuilder criteriaBuilder = config.getDialect().getCriteriaBuilder(); + criteriaBuilder.concat( + buf, () -> concat.left.accept(operandVisitor), () -> concat.right.accept(operandVisitor)); + } + + @Override + public void visit(LiteralExpression.StringLiteral stringLiteral) { + buf.appendSql(stringLiteral.toString()); + } + + @Override + public void visit(LiteralExpression.IntLiteral intLiteral) { + buf.appendSql(intLiteral.toString()); + } + + @Override + public void visit(AggregateFunction.Avg avg) { + aggregateFunction(avg.getName(), avg.argument()); + } + + @Override + public void visit(AggregateFunction.Count count) { + buf.appendSql(count.getName()); + buf.appendSql("("); + if (count.distinct) { + buf.appendSql("distinct "); + } + count.argument().accept(this); + buf.appendSql(")"); + } + + @Override + public void visit(AggregateFunction.Max max) { + aggregateFunction(max.getName(), max.argument()); + } + + @Override + public void visit(AggregateFunction.Min min) { + aggregateFunction(min.getName(), min.argument()); + } + + @Override + public void visit(AggregateFunction.Sum sum) { + aggregateFunction(sum.getName(), sum.argument()); + } + + @Override + public void visit(AggregateFunction.Asterisk asterisk) { + buf.appendSql(asterisk.getName()); + } + + private void binaryOperator(String operator, Operand left, Operand right) { + buf.appendSql("("); + left.accept(operandVisitor); + buf.appendSql(" " + operator + " "); + right.accept(operandVisitor); + buf.appendSql(")"); + } + + private void aggregateFunction(String name, PropertyMetamodel argument) { + buf.appendSql(name); + buf.appendSql("("); + argument.accept(this); + buf.appendSql(")"); + } } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/CriteriaBuilder.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/CriteriaBuilder.java new file mode 100644 index 000000000..d2bbcaed1 --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/CriteriaBuilder.java @@ -0,0 +1,22 @@ +package org.seasar.doma.jdbc.criteria.query; + +import java.util.function.Consumer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; + +public interface CriteriaBuilder { + + void concat(PreparedSqlBuilder buf, Runnable leftOperand, Runnable rightOperand); + + void offsetAndFetch(PreparedSqlBuilder buf, int offset, int limit); + + void lockWithTableHint( + PreparedSqlBuilder buf, ForUpdateOption option, Consumer> column); + + void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager); +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/DeleteBuilder.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/DeleteBuilder.java index 62a2a3e55..94657b35a 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/DeleteBuilder.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/DeleteBuilder.java @@ -9,7 +9,7 @@ import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.DeleteContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class DeleteBuilder { private final DeleteContext context; @@ -46,7 +46,7 @@ public DeleteBuilder( public PreparedSql build() { buf.appendSql("delete from "); - table(context.entityDef); + table(context.entityMetamodel); if (!context.where.isEmpty()) { buf.appendSql(" where "); int index = 0; @@ -59,8 +59,8 @@ public PreparedSql build() { return buf.build(commenter); } - private void table(EntityDef entityDef) { - support.table(entityDef); + private void table(EntityMetamodel entityMetamodel) { + support.table(entityMetamodel); } private void visitCriterion(int index, Criterion criterion) { diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/InsertBuilder.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/InsertBuilder.java index 5a9ebb089..7dc3ac2d7 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/InsertBuilder.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/InsertBuilder.java @@ -4,18 +4,22 @@ import java.util.function.Function; import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.InParameter; import org.seasar.doma.jdbc.PreparedSql; import org.seasar.doma.jdbc.SqlKind; import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.criteria.context.InsertContext; import org.seasar.doma.jdbc.criteria.context.Operand; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityPropertyType; +import org.seasar.doma.jdbc.entity.EntityType; public class InsertBuilder { + private final Config config; private final InsertContext context; private final Function commenter; private final PreparedSqlBuilder buf; - private final BuilderSupport support; public InsertBuilder( Config config, @@ -30,50 +34,86 @@ public InsertBuilder( InsertContext context, Function commenter, PreparedSqlBuilder buf) { + this.config = Objects.requireNonNull(config); this.context = Objects.requireNonNull(context); this.commenter = Objects.requireNonNull(commenter); this.buf = Objects.requireNonNull(buf); - support = new BuilderSupport(config, commenter, buf, null); } public PreparedSql build() { buf.appendSql("insert into "); - table(context.entityDef); + table(context.entityMetamodel); if (!context.values.isEmpty()) { - buf.appendSql(" ("); - context - .values - .keySet() - .forEach( - key -> { - column(key); - buf.appendSql(", "); - }); - buf.cutBackSql(2); - buf.appendSql(") values ("); - context - .values - .values() - .forEach( - value -> { - param(value); - buf.appendSql(", "); - }); - buf.cutBackSql(2); - buf.appendSql(")"); + values(); + } else { + if (context.selectContext != null) { + select(); + } } return buf.build(commenter); } - private void table(EntityDef entityDef) { - support.table(entityDef); + private void values() { + buf.appendSql(" ("); + context + .values + .keySet() + .forEach( + key -> { + column(key); + buf.appendSql(", "); + }); + buf.cutBackSql(2); + buf.appendSql(") values ("); + context + .values + .values() + .forEach( + value -> { + param(value); + buf.appendSql(", "); + }); + buf.cutBackSql(2); + buf.appendSql(")"); + } + + private void select() { + buf.appendSql(" ("); + context + .entityMetamodel + .allPropertyMetamodels() + .forEach( + p -> { + column(p); + buf.appendSql(", "); + }); + buf.cutBackSql(2); + buf.appendSql(") "); + AliasManager aliasManager = new AliasManager(context.selectContext); + SelectBuilder builder = + new SelectBuilder(config, context.selectContext, Function.identity(), buf, aliasManager); + builder.interpret(); + } + + private void table(EntityMetamodel entityMetamodel) { + EntityType entityType = entityMetamodel.asType(); + buf.appendSql( + entityType.getQualifiedTableName( + config.getNaming()::apply, config.getDialect()::applyQuote)); } private void column(Operand.Prop prop) { - support.column(prop); + column(prop.value); + } + + private void column(PropertyMetamodel propertyMetamodel) { + EntityPropertyType propertyType = propertyMetamodel.asType(); + buf.appendSql( + propertyType.getColumnName(config.getNaming()::apply, config.getDialect()::applyQuote)); } private void param(Operand.Param param) { - support.param(param); + InParameter parameter = param.createInParameter(config); + buf.appendParameter(parameter); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java index 03025bf2f..ae3dd8bb6 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/SelectBuilder.java @@ -16,17 +16,20 @@ import org.seasar.doma.jdbc.criteria.context.JoinKind; import org.seasar.doma.jdbc.criteria.context.OrderByItem; import org.seasar.doma.jdbc.criteria.context.SelectContext; -import org.seasar.doma.jdbc.criteria.declaration.AggregateFunction; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.expression.AggregateFunction; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.DistinctOption; import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; public class SelectBuilder { + private final Config config; private final SelectContext context; private final Function commenter; private final PreparedSqlBuilder buf; + private final AliasManager aliasManager; private final BuilderSupport support; + private final CriteriaBuilder criteriaBuilder; public SelectBuilder( Config config, @@ -48,11 +51,13 @@ public SelectBuilder( PreparedSqlBuilder buf, AliasManager aliasManager) { Objects.requireNonNull(config); + this.config = Objects.requireNonNull(config); this.context = Objects.requireNonNull(context); this.commenter = Objects.requireNonNull(commenter); this.buf = Objects.requireNonNull(buf); - Objects.requireNonNull(aliasManager); + this.aliasManager = Objects.requireNonNull(aliasManager); support = new BuilderSupport(config, commenter, buf, aliasManager); + criteriaBuilder = config.getDialect().getCriteriaBuilder(); } public PreparedSql build() { @@ -63,28 +68,28 @@ public PreparedSql build() { void interpret() { select(); from(); + join(); where(); groupBy(); having(); orderBy(); - limit(); - offset(); + offsetAndFetch(); forUpdate(); } private void select() { buf.appendSql("select "); - if (context.distinct == DistinctOption.ENABLED) { + if (context.distinct == DistinctOption.Kind.BASIC) { buf.appendSql("distinct "); } - List> propertyDefs = context.allPropertyDefs(); - if (propertyDefs.isEmpty()) { + List> propertyMetamodels = context.allPropertyMetamodels(); + if (propertyMetamodels.isEmpty()) { buf.appendSql("*"); } else { - for (PropertyDef propertyDef : propertyDefs) { - column(propertyDef); + for (PropertyMetamodel propertyMetamodel : propertyMetamodels) { + column(propertyMetamodel); buf.appendSql(", "); } buf.cutBackSql(2); @@ -93,7 +98,14 @@ private void select() { private void from() { buf.appendSql(" from "); - table(context.entityDef); + table(context.entityMetamodel); + if (context.forUpdate != null) { + ForUpdateOption option = context.forUpdate.option; + criteriaBuilder.lockWithTableHint(buf, option, this::column); + } + } + + private void join() { if (!context.joins.isEmpty()) { for (Join join : context.joins) { if (join.kind == JoinKind.INNER) { @@ -101,7 +113,7 @@ private void from() { } else if (join.kind == JoinKind.LEFT) { buf.appendSql(" left outer join "); } - table(join.entityDef); + table(join.entityMetamodel); if (!join.on.isEmpty()) { buf.appendSql(" on ("); int index = 0; @@ -131,10 +143,10 @@ private void where() { private void groupBy() { if (context.groupBy.isEmpty()) { - List> propertyDefs = context.allPropertyDefs(); - if (propertyDefs.stream().anyMatch(p -> p instanceof AggregateFunction)) { - List> groupKeys = - propertyDefs.stream() + List> propertyMetamodels = context.allPropertyMetamodels(); + if (propertyMetamodels.stream().anyMatch(p -> p instanceof AggregateFunction)) { + List> groupKeys = + propertyMetamodels.stream() .filter(p -> !(p instanceof AggregateFunction)) .collect(toList()); context.groupBy.addAll(groupKeys); @@ -142,7 +154,7 @@ private void groupBy() { } if (!context.groupBy.isEmpty()) { buf.appendSql(" group by "); - for (PropertyDef p : context.groupBy) { + for (PropertyMetamodel p : context.groupBy) { column(p); buf.appendSql(", "); } @@ -185,38 +197,28 @@ public void visit(OrderByItem.Index index) { } } - private void limit() { - if (context.limit != null) { - buf.appendSql(" limit "); - buf.appendSql(context.limit.toString()); - } - } - - private void offset() { - if (context.offset != null) { - buf.appendSql(" offset "); - buf.appendSql(context.offset.toString()); + private void offsetAndFetch() { + if (context.offset == null && context.limit == null) { + return; } + int offset = (context.offset == null || context.offset < 0) ? 0 : context.offset; + int limit = (context.limit == null || context.limit < 0) ? 0 : context.limit; + criteriaBuilder.offsetAndFetch(buf, offset, limit); } private void forUpdate() { if (context.forUpdate != null) { ForUpdateOption option = context.forUpdate.option; - if (option != ForUpdateOption.DISABLED) { - buf.appendSql(" for update"); - if (option == ForUpdateOption.NOWAIT) { - buf.appendSql(" nowait"); - } - } + criteriaBuilder.forUpdate(buf, option, this::column, aliasManager); } } - private void table(EntityDef entityDef) { - support.table(entityDef); + private void table(EntityMetamodel entityMetamodel) { + support.table(entityMetamodel); } - private void column(PropertyDef propertyDef) { - support.column(propertyDef); + private void column(PropertyMetamodel propertyMetamodel) { + support.column(propertyMetamodel); } private void visitCriterion(int index, Criterion criterion) { diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/UpdateBuilder.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/UpdateBuilder.java index c72758705..226061d56 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/UpdateBuilder.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/query/UpdateBuilder.java @@ -12,7 +12,7 @@ import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.Operand; import org.seasar.doma.jdbc.criteria.context.UpdateContext; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; public class UpdateBuilder { private final UpdateContext context; @@ -49,15 +49,15 @@ public UpdateBuilder( public PreparedSql build() { buf.appendSql("update "); - table(context.entityDef); + table(context.entityMetamodel); if (!context.set.isEmpty()) { buf.appendSql(" set "); - Set> entries = context.set.entrySet(); + Set> entries = context.set.entrySet(); entries.forEach( entry -> { column(entry.getKey()); buf.appendSql(" = "); - param(entry.getValue()); + operand(entry.getValue()); buf.appendSql(", "); }); buf.cutBackSql(2); @@ -74,16 +74,16 @@ public PreparedSql build() { return buf.build(commenter); } - private void table(EntityDef entityDef) { - support.table(entityDef); + private void table(EntityMetamodel entityMetamodel) { + support.table(entityMetamodel); } - private void column(Operand.Prop prop) { - support.column(prop); + private void operand(Operand operand) { + support.operand(operand); } - private void param(Operand.Param param) { - support.param(param); + private void column(Operand.Prop prop) { + support.column(prop); } private void visitCriterion(int index, Criterion criterion) { diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchDeleteStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchDeleteStatement.java index 9f1ec4302..c7aeff165 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchDeleteStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchDeleteStatement.java @@ -2,36 +2,40 @@ import java.util.List; import java.util.Objects; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.SqlKind; import org.seasar.doma.jdbc.command.BatchDeleteCommand; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.criteria.context.DeleteSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoBatchDeleteQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlBatchDeleteStatement - extends AbstractStatement, List> { + extends AbstractStatement, BatchResult> { private static final EmptySql EMPTY_SQL = new EmptySql(SqlKind.BATCH_DELETE); - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final List entities; private final DeleteSettings settings; public EntityqlBatchDeleteStatement( - Config config, EntityDef entityDef, List entities, DeleteSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + List entities, + DeleteSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entities = Objects.requireNonNull(entities); this.settings = Objects.requireNonNull(settings); } @Override - protected Command> createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoBatchDeleteQuery query = config.getQueryImplementors().createAutoBatchDeleteQuery(EXECUTE_METHOD, entityType); query.setMethod(EXECUTE_METHOD); @@ -42,23 +46,23 @@ protected Command> createCommand() { query.setQueryTimeout(settings.getQueryTimeout()); query.setBatchSize(settings.getBatchSize()); query.setSqlLogType(settings.getSqlLogType()); - query.setVersionIgnored(false); - query.setOptimisticLockExceptionSuppressed(false); + query.setVersionIgnored(settings.getIgnoreVersion()); + query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException()); query.setMessage(settings.getComment()); query.prepare(); BatchDeleteCommand command = config.getCommandImplementors().createBatchDeleteCommand(EXECUTE_METHOD, query); - return new Command>() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public List execute() { - command.execute(); + public BatchResult execute() { + int[] counts = command.execute(); query.complete(); - return query.getEntities(); + return new BatchResult<>(counts, query.getEntities()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchInsertStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchInsertStatement.java index e8a54ae05..f3106aa65 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchInsertStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchInsertStatement.java @@ -2,36 +2,40 @@ import java.util.List; import java.util.Objects; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.SqlKind; import org.seasar.doma.jdbc.command.BatchInsertCommand; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.criteria.context.InsertSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoBatchInsertQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlBatchInsertStatement - extends AbstractStatement, List> { + extends AbstractStatement, BatchResult> { private static final EmptySql EMPTY_SQL = new EmptySql(SqlKind.BATCH_INSERT); - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final List entities; private final InsertSettings settings; public EntityqlBatchInsertStatement( - Config config, EntityDef entityDef, List entities, InsertSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + List entities, + InsertSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entities = Objects.requireNonNull(entities); this.settings = Objects.requireNonNull(settings); } @Override - protected Command> createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoBatchInsertQuery query = config.getQueryImplementors().createAutoBatchInsertQuery(EXECUTE_METHOD, entityType); query.setMethod(EXECUTE_METHOD); @@ -48,17 +52,17 @@ protected Command> createCommand() { query.prepare(); BatchInsertCommand command = config.getCommandImplementors().createBatchInsertCommand(EXECUTE_METHOD, query); - return new Command>() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public List execute() { - command.execute(); + public BatchResult execute() { + int[] counts = command.execute(); query.complete(); - return query.getEntities(); + return new BatchResult<>(counts, query.getEntities()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchUpdateStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchUpdateStatement.java index 457adae6e..38e396436 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchUpdateStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlBatchUpdateStatement.java @@ -2,36 +2,40 @@ import java.util.List; import java.util.Objects; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.SqlKind; import org.seasar.doma.jdbc.command.BatchUpdateCommand; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.criteria.context.UpdateSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoBatchUpdateQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlBatchUpdateStatement - extends AbstractStatement, List> { + extends AbstractStatement, BatchResult> { private static final EmptySql EMPTY_SQL = new EmptySql(SqlKind.BATCH_UPDATE); - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final List entities; private final UpdateSettings settings; public EntityqlBatchUpdateStatement( - Config config, EntityDef entityDef, List entities, UpdateSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + List entities, + UpdateSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entities = Objects.requireNonNull(entities); this.settings = Objects.requireNonNull(settings); } @Override - protected Command> createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoBatchUpdateQuery query = config.getQueryImplementors().createAutoBatchUpdateQuery(EXECUTE_METHOD, entityType); query.setMethod(EXECUTE_METHOD); @@ -42,25 +46,25 @@ protected Command> createCommand() { query.setQueryTimeout(settings.getQueryTimeout()); query.setBatchSize(settings.getBatchSize()); query.setSqlLogType(settings.getSqlLogType()); - query.setVersionIgnored(false); + query.setVersionIgnored(settings.getIgnoreVersion()); query.setIncludedPropertyNames(); query.setExcludedPropertyNames(); - query.setOptimisticLockExceptionSuppressed(false); + query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException()); query.setMessage(settings.getComment()); query.prepare(); BatchUpdateCommand command = config.getCommandImplementors().createBatchUpdateCommand(EXECUTE_METHOD, query); - return new Command>() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public List execute() { - command.execute(); + public BatchResult execute() { + int[] counts = command.execute(); query.complete(); - return query.getEntities(); + return new BatchResult<>(counts, query.getEntities()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlDeleteStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlDeleteStatement.java index 01bd51e02..c92b6a4dc 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlDeleteStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlDeleteStatement.java @@ -2,32 +2,36 @@ import java.util.Objects; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.command.DeleteCommand; import org.seasar.doma.jdbc.criteria.context.DeleteSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoDeleteQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlDeleteStatement - extends AbstractStatement, ENTITY> { + extends AbstractStatement, Result> { - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final ENTITY entity; private final DeleteSettings settings; public EntityqlDeleteStatement( - Config config, EntityDef entityDef, ENTITY entity, DeleteSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + ENTITY entity, + DeleteSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entity = Objects.requireNonNull(entity); this.settings = Objects.requireNonNull(settings); } @Override - protected Command createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoDeleteQuery query = config.getQueryImplementors().createAutoDeleteQuery(EXECUTE_METHOD, entityType); query.setConfig(config); @@ -37,23 +41,23 @@ protected Command createCommand() { query.setCallerMethodName(EXECUTE_METHOD_NAME); query.setQueryTimeout(settings.getQueryTimeout()); query.setSqlLogType(settings.getSqlLogType()); - query.setVersionIgnored(false); - query.setOptimisticLockExceptionSuppressed(false); + query.setVersionIgnored(settings.getIgnoreVersion()); + query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException()); query.setMessage(settings.getComment()); query.prepare(); DeleteCommand command = config.getCommandImplementors().createDeleteCommand(EXECUTE_METHOD, query); - return new Command() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public ENTITY execute() { - command.execute(); + public Result execute() { + int count = command.execute(); query.complete(); - return query.getEntity(); + return new Result<>(count, query.getEntity()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlInsertStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlInsertStatement.java index 750aa4643..9be66a53a 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlInsertStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlInsertStatement.java @@ -2,32 +2,36 @@ import java.util.Objects; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.command.InsertCommand; import org.seasar.doma.jdbc.criteria.context.InsertSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoInsertQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlInsertStatement - extends AbstractStatement, ENTITY> { + extends AbstractStatement, Result> { - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final ENTITY entity; private final InsertSettings settings; public EntityqlInsertStatement( - Config config, EntityDef entityDef, ENTITY entity, InsertSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + ENTITY entity, + InsertSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entity = Objects.requireNonNull(entity); this.settings = Objects.requireNonNull(settings); } @Override - protected Command createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoInsertQuery query = config.getQueryImplementors().createAutoInsertQuery(EXECUTE_METHOD, entityType); query.setMethod(EXECUTE_METHOD); @@ -44,17 +48,17 @@ protected Command createCommand() { query.prepare(); InsertCommand command = config.getCommandImplementors().createInsertCommand(EXECUTE_METHOD, query); - return new Command() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public ENTITY execute() { - command.execute(); + public Result execute() { + int count = command.execute(); query.complete(); - return query.getEntity(); + return new Result<>(count, query.getEntity()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlSelectStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlSelectStatement.java index 1dd7719d5..a0d328abc 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlSelectStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlSelectStatement.java @@ -14,7 +14,7 @@ import org.seasar.doma.jdbc.criteria.declaration.OrderByNameDeclaration; import org.seasar.doma.jdbc.criteria.declaration.SelectFromDeclaration; import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.criteria.option.AssociationOption; import org.seasar.doma.jdbc.criteria.option.DistinctOption; import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; @@ -33,50 +33,64 @@ public EntityqlSelectStatement(Config config, SelectFromDeclaration declaration) } public EntityqlSelectStatement distinct() { - declaration.distinct(DistinctOption.ENABLED); + declaration.distinct(DistinctOption.basic()); return this; } public EntityqlSelectStatement distinct(DistinctOption distinctOption) { + Objects.requireNonNull(distinctOption); declaration.distinct(distinctOption); return this; } public EntityqlSelectStatement innerJoin( - EntityDef entityDef, Consumer block) { - declaration.innerJoin(entityDef, block); + EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); + Objects.requireNonNull(block); + declaration.innerJoin(entityMetamodel, block); return this; } public EntityqlSelectStatement leftJoin( - EntityDef entityDef, Consumer block) { - declaration.leftJoin(entityDef, block); + EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); + Objects.requireNonNull(block); + declaration.leftJoin(entityMetamodel, block); return this; } public EntityqlSelectStatement associate( - EntityDef first, - EntityDef second, + EntityMetamodel first, + EntityMetamodel second, BiConsumer associator) { - declaration.associate(first, second, associator, AssociationOption.MANDATORY); + Objects.requireNonNull(first); + Objects.requireNonNull(second); + Objects.requireNonNull(associator); + declaration.associate(first, second, associator, AssociationOption.mandatory()); return this; } public EntityqlSelectStatement associate( - EntityDef first, - EntityDef second, + EntityMetamodel first, + EntityMetamodel second, BiConsumer associator, - AssociationOption kind) { - declaration.associate(first, second, associator, kind); + AssociationOption option) { + Objects.requireNonNull(first); + Objects.requireNonNull(second); + Objects.requireNonNull(associator); + Objects.requireNonNull(option); + declaration.associate(first, second, associator, option); return this; } public EntityqlSelectStatement where(Consumer block) { + Objects.requireNonNull(block); declaration.where(block); return this; } public EntityqlSelectStatement orderBy(Consumer block) { + Objects.requireNonNull(block); declaration.orderBy(block); return this; } @@ -92,11 +106,12 @@ public EntityqlSelectStatement offset(Integer offset) { } public EntityqlSelectStatement forUpdate() { - declaration.forUpdate(ForUpdateOption.WAIT); + declaration.forUpdate(ForUpdateOption.basic()); return this; } public EntityqlSelectStatement forUpdate(ForUpdateOption option) { + Objects.requireNonNull(option); declaration.forUpdate(option); return this; } @@ -113,6 +128,16 @@ protected Command> createCommand() { query.setFetchSize(settings.getFetchSize()); query.setMaxRows(settings.getMaxRows()); query.setQueryTimeout(settings.getQueryTimeout()); - return new AssociateCommand<>(context, query); + return new AssociateCommand(context, query) { + @Override + public List execute() { + if (!settings.getAllowEmptyWhere()) { + if (context.where.isEmpty()) { + throw new EmptyWhereClauseException(sql); + } + } + return super.execute(); + } + }; } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlUpdateStatement.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlUpdateStatement.java index 2f78cfcf5..5fcb481b1 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlUpdateStatement.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/EntityqlUpdateStatement.java @@ -2,32 +2,36 @@ import java.util.Objects; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.command.Command; import org.seasar.doma.jdbc.command.UpdateCommand; import org.seasar.doma.jdbc.criteria.context.UpdateSettings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; import org.seasar.doma.jdbc.entity.EntityType; import org.seasar.doma.jdbc.query.AutoUpdateQuery; import org.seasar.doma.jdbc.query.Query; public class EntityqlUpdateStatement - extends AbstractStatement, ENTITY> { + extends AbstractStatement, Result> { - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; private final ENTITY entity; private final UpdateSettings settings; public EntityqlUpdateStatement( - Config config, EntityDef entityDef, ENTITY entity, UpdateSettings settings) { + Config config, + EntityMetamodel entityMetamodel, + ENTITY entity, + UpdateSettings settings) { super(Objects.requireNonNull(config)); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); this.entity = Objects.requireNonNull(entity); this.settings = Objects.requireNonNull(settings); } @Override - protected Command createCommand() { - EntityType entityType = entityDef.asType(); + protected Command> createCommand() { + EntityType entityType = entityMetamodel.asType(); AutoUpdateQuery query = config.getQueryImplementors().createAutoUpdateQuery(EXECUTE_METHOD, entityType); query.setConfig(config); @@ -38,26 +42,26 @@ protected Command createCommand() { query.setQueryTimeout(settings.getQueryTimeout()); query.setSqlLogType(settings.getSqlLogType()); query.setNullExcluded(false); - query.setVersionIgnored(false); + query.setVersionIgnored(settings.getIgnoreVersion()); query.setIncludedPropertyNames(); query.setExcludedPropertyNames(); query.setUnchangedPropertyIncluded(false); - query.setOptimisticLockExceptionSuppressed(false); + query.setOptimisticLockExceptionSuppressed(settings.getSuppressOptimisticLockException()); query.setMessage(settings.getComment()); query.prepare(); UpdateCommand command = config.getCommandImplementors().createUpdateCommand(EXECUTE_METHOD, query); - return new Command() { + return new Command>() { @Override public Query getQuery() { return query; } @Override - public ENTITY execute() { - command.execute(); + public Result execute() { + int count = command.execute(); query.complete(); - return query.getEntity(); + return new Result<>(count, query.getEntity()); } }; } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlInsertStarting.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlInsertStarting.java index e52d96bc0..29e68f1b7 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlInsertStarting.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlInsertStarting.java @@ -2,8 +2,11 @@ import java.util.Objects; import java.util.function.Consumer; +import java.util.function.Function; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.criteria.context.SubSelectContext; import org.seasar.doma.jdbc.criteria.declaration.InsertDeclaration; +import org.seasar.doma.jdbc.criteria.declaration.InsertSelectDeclaration; import org.seasar.doma.jdbc.criteria.declaration.ValuesDeclaration; public class NativeSqlInsertStarting { @@ -23,4 +26,11 @@ public NativeSqlInsertTerminal values(Consumer block) { declaration.values(block); return new NativeSqlInsertTerminal(config, declaration); } + + public NativeSqlInsertTerminal select( + Function> block) { + Objects.requireNonNull(block); + declaration.select(block); + return new NativeSqlInsertTerminal(config, declaration); + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectIntermediate.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectIntermediate.java index fa127d519..be643cc6a 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectIntermediate.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectIntermediate.java @@ -16,8 +16,7 @@ import org.seasar.doma.jdbc.query.SelectQuery; public class NativeSqlSelectIntermediate - extends AbstractSetOperand, ELEMENT> - implements SetOperand { + extends AbstractSetOperand, ELEMENT> { private final SelectFromDeclaration declaration; @@ -36,6 +35,7 @@ public SetOperationContext getContext() { @Override public RESULT mapStream(Function, RESULT> streamMapper) { + Objects.requireNonNull(streamMapper); NativeSqlSelectTerminal terminal = createNativeSqlSelectTerminal(streamMapper); return terminal.execute(); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectStarting.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectStarting.java index bfd4d4fe0..1de1dcef0 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectStarting.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectStarting.java @@ -2,27 +2,34 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; +import org.seasar.doma.DomaException; import org.seasar.doma.internal.jdbc.command.EntityProvider; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.ObjectProvider; import org.seasar.doma.jdbc.command.Command; +import org.seasar.doma.jdbc.criteria.command.DataRow; import org.seasar.doma.jdbc.criteria.command.MappedResultProvider; -import org.seasar.doma.jdbc.criteria.context.SelectContext; import org.seasar.doma.jdbc.criteria.context.SetOperationContext; import org.seasar.doma.jdbc.criteria.declaration.HavingDeclaration; import org.seasar.doma.jdbc.criteria.declaration.JoinDeclaration; import org.seasar.doma.jdbc.criteria.declaration.OrderByNameDeclaration; import org.seasar.doma.jdbc.criteria.declaration.SelectFromDeclaration; import org.seasar.doma.jdbc.criteria.declaration.WhereDeclaration; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.criteria.option.DistinctOption; import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.tuple.Row; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; import org.seasar.doma.jdbc.criteria.tuple.Tuple3; import org.seasar.doma.jdbc.criteria.tuple.Tuple4; @@ -32,46 +39,48 @@ import org.seasar.doma.jdbc.criteria.tuple.Tuple8; import org.seasar.doma.jdbc.criteria.tuple.Tuple9; import org.seasar.doma.jdbc.query.SelectQuery; +import org.seasar.doma.message.Message; public class NativeSqlSelectStarting extends AbstractSetOperand, ENTITY> { private final SelectFromDeclaration declaration; - private final EntityDef entityDef; + private final EntityMetamodel entityMetamodel; public NativeSqlSelectStarting( Config config, SelectFromDeclaration declaration, - EntityDef entityDef, + EntityMetamodel entityMetamodel, Function> objectProviderFactory) { super(Objects.requireNonNull(config), Objects.requireNonNull(objectProviderFactory)); this.declaration = Objects.requireNonNull(declaration); - this.entityDef = Objects.requireNonNull(entityDef); + this.entityMetamodel = Objects.requireNonNull(entityMetamodel); } public NativeSqlSelectStarting distinct() { - declaration.distinct(DistinctOption.ENABLED); + declaration.distinct(DistinctOption.basic()); return this; } public NativeSqlSelectStarting distinct(DistinctOption distinctOption) { + Objects.requireNonNull(distinctOption); declaration.distinct(distinctOption); return this; } public NativeSqlSelectStarting innerJoin( - EntityDef entityDef, Consumer block) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(block); - declaration.innerJoin(entityDef, block); + declaration.innerJoin(entityMetamodel, block); return this; } public NativeSqlSelectStarting leftJoin( - EntityDef entityDef, Consumer block) { - Objects.requireNonNull(entityDef); + EntityMetamodel entityMetamodel, Consumer block) { + Objects.requireNonNull(entityMetamodel); Objects.requireNonNull(block); - declaration.leftJoin(entityDef, block); + declaration.leftJoin(entityMetamodel, block); return this; } @@ -81,9 +90,9 @@ public NativeSqlSelectStarting where(Consumer block) { return this; } - public NativeSqlSelectStarting groupBy(PropertyDef... propertyDefs) { - Objects.requireNonNull(propertyDefs); - declaration.groupBy(propertyDefs); + public NativeSqlSelectStarting groupBy(PropertyMetamodel... propertyMetamodels) { + Objects.requireNonNull(propertyMetamodels); + declaration.groupBy(propertyMetamodels); return this; } @@ -110,245 +119,685 @@ public NativeSqlSelectStarting offset(Integer offset) { } public NativeSqlSelectStarting forUpdate() { - declaration.forUpdate(ForUpdateOption.WAIT); + declaration.forUpdate(ForUpdateOption.basic()); return this; } public NativeSqlSelectStarting forUpdate(ForUpdateOption option) { + Objects.requireNonNull(option); declaration.forUpdate(option); return this; } - public SetOperand select(PropertyDef propertyDef) { - declaration.select(propertyDef); + public SetOperand select() { + declaration.select(entityMetamodel.allPropertyMetamodels()); return new NativeSqlSelectIntermediate<>( - config, declaration, createMappedResultProviderFactory(row -> row.get(propertyDef))); + config, + declaration, + createMappedResultProviderFactory(dataRow -> dataRow.get(entityMetamodel))); + } + + public SetOperand select(EntityMetamodel entityMetamodel) { + Objects.requireNonNull(entityMetamodel); + declaration.select(entityMetamodel.allPropertyMetamodels()); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory(dataRow -> dataRow.get(entityMetamodel))); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, EntityMetamodel entityMetamodel2) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + return new Tuple2<>(item1, item2); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + return new Tuple3<>(item1, item2, item3); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + return new Tuple4<>(item1, item2, item3, item4); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4, + EntityMetamodel entityMetamodel5) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + Objects.requireNonNull(entityMetamodel5); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size() + + entityMetamodel5.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel5.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + T5 item5 = dataRow.get(entityMetamodel5); + return new Tuple5<>(item1, item2, item3, item4, item5); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4, + EntityMetamodel entityMetamodel5, + EntityMetamodel entityMetamodel6) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + Objects.requireNonNull(entityMetamodel5); + Objects.requireNonNull(entityMetamodel6); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size() + + entityMetamodel5.allPropertyMetamodels().size() + + entityMetamodel6.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel5.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel6.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + T5 item5 = dataRow.get(entityMetamodel5); + T6 item6 = dataRow.get(entityMetamodel6); + return new Tuple6<>(item1, item2, item3, item4, item5, item6); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4, + EntityMetamodel entityMetamodel5, + EntityMetamodel entityMetamodel6, + EntityMetamodel entityMetamodel7) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + Objects.requireNonNull(entityMetamodel5); + Objects.requireNonNull(entityMetamodel6); + Objects.requireNonNull(entityMetamodel7); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size() + + entityMetamodel5.allPropertyMetamodels().size() + + entityMetamodel6.allPropertyMetamodels().size() + + entityMetamodel7.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel5.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel6.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel7.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + T5 item5 = dataRow.get(entityMetamodel5); + T6 item6 = dataRow.get(entityMetamodel6); + T7 item7 = dataRow.get(entityMetamodel7); + return new Tuple7<>(item1, item2, item3, item4, item5, item6, item7); + })); + } + + public SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4, + EntityMetamodel entityMetamodel5, + EntityMetamodel entityMetamodel6, + EntityMetamodel entityMetamodel7, + EntityMetamodel entityMetamodel8) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + Objects.requireNonNull(entityMetamodel5); + Objects.requireNonNull(entityMetamodel6); + Objects.requireNonNull(entityMetamodel7); + Objects.requireNonNull(entityMetamodel8); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size() + + entityMetamodel5.allPropertyMetamodels().size() + + entityMetamodel6.allPropertyMetamodels().size() + + entityMetamodel7.allPropertyMetamodels().size() + + entityMetamodel8.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel5.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel6.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel7.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel8.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + T5 item5 = dataRow.get(entityMetamodel5); + T6 item6 = dataRow.get(entityMetamodel6); + T7 item7 = dataRow.get(entityMetamodel7); + T8 item8 = dataRow.get(entityMetamodel8); + return new Tuple8<>(item1, item2, item3, item4, item5, item6, item7, item8); + })); + } + + public + SetOperand> select( + EntityMetamodel entityMetamodel1, + EntityMetamodel entityMetamodel2, + EntityMetamodel entityMetamodel3, + EntityMetamodel entityMetamodel4, + EntityMetamodel entityMetamodel5, + EntityMetamodel entityMetamodel6, + EntityMetamodel entityMetamodel7, + EntityMetamodel entityMetamodel8, + EntityMetamodel entityMetamodel9) { + Objects.requireNonNull(entityMetamodel1); + Objects.requireNonNull(entityMetamodel2); + Objects.requireNonNull(entityMetamodel3); + Objects.requireNonNull(entityMetamodel4); + Objects.requireNonNull(entityMetamodel5); + Objects.requireNonNull(entityMetamodel6); + Objects.requireNonNull(entityMetamodel7); + Objects.requireNonNull(entityMetamodel8); + Objects.requireNonNull(entityMetamodel9); + List> propertyMetamodels = + new ArrayList<>( + entityMetamodel1.allPropertyMetamodels().size() + + entityMetamodel2.allPropertyMetamodels().size() + + entityMetamodel3.allPropertyMetamodels().size() + + entityMetamodel4.allPropertyMetamodels().size() + + entityMetamodel5.allPropertyMetamodels().size() + + entityMetamodel6.allPropertyMetamodels().size() + + entityMetamodel7.allPropertyMetamodels().size() + + entityMetamodel8.allPropertyMetamodels().size() + + entityMetamodel9.allPropertyMetamodels().size()); + propertyMetamodels.addAll(entityMetamodel1.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel2.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel3.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel4.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel5.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel6.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel7.allPropertyMetamodels()); + propertyMetamodels.addAll(entityMetamodel8.allPropertyMetamodels()); + declaration.select(propertyMetamodels); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory( + dataRow -> { + T1 item1 = dataRow.get(entityMetamodel1); + T2 item2 = dataRow.get(entityMetamodel2); + T3 item3 = dataRow.get(entityMetamodel3); + T4 item4 = dataRow.get(entityMetamodel4); + T5 item5 = dataRow.get(entityMetamodel5); + T6 item6 = dataRow.get(entityMetamodel6); + T7 item7 = dataRow.get(entityMetamodel7); + T8 item8 = dataRow.get(entityMetamodel8); + T9 item9 = dataRow.get(entityMetamodel9); + return new Tuple9<>(item1, item2, item3, item4, item5, item6, item7, item8, item9); + })); + } + + public SetOperand select(PropertyMetamodel propertyMetamodel) { + Objects.requireNonNull(propertyMetamodel); + declaration.select(Collections.singletonList(propertyMetamodel)); + return new NativeSqlSelectIntermediate<>( + config, + declaration, + createMappedResultProviderFactory(dataRow -> dataRow.get(propertyMetamodel))); } public SetOperand> select( - PropertyDef propertyDef1, PropertyDef propertyDef2) { - declaration.select(propertyDef1, propertyDef2); + PropertyMetamodel propertyMetamodel1, PropertyMetamodel propertyMetamodel2) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + declaration.select(Arrays.asList(propertyMetamodel1, propertyMetamodel2)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); return new Tuple2<>(item1, item2); })); } public SetOperand> select( - PropertyDef propertyDef1, PropertyDef propertyDef2, PropertyDef propertyDef3) { - declaration.select(propertyDef1, propertyDef2, propertyDef3); + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + declaration.select(Arrays.asList(propertyMetamodel1, propertyMetamodel2, propertyMetamodel3)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); return new Tuple3<>(item1, item2, item3); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4) { - declaration.select(propertyDef1, propertyDef2, propertyDef3, propertyDef4); + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + declaration.select( + Arrays.asList( + propertyMetamodel1, propertyMetamodel2, propertyMetamodel3, propertyMetamodel4)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); return new Tuple4<>(item1, item2, item3, item4); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4, - PropertyDef propertyDef5) { - declaration.select(propertyDef1, propertyDef2, propertyDef3, propertyDef4, propertyDef5); + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4, + PropertyMetamodel propertyMetamodel5) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + Objects.requireNonNull(propertyMetamodel5); + declaration.select( + Arrays.asList( + propertyMetamodel1, + propertyMetamodel2, + propertyMetamodel3, + propertyMetamodel4, + propertyMetamodel5)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); - T5 item5 = row.get(propertyDef5); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); + T5 item5 = dataRow.get(propertyMetamodel5); return new Tuple5<>(item1, item2, item3, item4, item5); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4, - PropertyDef propertyDef5, - PropertyDef propertyDef6) { + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4, + PropertyMetamodel propertyMetamodel5, + PropertyMetamodel propertyMetamodel6) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + Objects.requireNonNull(propertyMetamodel5); + Objects.requireNonNull(propertyMetamodel6); declaration.select( - propertyDef1, propertyDef2, propertyDef3, propertyDef4, propertyDef5, propertyDef6); + Arrays.asList( + propertyMetamodel1, + propertyMetamodel2, + propertyMetamodel3, + propertyMetamodel4, + propertyMetamodel5, + propertyMetamodel6)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); - T5 item5 = row.get(propertyDef5); - T6 item6 = row.get(propertyDef6); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); + T5 item5 = dataRow.get(propertyMetamodel5); + T6 item6 = dataRow.get(propertyMetamodel6); return new Tuple6<>(item1, item2, item3, item4, item5, item6); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4, - PropertyDef propertyDef5, - PropertyDef propertyDef6, - PropertyDef propertyDef7) { + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4, + PropertyMetamodel propertyMetamodel5, + PropertyMetamodel propertyMetamodel6, + PropertyMetamodel propertyMetamodel7) { declaration.select( - propertyDef1, - propertyDef2, - propertyDef3, - propertyDef4, - propertyDef5, - propertyDef6, - propertyDef7); + Arrays.asList( + propertyMetamodel1, + propertyMetamodel2, + propertyMetamodel3, + propertyMetamodel4, + propertyMetamodel5, + propertyMetamodel6, + propertyMetamodel7)); + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + Objects.requireNonNull(propertyMetamodel5); + Objects.requireNonNull(propertyMetamodel6); + Objects.requireNonNull(propertyMetamodel7); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); - T5 item5 = row.get(propertyDef5); - T6 item6 = row.get(propertyDef6); - T7 item7 = row.get(propertyDef7); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); + T5 item5 = dataRow.get(propertyMetamodel5); + T6 item6 = dataRow.get(propertyMetamodel6); + T7 item7 = dataRow.get(propertyMetamodel7); return new Tuple7<>(item1, item2, item3, item4, item5, item6, item7); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4, - PropertyDef propertyDef5, - PropertyDef propertyDef6, - PropertyDef propertyDef7, - PropertyDef propertyDef8) { + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4, + PropertyMetamodel propertyMetamodel5, + PropertyMetamodel propertyMetamodel6, + PropertyMetamodel propertyMetamodel7, + PropertyMetamodel propertyMetamodel8) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + Objects.requireNonNull(propertyMetamodel5); + Objects.requireNonNull(propertyMetamodel6); + Objects.requireNonNull(propertyMetamodel7); + Objects.requireNonNull(propertyMetamodel8); declaration.select( - propertyDef1, - propertyDef2, - propertyDef3, - propertyDef4, - propertyDef5, - propertyDef6, - propertyDef7, - propertyDef8); + Arrays.asList( + propertyMetamodel1, + propertyMetamodel2, + propertyMetamodel3, + propertyMetamodel4, + propertyMetamodel5, + propertyMetamodel6, + propertyMetamodel7, + propertyMetamodel8)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); - T5 item5 = row.get(propertyDef5); - T6 item6 = row.get(propertyDef6); - T7 item7 = row.get(propertyDef7); - T8 item8 = row.get(propertyDef8); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); + T5 item5 = dataRow.get(propertyMetamodel5); + T6 item6 = dataRow.get(propertyMetamodel6); + T7 item7 = dataRow.get(propertyMetamodel7); + T8 item8 = dataRow.get(propertyMetamodel8); return new Tuple8<>(item1, item2, item3, item4, item5, item6, item7, item8); })); } public SetOperand> select( - PropertyDef propertyDef1, - PropertyDef propertyDef2, - PropertyDef propertyDef3, - PropertyDef propertyDef4, - PropertyDef propertyDef5, - PropertyDef propertyDef6, - PropertyDef propertyDef7, - PropertyDef propertyDef8, - PropertyDef propertyDef9) { + PropertyMetamodel propertyMetamodel1, + PropertyMetamodel propertyMetamodel2, + PropertyMetamodel propertyMetamodel3, + PropertyMetamodel propertyMetamodel4, + PropertyMetamodel propertyMetamodel5, + PropertyMetamodel propertyMetamodel6, + PropertyMetamodel propertyMetamodel7, + PropertyMetamodel propertyMetamodel8, + PropertyMetamodel propertyMetamodel9) { + Objects.requireNonNull(propertyMetamodel1); + Objects.requireNonNull(propertyMetamodel2); + Objects.requireNonNull(propertyMetamodel3); + Objects.requireNonNull(propertyMetamodel4); + Objects.requireNonNull(propertyMetamodel5); + Objects.requireNonNull(propertyMetamodel6); + Objects.requireNonNull(propertyMetamodel7); + Objects.requireNonNull(propertyMetamodel8); + Objects.requireNonNull(propertyMetamodel9); declaration.select( - propertyDef1, - propertyDef2, - propertyDef3, - propertyDef4, - propertyDef5, - propertyDef6, - propertyDef7, - propertyDef8, - propertyDef9); + Arrays.asList( + propertyMetamodel1, + propertyMetamodel2, + propertyMetamodel3, + propertyMetamodel4, + propertyMetamodel5, + propertyMetamodel6, + propertyMetamodel7, + propertyMetamodel8, + propertyMetamodel9)); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - T1 item1 = row.get(propertyDef1); - T2 item2 = row.get(propertyDef2); - T3 item3 = row.get(propertyDef3); - T4 item4 = row.get(propertyDef4); - T5 item5 = row.get(propertyDef5); - T6 item6 = row.get(propertyDef6); - T7 item7 = row.get(propertyDef7); - T8 item8 = row.get(propertyDef8); - T9 item9 = row.get(propertyDef9); + dataRow -> { + T1 item1 = dataRow.get(propertyMetamodel1); + T2 item2 = dataRow.get(propertyMetamodel2); + T3 item3 = dataRow.get(propertyMetamodel3); + T4 item4 = dataRow.get(propertyMetamodel4); + T5 item5 = dataRow.get(propertyMetamodel5); + T6 item6 = dataRow.get(propertyMetamodel6); + T7 item7 = dataRow.get(propertyMetamodel7); + T8 item8 = dataRow.get(propertyMetamodel8); + T9 item9 = dataRow.get(propertyMetamodel9); return new Tuple9<>(item1, item2, item3, item4, item5, item6, item7, item8, item9); })); } - public SetOperand> select(PropertyDef... propertyDefs) { - List> list; - if (propertyDefs.length == 0) { - SelectContext context = declaration.getContext(); - list = context.allPropertyDefs(); - } else { - declaration.select(propertyDefs); - list = Arrays.asList(propertyDefs); + public SetOperand select( + PropertyMetamodel propertyMetamodel, PropertyMetamodel... propertyMetamodels) { + Objects.requireNonNull(propertyMetamodel); + Objects.requireNonNull(propertyMetamodels); + for (int i = 0; i < propertyMetamodels.length; i++) { + Objects.requireNonNull(propertyMetamodels[i], "propertyMetamodels[" + i + "]"); } + List> list = new ArrayList<>(1 + propertyMetamodels.length); + list.add(propertyMetamodel); + list.addAll(Arrays.asList(propertyMetamodels)); + declaration.select(list); return new NativeSqlSelectIntermediate<>( config, declaration, createMappedResultProviderFactory( - row -> { - List results = new ArrayList<>(); - for (PropertyDef propertyDef : list) { - Object value = row.get(propertyDef); - results.add(value); + dataRow -> { + Map, Object> map = new LinkedHashMap<>(); + for (PropertyMetamodel p : list) { + Object value = dataRow.get(p); + map.put(p, value); } - return results; + return new Row() { + + @Override + public boolean containsKey(PropertyMetamodel key) { + return map.containsKey(key); + } + + @SuppressWarnings("unchecked") + @Override + public PROPERTY get(PropertyMetamodel propertyMetamodel) { + if (!map.containsKey(propertyMetamodel)) { + throw new DomaException(Message.DOMA6002, propertyMetamodel.getName()); + } + Object value = map.get(propertyMetamodel); + return (PROPERTY) value; + } + + @Override + public Set> keySet() { + return map.keySet(); + } + + @Override + public Collection values() { + return map.values(); + } + + @Override + public int size() { + return map.size(); + } + }; })); } private Function> createMappedResultProviderFactory( - Function rowMapper) { + Function rowMapper) { return query -> new MappedResultProvider<>(query, rowMapper); } @@ -374,6 +823,6 @@ protected Command> createCommand() { } private Function> createEntityProviderFactory() { - return selectQuery -> new EntityProvider<>(entityDef.asType(), selectQuery, false); + return selectQuery -> new EntityProvider<>(entityMetamodel.asType(), selectQuery, false); } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectTerminal.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectTerminal.java index e51f5f6d2..400090d6f 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectTerminal.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSelectTerminal.java @@ -37,6 +37,16 @@ protected Command createCommand() { query.setFetchSize(settings.getQueryTimeout()); query.setMaxRows(settings.getMaxRows()); query.setQueryTimeout(settings.getQueryTimeout()); - return new SelectCommand<>(query, resultSetHandler); + return new SelectCommand(query, resultSetHandler) { + @Override + public RESULT execute() { + if (!settings.getAllowEmptyWhere()) { + if (context.where.isEmpty()) { + throw new EmptyWhereClauseException(sql); + } + } + return super.execute(); + } + }; } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSetStarting.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSetStarting.java index 8772832c4..1540e87f4 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSetStarting.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/NativeSqlSetStarting.java @@ -32,6 +32,7 @@ public NativeSqlSetStarting( @Override public SetOperand orderBy(Consumer block) { + Objects.requireNonNull(block); OrderByIndexDeclaration declaration = new OrderByIndexDeclaration(context); block.accept(declaration); return this; @@ -44,6 +45,7 @@ public SetOperationContext getContext() { @Override public RESULT mapStream(Function, RESULT> streamMapper) { + Objects.requireNonNull(streamMapper); NativeSqlSetTerminal terminal = createNativeSqlSetTerminal(streamMapper); return terminal.execute(); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/Row.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/Row.java index 339245f49..2f71843d4 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/Row.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/statement/Row.java @@ -1,8 +1,8 @@ package org.seasar.doma.jdbc.criteria.statement; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; public interface Row { - PROPERTY get(PropertyDef propertyDef); + PROPERTY get(PropertyMetamodel propertyMetamodel); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/tuple/Row.java b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/tuple/Row.java new file mode 100644 index 000000000..6c265fe0b --- /dev/null +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/criteria/tuple/Row.java @@ -0,0 +1,18 @@ +package org.seasar.doma.jdbc.criteria.tuple; + +import java.util.Collection; +import java.util.Set; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; + +public interface Row { + + boolean containsKey(PropertyMetamodel key); + + PROPERTY get(PropertyMetamodel key); + + Set> keySet(); + + Collection values(); + + int size(); +} diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Db2Dialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Db2Dialect.java index bf792f5e4..892996103 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Db2Dialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Db2Dialect.java @@ -3,10 +3,12 @@ import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; +import java.util.function.Consumer; import org.seasar.doma.DomaNullPointerException; import org.seasar.doma.expr.ExpressionFunctions; import org.seasar.doma.internal.jdbc.dialect.Db2ForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.Db2PagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.jdbc.InParameter; import org.seasar.doma.jdbc.JdbcMappingVisitor; import org.seasar.doma.jdbc.PreparedSql; @@ -16,6 +18,10 @@ import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.query.AliasManager; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; /** A dialect for Db2. */ public class Db2Dialect extends StandardDialect { @@ -127,6 +133,11 @@ public ScriptBlockContext createScriptBlockContext() { return new Db2ScriptBlockContext(); } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return new Db2CriteriaBuilder(); + } + public static class Db2JdbcMappingVisitor extends StandardJdbcMappingVisitor {} public static class Db2SqlLogFormattingVisitor extends StandardSqlLogFormattingVisitor {} @@ -159,4 +170,35 @@ protected Db2ScriptBlockContext() { sqlBlockStartKeywordsList.add(Arrays.asList("alter", "trigger")); } } + + public static class Db2CriteriaBuilder extends StandardCriteriaBuilder { + @Override + public void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager) { + option.accept( + new ForUpdateOption.Visitor() { + @Override + public void visit(ForUpdateOption.Basic basic) { + appendSql(); + } + + @Override + public void visit(ForUpdateOption.NoWait wait) { + appendSql(); + } + + @Override + public void visit(ForUpdateOption.Wait noWait) { + appendSql(); + } + + private void appendSql() { + buf.appendSql(" for update with rs"); + } + }); + } + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java index 43d33e0c1..f1f8b4a06 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Dialect.java @@ -14,6 +14,7 @@ import org.seasar.doma.jdbc.SqlLogFormatter; import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; import org.seasar.doma.jdbc.id.AutoGeneratedKeysType; import org.seasar.doma.jdbc.type.JdbcType; import org.seasar.doma.wrapper.Wrapper; @@ -259,4 +260,6 @@ Sql getIdentityReservationSql( * @return the type of the auto generated keys */ AutoGeneratedKeysType getAutoGeneratedKeysType(); + + CriteriaBuilder getCriteriaBuilder(); } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Mssql2008Dialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Mssql2008Dialect.java index 14401bbff..6a0abee48 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Mssql2008Dialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Mssql2008Dialect.java @@ -2,15 +2,21 @@ import java.sql.SQLException; import java.util.Arrays; +import java.util.function.Consumer; import org.seasar.doma.DomaNullPointerException; import org.seasar.doma.expr.ExpressionFunctions; import org.seasar.doma.internal.jdbc.dialect.Mssql2008ForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.Mssql2008PagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.jdbc.JdbcMappingVisitor; import org.seasar.doma.jdbc.ScriptBlockContext; import org.seasar.doma.jdbc.SelectForUpdateType; import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.query.AliasManager; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; /** A dialect for Microsoft SQL Server 2008 and below. */ public class Mssql2008Dialect extends StandardDialect { @@ -123,6 +129,11 @@ public ScriptBlockContext createScriptBlockContext() { return new Mssql2008ScriptBlockContext(); } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return new Mssql2008CriteriaBuilder(); + } + public static class Mssql2008JdbcMappingVisitor extends StandardJdbcMappingVisitor {} public static class Mssql2008SqlLogFormattingVisitor extends StandardSqlLogFormattingVisitor {} @@ -157,4 +168,45 @@ protected Mssql2008ScriptBlockContext() { sqlBlockStartKeywordsList.add(Arrays.asList("begin")); } } + + public static class Mssql2008CriteriaBuilder extends StandardCriteriaBuilder { + + public void concat(PreparedSqlBuilder buf, Runnable leftOperand, Runnable rightOperand) { + buf.appendSql("("); + leftOperand.run(); + buf.appendSql(" + "); + rightOperand.run(); + buf.appendSql(")"); + } + + @Override + public void lockWithTableHint( + PreparedSqlBuilder buf, ForUpdateOption option, Consumer> column) { + option.accept( + new ForUpdateOption.Visitor() { + + @Override + public void visit(ForUpdateOption.Basic basic) { + buf.appendSql(" with (updlock, rowlock)"); + } + + @Override + public void visit(ForUpdateOption.NoWait noWait) { + buf.appendSql(" with (updlock, rowlock, nowait)"); + } + + @Override + public void visit(ForUpdateOption.Wait wait) { + buf.appendSql(" with (updlock, rowlock)"); + } + }); + } + + @Override + public void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager) {} + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java index 9cce9aa7b..288fb59eb 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/MysqlDialect.java @@ -10,11 +10,13 @@ import org.seasar.doma.internal.jdbc.dialect.MysqlCountGettingTransformer; import org.seasar.doma.internal.jdbc.dialect.MysqlForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.MysqlPagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.jdbc.JdbcMappingVisitor; import org.seasar.doma.jdbc.ScriptBlockContext; import org.seasar.doma.jdbc.SelectForUpdateType; import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; /** A dialect for MySQL. */ public class MysqlDialect extends StandardDialect { @@ -130,6 +132,11 @@ public String applyQuote(String name) { return OPEN_QUOTE + name + CLOSE_QUOTE; } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return new MysqlCriteriaBuilder(); + } + public static class MysqlJdbcMappingVisitor extends StandardJdbcMappingVisitor {} public static class MysqlSqlLogFormattingVisitor extends StandardSqlLogFormattingVisitor {} @@ -162,4 +169,18 @@ protected MysqlScriptBlockContext() { sqlBlockStartKeywordsList.add(Arrays.asList("begin")); } } + + public static class MysqlCriteriaBuilder extends StandardCriteriaBuilder { + @Override + public void offsetAndFetch(PreparedSqlBuilder buf, int offset, int limit) { + buf.appendSql(" limit "); + if (limit > 0) { + buf.appendSql(Integer.toString(limit)); + } else { + buf.appendSql(MysqlPagingTransformer.MAXIMUM_LIMIT); + } + buf.appendSql(" offset "); + buf.appendSql(Integer.toString(offset)); + } + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Oracle11Dialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Oracle11Dialect.java index b59767032..29f8fc6de 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Oracle11Dialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/Oracle11Dialect.java @@ -11,10 +11,13 @@ import java.time.LocalTime; import java.util.Arrays; import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; import org.seasar.doma.DomaNullPointerException; import org.seasar.doma.expr.ExpressionFunctions; import org.seasar.doma.internal.jdbc.dialect.OracleForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.OraclePagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.internal.util.AssertionUtil; import org.seasar.doma.jdbc.InParameter; import org.seasar.doma.jdbc.JdbcMappingFunction; @@ -29,6 +32,10 @@ import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.query.AliasManager; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; import org.seasar.doma.jdbc.type.AbstractResultSetType; import org.seasar.doma.jdbc.type.JdbcType; import org.seasar.doma.jdbc.type.JdbcTypes; @@ -173,6 +180,11 @@ public ScriptBlockContext createScriptBlockContext() { return new Oracle11ScriptBlockContext(); } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return new Oracle11CriteriaBuilder(); + } + public static class OracleResultSetType extends AbstractResultSetType { protected static int CURSOR = -10; @@ -398,4 +410,49 @@ protected Oracle11ScriptBlockContext() { sqlBlockStartKeywordsList.add(Arrays.asList("begin")); } } + + public static class Oracle11CriteriaBuilder extends StandardCriteriaBuilder { + @Override + public void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager) { + option.accept( + new ForUpdateOption.Visitor() { + + @Override + public void visit(ForUpdateOption.Basic basic) { + buf.appendSql(" for update"); + of(basic.propertyMetamodels); + } + + @Override + public void visit(ForUpdateOption.NoWait noWait) { + buf.appendSql(" for update"); + of(noWait.propertyMetamodels); + buf.appendSql(" nowait"); + } + + @Override + public void visit(ForUpdateOption.Wait wait) { + buf.appendSql(" for update"); + of(wait.propertyMetamodels); + buf.appendSql(" wait "); + buf.appendSql(String.valueOf(wait.second)); + } + + private void of(List> propertyMetamodels) { + if (!propertyMetamodels.isEmpty()) { + buf.appendSql(" of "); + for (PropertyMetamodel p : propertyMetamodels) { + column.accept(p); + buf.appendSql(", "); + } + buf.cutBackSql(2); + } + } + }); + } + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java index 3f9b3183b..5e25285b6 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/PostgresDialect.java @@ -4,11 +4,16 @@ import java.sql.SQLException; import java.sql.Types; import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; import java.util.function.Function; import org.seasar.doma.DomaNullPointerException; import org.seasar.doma.expr.ExpressionFunctions; import org.seasar.doma.internal.jdbc.dialect.PostgresForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.PostgresPagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.internal.jdbc.util.DatabaseObjectUtil; import org.seasar.doma.jdbc.InParameter; import org.seasar.doma.jdbc.JdbcMappingVisitor; @@ -20,6 +25,10 @@ import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.query.AliasManager; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; import org.seasar.doma.jdbc.type.AbstractResultSetType; import org.seasar.doma.jdbc.type.JdbcType; @@ -242,6 +251,11 @@ public ScriptBlockContext createScriptBlockContext() { return new PostgresScriptBlockContext(); } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return new PostgresCriteriaBuilder(); + } + public static class PostgresResultSetType extends AbstractResultSetType { public PostgresResultSetType() { @@ -284,4 +298,52 @@ public boolean isInBlock() { return inBlock; } } + + public static class PostgresCriteriaBuilder extends StandardCriteriaBuilder { + @Override + public void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager) { + option.accept( + new ForUpdateOption.Visitor() { + + @Override + public void visit(ForUpdateOption.Basic basic) { + buf.appendSql(" for update"); + of(basic.propertyMetamodels); + } + + @Override + public void visit(ForUpdateOption.NoWait noWait) { + buf.appendSql(" for update"); + of(noWait.propertyMetamodels); + buf.appendSql(" nowait"); + } + + @Override + public void visit(ForUpdateOption.Wait wait) { + buf.appendSql(" for update"); + of(wait.propertyMetamodels); + } + + private void of(List> propertyMetamodels) { + Set aliases = new LinkedHashSet<>(); + for (PropertyMetamodel p : propertyMetamodels) { + String alias = aliasManager.getAlias(p); + aliases.add(alias); + } + if (!aliases.isEmpty()) { + buf.appendSql(" of "); + for (String alias : aliases) { + buf.appendSql(alias); + buf.appendSql(", "); + } + buf.cutBackSql(2); + } + } + }); + } + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/StandardDialect.java b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/StandardDialect.java index fceb53122..9b01c7266 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/StandardDialect.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/dialect/StandardDialect.java @@ -14,6 +14,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.seasar.doma.DomaNullPointerException; @@ -21,6 +22,7 @@ import org.seasar.doma.internal.jdbc.dialect.StandardCountGettingTransformer; import org.seasar.doma.internal.jdbc.dialect.StandardForUpdateTransformer; import org.seasar.doma.internal.jdbc.dialect.StandardPagingTransformer; +import org.seasar.doma.internal.jdbc.sql.PreparedSqlBuilder; import org.seasar.doma.internal.util.AssertionUtil; import org.seasar.doma.internal.util.CharSequenceUtil; import org.seasar.doma.jdbc.JdbcException; @@ -38,6 +40,10 @@ import org.seasar.doma.jdbc.SqlLogFormattingFunction; import org.seasar.doma.jdbc.SqlLogFormattingVisitor; import org.seasar.doma.jdbc.SqlNode; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.option.ForUpdateOption; +import org.seasar.doma.jdbc.criteria.query.AliasManager; +import org.seasar.doma.jdbc.criteria.query.CriteriaBuilder; import org.seasar.doma.jdbc.id.AutoGeneratedKeysType; import org.seasar.doma.jdbc.type.EnumType; import org.seasar.doma.jdbc.type.JdbcType; @@ -83,6 +89,8 @@ public class StandardDialect implements Dialect { protected static final Set UNIQUE_CONSTRAINT_VIOLATION_STATE_CODES = new HashSet(Arrays.asList("23", "27", "44")); + private static final CriteriaBuilder CRITERIA_SQL_BUILDER = new StandardCriteriaBuilder(); + /** the visitor that maps {@link Wrapper} to {@link JdbcType} */ protected final JdbcMappingVisitor jdbcMappingVisitor; @@ -394,6 +402,11 @@ public AutoGeneratedKeysType getAutoGeneratedKeysType() { return AutoGeneratedKeysType.DEFAULT; } + @Override + public CriteriaBuilder getCriteriaBuilder() { + return CRITERIA_SQL_BUILDER; + } + public static class StandardJdbcMappingVisitor implements JdbcMappingVisitor { @Override @@ -1054,4 +1067,61 @@ public boolean isInBlock() { return inBlock; } } + + public static class StandardCriteriaBuilder implements CriteriaBuilder { + + @Override + public void concat(PreparedSqlBuilder buf, Runnable leftOperand, Runnable rightOperand) { + buf.appendSql("concat("); + leftOperand.run(); + buf.appendSql(", "); + rightOperand.run(); + buf.appendSql(")"); + } + + @Override + public void offsetAndFetch(PreparedSqlBuilder buf, int offset, int limit) { + buf.appendSql(" offset "); + buf.appendSql(Integer.toString(offset)); + buf.appendSql(" rows"); + if (limit > 0) { + buf.appendSql(" fetch first "); + buf.appendSql(Integer.toString(limit)); + buf.appendSql(" rows only"); + } + } + + @Override + public void lockWithTableHint( + PreparedSqlBuilder buf, ForUpdateOption option, Consumer> column) {} + + @Override + public void forUpdate( + PreparedSqlBuilder buf, + ForUpdateOption option, + Consumer> column, + AliasManager aliasManager) { + option.accept( + new ForUpdateOption.Visitor() { + @Override + public void visit(ForUpdateOption.Basic basic) { + appendSql(); + } + + @Override + public void visit(ForUpdateOption.NoWait noWait) { + appendSql(); + } + + @Override + public void visit(ForUpdateOption.Wait wait) { + appendSql(); + } + + private void appendSql() { + buf.appendSql(" for update"); + } + }); + } + } } diff --git a/doma-core/src/main/java/org/seasar/doma/jdbc/entity/EmbeddedPropertyType.java b/doma-core/src/main/java/org/seasar/doma/jdbc/entity/EmbeddedPropertyType.java index e5aaa78f0..0308fe317 100644 --- a/doma-core/src/main/java/org/seasar/doma/jdbc/entity/EmbeddedPropertyType.java +++ b/doma-core/src/main/java/org/seasar/doma/jdbc/entity/EmbeddedPropertyType.java @@ -2,6 +2,7 @@ import static java.util.stream.Collectors.toMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -35,7 +36,14 @@ public EmbeddedPropertyType( this.embeddablePropertyTypes = embeddablePropertyType; this.embeddablePropertyTypeMap = this.embeddablePropertyTypes.stream() - .collect(toMap(EntityPropertyType::getName, Function.identity())); + .collect( + toMap( + EntityPropertyType::getName, + Function.identity(), + (u, v) -> { + throw new IllegalStateException(String.format("Duplicate key %s", u)); + }, + LinkedHashMap::new)); this.field = new PropertyField<>(name, entityClass); } diff --git a/doma-core/src/main/java/org/seasar/doma/message/Message.java b/doma-core/src/main/java/org/seasar/doma/message/Message.java index dce7cbe0d..0636e13c3 100644 --- a/doma-core/src/main/java/org/seasar/doma/message/Message.java +++ b/doma-core/src/main/java/org/seasar/doma/message/Message.java @@ -915,6 +915,7 @@ public enum Message implements MessageResource { + "The data type and its enclosing type must be a top level or member class."), DOMA4453("The public constructor whose parameter size is one is not found."), DOMA4454("The parameter type \"{0}\" is not supported as a persistent type."), + DOMA4455("The combination of the prefix=\"{0}\" and the suffix=\"\" is not allowed."), // other DOMA5001( @@ -930,9 +931,11 @@ public enum Message implements MessageResource { + "Ensure that you have passed it to the from, the innerJoin, or the leftJoin method before invoking the associate method. " + "If the innerJoin or leftJoin method call is optional, pass the AssociationKind.OPTIONAL value to the associate method."), DOMA6002( - "The propertyDef \"{0}\" is unknown. Ensure that you have passed it to the select method."), - DOMA6003("The table alias is not found for the entityDef \"{0}\"."), - DOMA6004("The column alias is not found for the propertyDef \"{0}\"."), + "The propertyMetamodel \"{0}\" is unknown. Ensure that you have passed it to the select method."), + DOMA6003("The table alias is not found for the entityMetamodel \"{0}\"."), + DOMA6004( + "The column alias is not found for the propertyMetamodel \"{0}\". " + + "Ensure that you have passed its entityMetamodel to the from, the innerJoin, or the leftJoin method."), DOMA6005("The method \"{0}\" is not found."), DOMA6006( "Empty where clause is not allowed by default. To allow it, enable the \"allowEmptyWhere\" setting. SQL=[{0}]"), diff --git a/doma-core/src/test/java/org/seasar/doma/internal/ClassNamesTest.java b/doma-core/src/test/java/org/seasar/doma/internal/ClassNamesTest.java index e16704366..c93eb6a08 100644 --- a/doma-core/src/test/java/org/seasar/doma/internal/ClassNamesTest.java +++ b/doma-core/src/test/java/org/seasar/doma/internal/ClassNamesTest.java @@ -47,27 +47,15 @@ void newExternalDomainTypClassName() { @Test void newEntityDefClassNameBuilder() { - ClassName className = ClassNames.newEntityDefClassNameBuilder(getClass().getName(), "P", "S"); - assertEquals("org.seasar.doma.internal.PClassNamesTestS", className.toString()); - } - - @Test - void newEntityDefClassNameBuilder_withDefaultValues() { - ClassName className = ClassNames.newEntityDefClassNameBuilder(getClass().getName(), "", "_"); - assertEquals("org.seasar.doma.internal.ClassNamesTest_", className.toString()); - } - - @Test - void newEmbeddableDefClassNameBuilder() { ClassName className = - ClassNames.newEmbeddableDefClassNameBuilder(getClass().getName(), "P", "S"); + ClassNames.newEntityMetamodelClassNameBuilder(getClass().getName(), "P", "S"); assertEquals("org.seasar.doma.internal.PClassNamesTestS", className.toString()); } @Test - void newEmbeddableDefClassNameBuilder_withDefaultValues() { + void newEntityDefClassNameBuilder_withDefaultValues() { ClassName className = - ClassNames.newEmbeddableDefClassNameBuilder(getClass().getName(), "", "_"); + ClassNames.newEntityMetamodelClassNameBuilder(getClass().getName(), "", "_"); assertEquals("org.seasar.doma.internal.ClassNamesTest_", className.toString()); } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/AggregateFunctionsTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/AggregateFunctionsTest.java deleted file mode 100644 index c1db487c3..000000000 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/AggregateFunctionsTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.seasar.doma.jdbc.criteria; - -import static org.junit.jupiter.api.Assertions.*; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.avg; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.count; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.max; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.min; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.sum; - -import org.junit.jupiter.api.Test; -import org.seasar.doma.jdbc.criteria.entity.Emp_; - -class AggregateFunctionsTest { - - private final Emp_ e = new Emp_(); - - @Test - void testAvg() { - assertEquals(avg(e.id), avg(e.id)); - assertNotEquals(avg(e.id), avg(e.name)); - assertNotEquals(avg(e.id), max(e.id)); - - assertEquals("avg", avg(e.id).getName()); - assertEquals(e.id, count(e.id).argument()); - } - - @Test - void testCount() { - assertEquals(count(e.id), count(e.id)); - assertNotEquals(count(e.id), count(e.name)); - assertNotEquals(count(e.id), max(e.id)); - - assertEquals("count", count(e.id).getName()); - assertEquals(e.id, count(e.id).argument()); - } - - @Test - void testCount_noArg() { - assertEquals(count(), count()); - assertNotEquals(count(), max(e.id)); - - assertEquals("count", count().getName()); - assertEquals("*", count().argument().getName()); - } - - @Test - void testMax() { - assertEquals(max(e.id), max(e.id)); - assertNotEquals(max(e.id), max(e.name)); - assertNotEquals(max(e.id), min(e.id)); - - assertEquals("max", max(e.id).getName()); - assertEquals(e.id, max(e.id).argument()); - } - - @Test - void testMin() { - assertEquals(min(e.id), min(e.id)); - assertNotEquals(min(e.id), min(e.name)); - assertNotEquals(min(e.id), avg(e.id)); - - assertEquals("min", min(e.id).getName()); - assertEquals(e.id, min(e.id).argument()); - } - - @Test - void testSum() { - assertEquals(sum(e.id), sum(e.id)); - assertNotEquals(sum(e.id), sum(e.name)); - assertNotEquals(sum(e.id), min(e.id)); - - assertEquals("sum", sum(e.id).getName()); - assertEquals(e.id, sum(e.id).argument()); - } -} diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchDeleteTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchDeleteTest.java index 52c28fd13..0d0fad655 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchDeleteTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchDeleteTest.java @@ -4,13 +4,12 @@ import java.math.BigDecimal; import java.util.Collections; -import java.util.List; import org.junit.jupiter.api.Test; import org.seasar.doma.internal.jdbc.mock.MockConfig; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlBatchDeleteTest { @@ -25,16 +24,33 @@ void test() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement> stmt = entityql.delete(e, Collections.singletonList(emp)); + Buildable stmt = entityql.delete(e, Collections.singletonList(emp)); Sql sql = stmt.asSql(); assertEquals("delete from EMP where ID = 1 and VERSION = 1", sql.getFormattedSql()); } + @Test + void ignoreVersion() { + Emp emp = new Emp(); + emp.setId(1); + emp.setName("aaa"); + emp.setSalary(new BigDecimal("1000")); + emp.setVersion(1); + + Emp_ e = new Emp_(); + Buildable stmt = + entityql.delete( + e, Collections.singletonList(emp), settings -> settings.setIgnoreVersion(true)); + + Sql sql = stmt.asSql(); + assertEquals("delete from EMP where ID = 1", sql.getFormattedSql()); + } + @Test void empty() { Emp_ e = new Emp_(); - Statement> stmt = entityql.delete(e, Collections.emptyList()); + Buildable stmt = entityql.delete(e, Collections.emptyList()); Sql sql = stmt.asSql(); assertEquals("This SQL is empty because target entities are empty.", sql.getFormattedSql()); diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchInsertTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchInsertTest.java index 9263f7e7b..a672f2a70 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchInsertTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchInsertTest.java @@ -4,13 +4,12 @@ import java.math.BigDecimal; import java.util.Collections; -import java.util.List; import org.junit.jupiter.api.Test; import org.seasar.doma.internal.jdbc.mock.MockConfig; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlBatchInsertTest { @@ -25,7 +24,7 @@ void insertInto() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement> stmt = entityql.insert(e, Collections.singletonList(emp)); + Buildable stmt = entityql.insert(e, Collections.singletonList(emp)); Sql sql = stmt.asSql(); assertEquals( @@ -36,7 +35,7 @@ void insertInto() { @Test void empty() { Emp_ e = new Emp_(); - Statement> stmt = entityql.insert(e, Collections.emptyList()); + Buildable stmt = entityql.insert(e, Collections.emptyList()); Sql sql = stmt.asSql(); assertEquals("This SQL is empty because target entities are empty.", sql.getFormattedSql()); diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchUpdateTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchUpdateTest.java index 7bd0adab3..3e6f4ff03 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchUpdateTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlBatchUpdateTest.java @@ -4,13 +4,12 @@ import java.math.BigDecimal; import java.util.Collections; -import java.util.List; import org.junit.jupiter.api.Test; import org.seasar.doma.internal.jdbc.mock.MockConfig; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlBatchUpdateTest { @@ -25,7 +24,7 @@ void test() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement> stmt = entityql.update(e, Collections.singletonList(emp)); + Buildable stmt = entityql.update(e, Collections.singletonList(emp)); Sql sql = stmt.asSql(); assertEquals( @@ -33,10 +32,29 @@ void test() { sql.getFormattedSql()); } + @Test + void ignoreVersion() { + Emp emp = new Emp(); + emp.setId(1); + emp.setName("aaa"); + emp.setSalary(new BigDecimal("1000")); + emp.setVersion(1); + + Emp_ e = new Emp_(); + Buildable stmt = + entityql.update( + e, Collections.singletonList(emp), setting -> setting.setIgnoreVersion(true)); + + Sql sql = stmt.asSql(); + assertEquals( + "update EMP set NAME = 'aaa', SALARY = 1000, VERSION = 1 where ID = 1", + sql.getFormattedSql()); + } + @Test void empty() { Emp_ e = new Emp_(); - Statement> stmt = entityql.update(e, Collections.emptyList()); + Buildable stmt = entityql.update(e, Collections.emptyList()); Sql sql = stmt.asSql(); assertEquals("This SQL is empty because target entities are empty.", sql.getFormattedSql()); diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlDeleteTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlDeleteTest.java index 2f7a347d6..79c672abe 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlDeleteTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlDeleteTest.java @@ -8,7 +8,7 @@ import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlDeleteTest { @@ -23,9 +23,24 @@ void test() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement stmt = entityql.delete(e, emp); + Buildable stmt = entityql.delete(e, emp); Sql sql = stmt.asSql(); assertEquals("delete from EMP where ID = 1 and VERSION = 1", sql.getFormattedSql()); } + + @Test + void ignoreVersion() { + Emp emp = new Emp(); + emp.setId(1); + emp.setName("aaa"); + emp.setSalary(new BigDecimal("1000")); + emp.setVersion(1); + + Emp_ e = new Emp_(); + Buildable stmt = entityql.delete(e, emp, settings -> settings.setIgnoreVersion(true)); + + Sql sql = stmt.asSql(); + assertEquals("delete from EMP where ID = 1", sql.getFormattedSql()); + } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlInsertTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlInsertTest.java index b3d9853bc..de75c33a7 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlInsertTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlInsertTest.java @@ -8,7 +8,7 @@ import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlInsertTest { @@ -23,7 +23,7 @@ void insertInto() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement stmt = entityql.insert(e, emp); + Buildable stmt = entityql.insert(e, emp); Sql sql = stmt.asSql(); assertEquals( diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlSelectTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlSelectTest.java index daccbd42c..d69c12b4d 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlSelectTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlSelectTest.java @@ -117,7 +117,7 @@ void associate_optional() { entityql .from(e) .innerJoin(d, on -> {}) - .associate(e, d, (emp, dept) -> {}, AssociationOption.OPTIONAL); + .associate(e, d, (emp, dept) -> {}, AssociationOption.optional()); Sql sql = stmt.asSql(); assertEquals( @@ -161,7 +161,7 @@ void limit() { Sql sql = stmt.asSql(); assertEquals( - "select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ limit 5", + "select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ offset 0 rows fetch first 5 rows only", sql.getFormattedSql()); } @@ -182,7 +182,7 @@ void offset() { Sql sql = stmt.asSql(); assertEquals( - "select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ offset 5", + "select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ offset 5 rows", sql.getFormattedSql()); } @@ -208,9 +208,9 @@ void distinct() { } @Test - void distinct_enabled() { + void distinct_basic() { Emp_ e = new Emp_(); - Statement> stmt = entityql.from(e).distinct(DistinctOption.ENABLED); + Statement> stmt = entityql.from(e).distinct(DistinctOption.basic()); Sql sql = stmt.asSql(); assertEquals( @@ -219,9 +219,9 @@ void distinct_enabled() { } @Test - void distinct_disabled() { + void distinct_none() { Emp_ e = new Emp_(); - Statement> stmt = entityql.from(e).distinct(DistinctOption.DISABLED); + Statement> stmt = entityql.from(e).distinct(DistinctOption.none()); Sql sql = stmt.asSql(); assertEquals( diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlUpdateTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlUpdateTest.java index 912d68cef..e65019d85 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlUpdateTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/EntityqlUpdateTest.java @@ -8,7 +8,7 @@ import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.criteria.entity.Emp; import org.seasar.doma.jdbc.criteria.entity.Emp_; -import org.seasar.doma.jdbc.criteria.statement.Statement; +import org.seasar.doma.jdbc.criteria.statement.Buildable; class EntityqlUpdateTest { @@ -23,11 +23,28 @@ void test() { emp.setVersion(1); Emp_ e = new Emp_(); - Statement stmt = entityql.update(e, emp); + Buildable stmt = entityql.update(e, emp); Sql sql = stmt.asSql(); assertEquals( "update EMP set NAME = 'aaa', SALARY = 1000, VERSION = 1 + 1 where ID = 1 and VERSION = 1", sql.getFormattedSql()); } + + @Test + void ignoreVersion() { + Emp emp = new Emp(); + emp.setId(1); + emp.setName("aaa"); + emp.setSalary(new BigDecimal("1000")); + emp.setVersion(1); + + Emp_ e = new Emp_(); + Buildable stmt = entityql.update(e, emp, settings -> settings.setIgnoreVersion(true)); + + Sql sql = stmt.asSql(); + assertEquals( + "update EMP set NAME = 'aaa', SALARY = 1000, VERSION = 1 where ID = 1", + sql.getFormattedSql()); + } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlInsertTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlInsertTest.java index 0cfcbc7db..d416b19c2 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlInsertTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlInsertTest.java @@ -13,7 +13,7 @@ class NativeSqlInsertTest { private final NativeSql nativeSql = new NativeSql(new MockConfig()); @Test - void insertInto() { + void insert() { Emp_ e = new Emp_(); Statement stmt = nativeSql @@ -31,4 +31,27 @@ void insertInto() { "insert into EMP (ID, NAME, SALARY, VERSION) values (99, 'aaa', null, 1)", sql.getFormattedSql()); } + + @Test + void insert_select_entity() { + Emp_ e = new Emp_(); + Statement stmt = nativeSql.insert(e).select(c -> c.from(e).select()); + + Sql sql = stmt.asSql(); + assertEquals( + "insert into EMP (ID, NAME, SALARY, VERSION) select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_", + sql.getFormattedSql()); + } + + @Test + void insert_select_properties() { + Emp_ e = new Emp_(); + Statement stmt = + nativeSql.insert(e).select(c -> c.from(e).select(e.id, e.name, e.salary, e.version)); + + Sql sql = stmt.asSql(); + assertEquals( + "insert into EMP (ID, NAME, SALARY, VERSION) select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_", + sql.getFormattedSql()); + } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java index 61e9a4343..6288edbd3 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlSelectTest.java @@ -1,11 +1,14 @@ package org.seasar.doma.jdbc.criteria; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.avg; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.count; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.max; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.min; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.sum; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.count; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.countDistinct; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.literal; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.max; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.min; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.sum; import java.math.BigDecimal; import java.util.Arrays; @@ -27,6 +30,12 @@ import org.seasar.doma.jdbc.criteria.statement.SetOperand; import org.seasar.doma.jdbc.criteria.statement.Statement; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; +import org.seasar.doma.jdbc.dialect.Db2Dialect; +import org.seasar.doma.jdbc.dialect.Dialect; +import org.seasar.doma.jdbc.dialect.Mssql2008Dialect; +import org.seasar.doma.jdbc.dialect.MssqlDialect; +import org.seasar.doma.jdbc.dialect.OracleDialect; +import org.seasar.doma.jdbc.dialect.PostgresDialect; class NativeSqlSelectTest { @@ -193,18 +202,29 @@ void where_like() { void where_like_escape() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.ESCAPE)).select(e.id); + nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.escape())).select(e.id); Sql sql = stmt.asSql(); assertEquals( "select t0_.ID from EMP t0_ where t0_.NAME like 'a$$' escape '$'", sql.getFormattedSql()); } + @Test + void where_like_escape_escapeChar() { + Emp_ e = new Emp_(); + Buildable stmt = + nativeSql.from(e).where(c -> c.like(e.name, "a¥", LikeOption.escape('¥'))).select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ where t0_.NAME like 'a¥¥' escape '¥'", sql.getFormattedSql()); + } + @Test void where_like_prefix() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.PREFIX)).select(e.id); + nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.prefix())).select(e.id); Sql sql = stmt.asSql(); assertEquals( @@ -215,7 +235,7 @@ void where_like_prefix() { void where_like_infix() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.INFIX)).select(e.id); + nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.infix())).select(e.id); Sql sql = stmt.asSql(); assertEquals( @@ -226,7 +246,7 @@ void where_like_infix() { void where_like_suffix() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.SUFFIX)).select(e.id); + nativeSql.from(e).where(c -> c.like(e.name, "a$", LikeOption.suffix())).select(e.id); Sql sql = stmt.asSql(); assertEquals( @@ -637,7 +657,8 @@ void limit() { Buildable stmt = nativeSql.from(e).limit(10).select(e.id); Sql sql = stmt.asSql(); - assertEquals("select t0_.ID from EMP t0_ limit 10", sql.getFormattedSql()); + assertEquals( + "select t0_.ID from EMP t0_ offset 0 rows fetch first 10 rows only", sql.getFormattedSql()); } @Test @@ -655,7 +676,7 @@ void offset() { Buildable stmt = nativeSql.from(e).offset(10).select(e.id); Sql sql = stmt.asSql(); - assertEquals("select t0_.ID from EMP t0_ offset 10", sql.getFormattedSql()); + assertEquals("select t0_.ID from EMP t0_ offset 10 rows", sql.getFormattedSql()); } @Test @@ -677,18 +698,169 @@ void forUpdate() { } @Test - void forUpdate_nowait() { + void forUpdate_db2() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new Db2Dialect(); + } + }); + + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).where(c -> c.eq(e.id, 1)).forUpdate().select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ where t0_.ID = 1 for update with rs", sql.getFormattedSql()); + } + + @Test + void forUpdate_mssql() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new MssqlDialect(); + } + }); + Emp_ e = new Emp_(); - Buildable stmt = nativeSql.from(e).forUpdate(ForUpdateOption.NOWAIT).select(e.id); + Buildable stmt = nativeSql.from(e).where(c -> c.eq(e.id, 1)).forUpdate().select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ with (updlock, rowlock) where t0_.ID = 1", + sql.getFormattedSql()); + } + + @Test + void forUpdate_mssql_nowait() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new MssqlDialect(); + } + }); + + Emp_ e = new Emp_(); + Buildable stmt = + nativeSql + .from(e) + .where(c -> c.eq(e.id, 1)) + .forUpdate(ForUpdateOption.noWait()) + .select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ with (updlock, rowlock, nowait) where t0_.ID = 1", + sql.getFormattedSql()); + } + + @Test + void forUpdate_oracle_nowait() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new OracleDialect(); + } + }); + + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).forUpdate(ForUpdateOption.noWait()).select(e.id); Sql sql = stmt.asSql(); assertEquals("select t0_.ID from EMP t0_ for update nowait", sql.getFormattedSql()); } @Test - void forUpdate_disabled() { + void forUpdate_oracle_nowait_withColumn() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new OracleDialect(); + } + }); + Emp_ e = new Emp_(); - Buildable stmt = nativeSql.from(e).forUpdate(ForUpdateOption.DISABLED).select(e.id); + Dept_ d = new Dept_(); + Buildable stmt = + nativeSql + .from(e) + .innerJoin(d, on -> on.eq(e.id, d.id)) + .forUpdate(ForUpdateOption.noWait(e.id, d.id)) + .select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ inner join CATA.DEPT t1_ on (t0_.ID = t1_.ID) for update of t0_.ID, t1_.ID nowait", + sql.getFormattedSql()); + } + + @Test + void forUpdate_oracle_wait_withColumn() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new OracleDialect(); + } + }); + + Emp_ e = new Emp_(); + Dept_ d = new Dept_(); + Buildable stmt = + nativeSql + .from(e) + .innerJoin(d, on -> on.eq(e.id, d.id)) + .forUpdate(ForUpdateOption.wait(5, e.id, d.id)) + .select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ inner join CATA.DEPT t1_ on (t0_.ID = t1_.ID) for update of t0_.ID, t1_.ID wait 5", + sql.getFormattedSql()); + } + + @Test + void forUpdate_postgres_nowait_withTable() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new PostgresDialect(); + } + }); + + Emp_ e = new Emp_(); + Dept_ d = new Dept_(); + Buildable stmt = + nativeSql + .from(e) + .innerJoin(d, on -> on.eq(e.id, d.id)) + .forUpdate(ForUpdateOption.noWait(e.id, d.id)) + .select(e.id); + + Sql sql = stmt.asSql(); + assertEquals( + "select t0_.ID from EMP t0_ inner join CATA.DEPT t1_ on (t0_.ID = t1_.ID) for update of t0_, t1_ nowait", + sql.getFormattedSql()); + } + + @Test + void forUpdate_none() { + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).forUpdate(ForUpdateOption.none()).select(e.id); Sql sql = stmt.asSql(); assertEquals("select t0_.ID from EMP t0_", sql.getFormattedSql()); @@ -762,6 +934,15 @@ void aggregateFunctions() { sql.getFormattedSql()); } + @Test + void aggregateFunction_countDistinct() { + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).select(countDistinct(e.id)); + + Sql sql = stmt.asSql(); + assertEquals("select count(distinct t0_.ID) from EMP t0_", sql.getFormattedSql()); + } + @Test void union() { Emp_ e = new Emp_(); @@ -907,10 +1088,10 @@ void distinct() { } @Test - void distinct_enabled() { + void distinct_normal() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).distinct(DistinctOption.ENABLED).where(c -> c.eq(e.name, "a")); + nativeSql.from(e).distinct(DistinctOption.basic()).where(c -> c.eq(e.name, "a")); Sql sql = stmt.asSql(); assertEquals( "select distinct t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ where t0_.NAME = 'a'", @@ -918,13 +1099,54 @@ void distinct_enabled() { } @Test - void distinct_disabled() { + void distinct_none() { Emp_ e = new Emp_(); Buildable stmt = - nativeSql.from(e).distinct(DistinctOption.DISABLED).where(c -> c.eq(e.name, "a")); + nativeSql.from(e).distinct(DistinctOption.none()).where(c -> c.eq(e.name, "a")); Sql sql = stmt.asSql(); assertEquals( "select t0_.ID, t0_.NAME, t0_.SALARY, t0_.VERSION from EMP t0_ where t0_.NAME = 'a'", sql.getFormattedSql()); } + + @Test + void expression_concat() { + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).select(concat(e.name, "a")); + Sql sql = stmt.asSql(); + assertEquals("select concat(t0_.NAME, 'a') from EMP t0_", sql.getFormattedSql()); + } + + @Test + void expression_concat_mssql2008() { + NativeSql nativeSql = + new NativeSql( + new MockConfig() { + @Override + public Dialect getDialect() { + return new Mssql2008Dialect(); + } + }); + + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).select(concat(e.name, "a")); + Sql sql = stmt.asSql(); + assertEquals("select (t0_.NAME + 'a') from EMP t0_", sql.getFormattedSql()); + } + + @Test + void expression_stringLiteral() { + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).select(literal("a")); + Sql sql = stmt.asSql(); + assertEquals("select 'a' from EMP t0_", sql.getRawSql()); + } + + @Test + void expression_intLiteral() { + Emp_ e = new Emp_(); + Buildable stmt = nativeSql.from(e).select(literal(123)); + Sql sql = stmt.asSql(); + assertEquals("select 123 from EMP t0_", sql.getRawSql()); + } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlUpdateTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlUpdateTest.java index efa82ff92..ee0163dbe 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlUpdateTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/NativeSqlUpdateTest.java @@ -22,7 +22,7 @@ void set() { .set( c -> { c.value(e.name, "bbb"); - c.value(e.salary, null); + c.value(e.salary, (BigDecimal) null); }); Sql sql = stmt.asSql(); diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/command/EntityKeyTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/command/EntityKeyTest.java index e912129c2..e1ad18850 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/command/EntityKeyTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/command/EntityKeyTest.java @@ -6,13 +6,13 @@ import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.Test; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; class EntityKeyTest { - private final EntityDefImpl entityDef = new EntityDefImpl(); + private final EntityMetamodelImpl entityDef = new EntityMetamodelImpl(); @Test void testEquals() { @@ -83,7 +83,7 @@ void testNotEquals_notEquals() { assertNotEquals(key1.hashCode(), key2.hashCode()); } - static class EntityDefImpl implements EntityDef { + static class EntityMetamodelImpl implements EntityMetamodel { @Override public EntityType asType() { @@ -91,7 +91,7 @@ public EntityType asType() { } @Override - public List> allPropertyDefs() { + public List> allPropertyMetamodels() { return null; } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Dept_.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Dept_.java index c78b2d8d7..bc55d3d00 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Dept_.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Dept_.java @@ -2,25 +2,26 @@ import java.util.Arrays; import java.util.List; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; -public class Dept_ implements EntityDef { +public class Dept_ implements EntityMetamodel { private final _Dept entityType = new _Dept(); - public final PropertyDef id = new DefaultPropertyDef<>(Integer.class, entityType, "id"); + public final PropertyMetamodel id = + new DefaultPropertyMetamodel<>(Integer.class, entityType, "id"); - public final PropertyDef name = - new DefaultPropertyDef<>(String.class, entityType, "name"); + public final PropertyMetamodel name = + new DefaultPropertyMetamodel<>(String.class, entityType, "name"); public _Dept asType() { return entityType; } @Override - public List> allPropertyDefs() { + public List> allPropertyMetamodels() { return Arrays.asList(id, name); } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Emp_.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Emp_.java index 3459f5948..da1cb5fd2 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Emp_.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/Emp_.java @@ -3,31 +3,32 @@ import java.math.BigDecimal; import java.util.Arrays; import java.util.List; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; -public class Emp_ implements EntityDef { +public class Emp_ implements EntityMetamodel { private final _Emp entityType = new _Emp(); - public final PropertyDef id = new DefaultPropertyDef<>(Integer.class, entityType, "id"); + public final PropertyMetamodel id = + new DefaultPropertyMetamodel<>(Integer.class, entityType, "id"); - public final PropertyDef name = - new DefaultPropertyDef<>(String.class, entityType, "name"); + public final PropertyMetamodel name = + new DefaultPropertyMetamodel<>(String.class, entityType, "name"); - public final PropertyDef salary = - new DefaultPropertyDef<>(BigDecimal.class, entityType, "salary"); + public final PropertyMetamodel salary = + new DefaultPropertyMetamodel<>(BigDecimal.class, entityType, "salary"); - public final PropertyDef version = - new DefaultPropertyDef<>(Integer.class, entityType, "version"); + public final PropertyMetamodel version = + new DefaultPropertyMetamodel<>(Integer.class, entityType, "version"); public _Emp asType() { return entityType; } @Override - public List> allPropertyDefs() { + public List> allPropertyMetamodels() { return Arrays.asList(id, name, salary, version); } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/NoIdEmp_.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/NoIdEmp_.java index 3b956be33..a5a1602ef 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/NoIdEmp_.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/entity/NoIdEmp_.java @@ -3,31 +3,32 @@ import java.math.BigDecimal; import java.util.Arrays; import java.util.List; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; -public class NoIdEmp_ implements EntityDef { +public class NoIdEmp_ implements EntityMetamodel { private final _NoIdEmp entityType = new _NoIdEmp(); - public final PropertyDef id = new DefaultPropertyDef<>(Integer.class, entityType, "id"); + public final PropertyMetamodel id = + new DefaultPropertyMetamodel<>(Integer.class, entityType, "id"); - public final PropertyDef name = - new DefaultPropertyDef<>(String.class, entityType, "name"); + public final PropertyMetamodel name = + new DefaultPropertyMetamodel<>(String.class, entityType, "name"); - public final PropertyDef salary = - new DefaultPropertyDef<>(BigDecimal.class, entityType, "salary"); + public final PropertyMetamodel salary = + new DefaultPropertyMetamodel<>(BigDecimal.class, entityType, "salary"); - public final PropertyDef version = - new DefaultPropertyDef<>(Integer.class, entityType, "version"); + public final PropertyMetamodel version = + new DefaultPropertyMetamodel<>(Integer.class, entityType, "version"); public _NoIdEmp asType() { return entityType; } @Override - public List> allPropertyDefs() { + public List> allPropertyMetamodels() { return Arrays.asList(id, name, salary, version); } } diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/expression/ExpressionsTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/expression/ExpressionsTest.java new file mode 100644 index 000000000..22a489a80 --- /dev/null +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/expression/ExpressionsTest.java @@ -0,0 +1,139 @@ +package org.seasar.doma.jdbc.criteria.expression; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.add; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.avg; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.count; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.div; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.literal; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.max; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.min; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.mod; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.mul; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.sub; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.sum; + +import org.junit.jupiter.api.Test; +import org.seasar.doma.DomaIllegalArgumentException; +import org.seasar.doma.jdbc.criteria.entity.Emp_; + +class ExpressionsTest { + + private final Emp_ e = new Emp_(); + + @Test + void testStringLiteral() { + assertEquals(literal("abc"), literal("abc")); + assertNotEquals(literal("abc"), literal("def")); + } + + @Test + void testStringLiteral_contains_single_quotation() { + DomaIllegalArgumentException ex = + assertThrows(DomaIllegalArgumentException.class, () -> literal("ab'c")); + System.out.println(ex.getMessage()); + } + + @Test + void testIntLiteral() { + assertEquals(literal(1), literal(1)); + assertNotEquals(literal(1), literal(2)); + } + + @Test + void testAdd() { + assertEquals(add(e.id, 1), add(e.id, 1)); + assertNotEquals(add(e.id, 1), add(e.id, 2)); + } + + @Test + void testSub() { + assertEquals(sub(e.id, 1), sub(e.id, 1)); + assertNotEquals(sub(e.id, 1), sub(e.id, 2)); + } + + @Test + void testMul() { + assertEquals(mul(e.id, 1), mul(e.id, 1)); + assertNotEquals(mul(e.id, 1), mul(e.id, 2)); + } + + @Test + void testDiv() { + assertEquals(div(e.id, 1), div(e.id, 1)); + assertNotEquals(div(e.id, 1), div(e.id, 2)); + } + + @Test + void testMod() { + assertEquals(mod(e.id, 1), mod(e.id, 1)); + } + + @Test + void testConcat() { + assertEquals(concat(e.name, "a"), concat(e.name, "a")); + assertNotEquals(concat(e.name, "a"), concat(e.name, "b")); + } + + @Test + void testAvg() { + assertEquals(avg(e.id), avg(e.id)); + assertNotEquals(avg(e.id), avg(e.name)); + assertNotEquals(avg(e.id), max(e.id)); + + assertEquals("avg", avg(e.id).getName()); + assertEquals(e.id, count(e.id).argument()); + } + + @Test + void testCount() { + assertEquals(count(e.id), count(e.id)); + assertNotEquals(count(e.id), count(e.name)); + assertNotEquals(count(e.id), max(e.id)); + + assertEquals("count", count(e.id).getName()); + assertEquals(e.id, count(e.id).argument()); + } + + @Test + void testCount_noArg() { + assertEquals(count(), count()); + assertNotEquals(count(), max(e.id)); + + assertEquals("count", count().getName()); + assertEquals("*", count().argument().getName()); + } + + @Test + void testMax() { + assertEquals(max(e.id), max(e.id)); + assertNotEquals(max(e.id), max(e.name)); + assertNotEquals(max(e.id), min(e.id)); + + assertEquals("max", max(e.id).getName()); + assertEquals(e.id, max(e.id).argument()); + } + + @Test + void testMin() { + assertEquals(min(e.id), min(e.id)); + assertNotEquals(min(e.id), min(e.name)); + assertNotEquals(min(e.id), avg(e.id)); + + assertEquals("min", min(e.id).getName()); + assertEquals(e.id, min(e.id).argument()); + } + + @Test + void testSum() { + assertEquals(sum(e.id), sum(e.id)); + assertNotEquals(sum(e.id), sum(e.name)); + assertNotEquals(sum(e.id), min(e.id)); + + assertEquals("sum", sum(e.id).getName()); + assertEquals(e.id, sum(e.id).argument()); + } +} diff --git a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/query/AliasManagerTest.java b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/query/AliasManagerTest.java index f03272adf..0f017378a 100644 --- a/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/query/AliasManagerTest.java +++ b/doma-core/src/test/java/org/seasar/doma/jdbc/criteria/query/AliasManagerTest.java @@ -5,11 +5,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.seasar.doma.jdbc.criteria.context.Context; -import org.seasar.doma.jdbc.criteria.context.Criterion; import org.seasar.doma.jdbc.criteria.context.Settings; -import org.seasar.doma.jdbc.criteria.def.EntityDef; import org.seasar.doma.jdbc.criteria.entity.Dept_; import org.seasar.doma.jdbc.criteria.entity.Emp_; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; class AliasManagerTest { private Emp_ e = new Emp_(); @@ -19,25 +18,15 @@ class AliasManagerTest { private static class ContextImpl implements Context { - private final List> entityDefs; + private final List> entityMetamodels; - public ContextImpl(List> entityDefs) { - this.entityDefs = entityDefs; + public ContextImpl(List> entityMetamodels) { + this.entityMetamodels = entityMetamodels; } @Override - public List> getEntityDefs() { - return entityDefs; - } - - @Override - public List getWhere() { - throw new UnsupportedOperationException(); - } - - @Override - public void setWhere(List where) { - throw new UnsupportedOperationException(); + public List> getEntityMetamodels() { + return entityMetamodels; } @Override diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java index 32e3e4e86..f766c80ea 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreElements.java @@ -267,6 +267,18 @@ public ExecutableElement getNoArgConstructor(TypeElement typeElement) { return null; } + public Map getValuesWithoutDefaults(AnnotationMirror annotationMirror) { + assertNotNull(annotationMirror); + Map map = new HashMap<>(); + for (Map.Entry entry : + annotationMirror.getElementValues().entrySet()) { + String key = entry.getKey().getSimpleName().toString(); + AnnotationValue value = entry.getValue(); + map.put(key, value); + } + return Collections.unmodifiableMap(map); + } + public Map getValuesWithDefaults(AnnotationMirror annotationMirror) { assertNotNull(annotationMirror); Map map = new HashMap<>(); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreTypes.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreTypes.java index 259f28355..4390a1b47 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreTypes.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/MoreTypes.java @@ -160,7 +160,12 @@ public TypeElement toTypeElement(TypeMirror typeMirror) { if (element == null) { return null; } - return ctx.getMoreElements().toTypeElement(element); + TypeElement typeElement = ctx.getMoreElements().toTypeElement(element); + if (typeElement == null) { + return null; + } + // workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=544288 + return ctx.getMoreElements().getTypeElement(typeElement.getQualifiedName()); } public DeclaredType toDeclaredType(TypeMirror typeMirror) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/Options.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/Options.java index 5d7b8f18a..793b63257 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/Options.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/Options.java @@ -20,11 +20,11 @@ public final class Options { public static final String TEST = "doma.test"; - public static final String CRITERIA_ENABLED = "doma.criteria.enabled"; + public static final String METAMODEL_ENABLED = "doma.metamodel.enabled"; - public static final String CRITERIA_PREFIX = "doma.criteria.prefix"; + public static final String METAMODEL_PREFIX = "doma.metamodel.prefix"; - public static final String CRITERIA_SUFFIX = "doma.criteria.suffix"; + public static final String METAMODEL_SUFFIX = "doma.metamodel.suffix"; public static final String DEBUG = "doma.debug"; @@ -78,19 +78,19 @@ public String getVersion() { return Artifact.getVersion(); } - public boolean isCriteriaEnabled() { - String enabled = getOption(CRITERIA_ENABLED); - return enabled != null ? Boolean.valueOf(enabled) : true; + public boolean isMetamodelEnabled() { + String enabled = getOption(METAMODEL_ENABLED); + return enabled != null ? Boolean.valueOf(enabled) : false; } - public String getCriteriaPrefix() { - String prefix = getOption(CRITERIA_PREFIX); - return prefix != null ? prefix : Constants.DEFAULT_CRITERIA_PREFIX; + public String getMetamodelPrefix() { + String prefix = getOption(METAMODEL_PREFIX); + return prefix != null ? prefix : Constants.DEFAULT_METAMODEL_PREFIX; } - public String getCriteriaSuffix() { - String suffix = getOption(CRITERIA_SUFFIX); - return suffix != null ? suffix : Constants.DEFAULT_CRITERIA_SUFFIX; + public String getMetamodelSuffix() { + String suffix = getOption(METAMODEL_SUFFIX); + return suffix != null ? suffix : Constants.DEFAULT_METAMODEL_SUFFIX; } public Date getDate() { @@ -211,9 +211,9 @@ private Map loadProperties(FileObject config) throws IOException public static class Constants { - public static final String DEFAULT_CRITERIA_PREFIX = ""; + public static final String DEFAULT_METAMODEL_PREFIX = ""; - public static final String DEFAULT_CRITERIA_SUFFIX = "_"; + public static final String DEFAULT_METAMODEL_SUFFIX = "_"; public static final String DEFAULT_DAO_SUFFIX = "Impl"; diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java index 85de8a956..09ca10a86 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/Annotations.java @@ -6,12 +6,41 @@ import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; -import javax.lang.model.element.*; -import org.seasar.doma.*; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import org.seasar.doma.AnnotateWith; +import org.seasar.doma.ArrayFactory; +import org.seasar.doma.BatchDelete; +import org.seasar.doma.BatchInsert; +import org.seasar.doma.BatchUpdate; +import org.seasar.doma.BlobFactory; +import org.seasar.doma.ClobFactory; +import org.seasar.doma.Column; +import org.seasar.doma.Dao; +import org.seasar.doma.Delete; +import org.seasar.doma.Domain; +import org.seasar.doma.DomainConverters; +import org.seasar.doma.Embeddable; +import org.seasar.doma.Entity; +import org.seasar.doma.Insert; +import org.seasar.doma.NClobFactory; +import org.seasar.doma.Procedure; +import org.seasar.doma.ResultSet; +import org.seasar.doma.SQLXMLFactory; +import org.seasar.doma.Script; +import org.seasar.doma.Select; +import org.seasar.doma.SequenceGenerator; +import org.seasar.doma.SingletonConfig; import org.seasar.doma.Sql; +import org.seasar.doma.SqlProcessor; +import org.seasar.doma.Table; +import org.seasar.doma.TableGenerator; +import org.seasar.doma.Update; import org.seasar.doma.experimental.DataType; -import org.seasar.doma.internal.EmbeddableDesc; -import org.seasar.doma.internal.EntityDesc; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.util.AnnotationValueUtil; @@ -125,22 +154,38 @@ public DeleteAnnot newDeleteAnnot(ExecutableElement method) { public EmbeddableAnnot newEmbeddableAnnot(TypeElement typeElement) { assertNotNull(typeElement); - return newInstance(typeElement, Embeddable.class, EmbeddableAnnot::new); - } - - public EmbeddableDescAnnot newEmbeddableDescAnnot(TypeElement typeElement) { - assertNotNull(typeElement); - return newInstance(typeElement, EmbeddableDesc.class, EmbeddableDescAnnot::new); + AnnotationMirror embeddableMirror = + ctx.getMoreElements().getAnnotationMirror(typeElement, Embeddable.class); + Map valuesWithoutDefaults = + ctx.getMoreElements().getValuesWithoutDefaults(embeddableMirror); + AnnotationValue metamodel = valuesWithoutDefaults.get(EmbeddableAnnot.METAMODEL); + MetamodelAnnot metamodelAnnot = null; + if (metamodel != null) { + AnnotationMirror metamodelMirror = AnnotationValueUtil.toAnnotation(metamodel); + if (metamodelMirror != null) { + metamodelAnnot = newMetamodelAnnot(metamodelMirror); + } + } + return new EmbeddableAnnot(embeddableMirror, metamodelAnnot); } public EntityAnnot newEntityAnnot(TypeElement typeElement) { assertNotNull(typeElement); - return newInstance(typeElement, Entity.class, EntityAnnot::new); - } - - public EntityDescAnnot newEntityDescAnnot(TypeElement typeElement) { - assertNotNull(typeElement); - return newInstance(typeElement, EntityDesc.class, EntityDescAnnot::new); + AnnotationMirror entityMirror = + ctx.getMoreElements().getAnnotationMirror(typeElement, Entity.class); + Map valuesWithoutDefaults = + ctx.getMoreElements().getValuesWithoutDefaults(entityMirror); + AnnotationValue metamodel = valuesWithoutDefaults.get(EntityAnnot.METAMODEL); + MetamodelAnnot metamodelAnnot = null; + if (metamodel != null) { + AnnotationMirror metamodelMirror = AnnotationValueUtil.toAnnotation(metamodel); + if (metamodelMirror != null) { + metamodelAnnot = newMetamodelAnnot(metamodelMirror); + } + } + Map valuesWithDefaults = + ctx.getMoreElements().getValuesWithDefaults(entityMirror); + return new EntityAnnot(entityMirror, metamodelAnnot, valuesWithDefaults); } public FunctionAnnot newFunctionAnnot(final ExecutableElement method) { @@ -157,6 +202,11 @@ public InsertAnnot newInsertAnnot(ExecutableElement method) { return newInstance(method, Insert.class, InsertAnnot::new); } + public MetamodelAnnot newMetamodelAnnot(AnnotationMirror annotationMirror) { + assertNotNull(annotationMirror); + return newInstance(annotationMirror, MetamodelAnnot::new); + } + public NClobFactoryAnnot newNClobFactoryAnnot(ExecutableElement method) { assertNotNull(method); return newInstance(method, NClobFactory.class, NClobFactoryAnnot::new); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableAnnot.java index df8b98dca..bbc1c2a31 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableAnnot.java @@ -4,7 +4,16 @@ public class EmbeddableAnnot extends AbstractAnnot { - EmbeddableAnnot(AnnotationMirror annotationMirror) { + static final String METAMODEL = "metamodel"; + + private final MetamodelAnnot metamodelAnnot; + + EmbeddableAnnot(AnnotationMirror annotationMirror, MetamodelAnnot metamodelAnnot) { super(annotationMirror); + this.metamodelAnnot = metamodelAnnot; + } + + public MetamodelAnnot getMetamodelValue() { + return metamodelAnnot; } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableDescAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableDescAnnot.java deleted file mode 100644 index 4f52af7a6..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EmbeddableDescAnnot.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.seasar.doma.internal.apt.annot; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; - -import java.util.Map; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; - -public class EmbeddableDescAnnot extends AbstractAnnot { - - private static final String VALUE = "value"; - - private final AnnotationValue value; - - EmbeddableDescAnnot(AnnotationMirror annotationMirror, Map values) { - super(annotationMirror); - this.value = assertNonNullValue(values, VALUE); - } - - public AnnotationValue getValue() { - return value; - } - - public TypeMirror getValueValue() { - TypeMirror result = AnnotationValueUtil.toType(value); - if (result == null) { - throw new AptIllegalStateException(VALUE); - } - return result; - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityAnnot.java index bd28bc97a..ec5a50ef2 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityAnnot.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityAnnot.java @@ -1,6 +1,6 @@ package org.seasar.doma.internal.apt.annot; -import static org.seasar.doma.internal.util.AssertionUtil.*; +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; import java.util.Map; import javax.lang.model.element.AnnotationMirror; @@ -19,17 +19,25 @@ public class EntityAnnot extends AbstractAnnot { private static final String IMMUTABLE = "immutable"; + static final String METAMODEL = "metamodel"; + private final AnnotationValue listener; private final AnnotationValue naming; private final AnnotationValue immutable; - EntityAnnot(AnnotationMirror annotationMirror, Map values) { + private final MetamodelAnnot metamodelAnnot; + + EntityAnnot( + AnnotationMirror annotationMirror, + MetamodelAnnot metamodelAnnot, + Map values) { super(annotationMirror); this.listener = assertNonNullValue(values, LISTENER); this.naming = assertNonNullValue(values, NAMING); this.immutable = assertNonNullValue(values, IMMUTABLE); + this.metamodelAnnot = metamodelAnnot; } public AnnotationValue getListener() { @@ -67,4 +75,8 @@ public boolean getImmutableValue() { } return result.booleanValue(); } + + public MetamodelAnnot getMetamodelValue() { + return metamodelAnnot; + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityDescAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityDescAnnot.java deleted file mode 100644 index a9736ca46..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/EntityDescAnnot.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.seasar.doma.internal.apt.annot; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; - -import java.util.Map; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.util.AnnotationValueUtil; - -public class EntityDescAnnot extends AbstractAnnot { - - private static final String VALUE = "value"; - - private final AnnotationValue value; - - EntityDescAnnot(AnnotationMirror annotationMirror, Map values) { - super(annotationMirror); - this.value = assertNonNullValue(values, VALUE); - } - - public AnnotationValue getValue() { - return value; - } - - public TypeMirror getValueValue() { - TypeMirror result = AnnotationValueUtil.toType(value); - if (result == null) { - throw new AptIllegalStateException(VALUE); - } - return result; - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java new file mode 100644 index 000000000..c85760f27 --- /dev/null +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/annot/MetamodelAnnot.java @@ -0,0 +1,50 @@ +package org.seasar.doma.internal.apt.annot; + +import static org.seasar.doma.internal.util.AssertionUtil.assertNonNullValue; + +import java.util.Map; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import org.seasar.doma.internal.apt.AptIllegalStateException; +import org.seasar.doma.internal.apt.util.AnnotationValueUtil; + +public class MetamodelAnnot extends AbstractAnnot { + + private static final String PREFIX = "prefix"; + + private static final String SUFFIX = "suffix"; + + private final AnnotationValue prefix; + + private final AnnotationValue suffix; + + MetamodelAnnot(AnnotationMirror annotationMirror, Map values) { + super(annotationMirror); + this.prefix = assertNonNullValue(values, PREFIX); + this.suffix = assertNonNullValue(values, SUFFIX); + } + + public AnnotationValue getPrefix() { + return prefix; + } + + public AnnotationValue getSuffix() { + return suffix; + } + + public String getPrefixValue() { + String value = AnnotationValueUtil.toString(prefix); + if (value == null) { + throw new AptIllegalStateException(PREFIX); + } + return value; + } + + public String getSuffixValue() { + String value = AnnotationValueUtil.toString(suffix); + if (value == null) { + throw new AptIllegalStateException(SUFFIX); + } + return value; + } +} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/AbstractCtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/AbstractCtType.java index 6fe62e8ad..8f7e7701b 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/AbstractCtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/AbstractCtType.java @@ -74,4 +74,9 @@ public boolean isTypevar() { public boolean isSameType(CtType other) { return ctx.getMoreTypes().isSameTypeWithErasure(type, other.getType()); } + + @Override + public boolean hasTypeParameter() { + return typeElement != null && !typeElement.getTypeParameters().isEmpty(); + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/BasicCtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/BasicCtType.java index 8d80de0c8..27909b303 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/BasicCtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/BasicCtType.java @@ -34,6 +34,17 @@ public Code getWrapperSupplierCode() { }); } + public Code getWrapperCode() { + return new Code( + p -> { + if (isEnum()) { + p.print("new %1$s(%2$s.class)", wrapperType, getQualifiedName()); + } else { + p.print("new %1$s()", wrapperType); + } + }); + } + @Override public R accept(CtTypeVisitor visitor, P p) throws TH { return visitor.visitBasicCtType(this, p); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtType.java index 2a174b2e8..8ccbfd5bc 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtType.java @@ -22,5 +22,7 @@ public interface CtType { boolean isSameType(CtType ctType); + boolean hasTypeParameter(); + R accept(CtTypeVisitor visitor, P p) throws TH; } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java index 4f36fe7a2..9c3392a42 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/CtTypes.java @@ -190,8 +190,8 @@ public DomainCtType newDomainCtType(TypeMirror type) { return null; } Name name = ctx.getNames().createExternalDomainName(type); - ClassName descClassName = ClassNames.newExternalDomainTypeClassName(name); - return new DomainCtType(ctx, type, basicCtType, Collections.emptyList(), descClassName); + ClassName typeClassName = ClassNames.newExternalDomainTypeClassName(name); + return new DomainCtType(ctx, type, basicCtType, Collections.emptyList(), typeClassName); } TypeElement typeElement = ctx.getMoreTypes().toTypeElement(type); @@ -216,14 +216,14 @@ public DomainCtType newDomainCtType(TypeMirror type) { .map(__ -> typeArgs.hasNext() ? newCtType(typeArgs.next()) : newNoneCtType()) .collect(toList()); Name binaryName = ctx.getMoreElements().getBinaryName(typeElement); - ClassName descClassName; + ClassName typeClassName; if (info.external) { Name name = ctx.getNames().createExternalDomainName(type); - descClassName = ClassNames.newExternalDomainTypeClassName(name); + typeClassName = ClassNames.newExternalDomainTypeClassName(name); } else { - descClassName = ClassNames.newDomainTypeClassName(binaryName); + typeClassName = ClassNames.newDomainTypeClassName(binaryName); } - return new DomainCtType(ctx, type, basicCtType, typeArgCtTypes, descClassName); + return new DomainCtType(ctx, type, basicCtType, typeArgCtTypes, typeClassName); } private DomainInfo getDomainInfo(TypeElement typeElement) { @@ -348,8 +348,8 @@ private EmbeddableCtType newEmbeddableCtType(TypeMirror type) { return null; } Name binaryName = ctx.getMoreElements().getBinaryName(typeElement); - ClassName descClassName = ClassNames.newEmbeddableTypeClassName(binaryName); - return new EmbeddableCtType(ctx, type, descClassName); + ClassName typeClassName = ClassNames.newEmbeddableTypeClassName(binaryName); + return new EmbeddableCtType(ctx, type, typeClassName); } private EntityCtType newEntityCtType(TypeMirror type) { @@ -362,9 +362,9 @@ private EntityCtType newEntityCtType(TypeMirror type) { return null; } Name binaryName = ctx.getMoreElements().getBinaryName(typeElement); - ClassName descClassName = ClassNames.newEntityTypeClassName(binaryName); + ClassName typeClassName = ClassNames.newEntityTypeClassName(binaryName); boolean immutable = ElementKindUtil.isRecord(typeElement.getKind()) || entity.immutable(); - return new EntityCtType(ctx, type, immutable, descClassName); + return new EntityCtType(ctx, type, immutable, typeClassName); } private FunctionCtType newFunctionCtType(TypeMirror type) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/DomainCtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/DomainCtType.java index 7cd2d9eb7..b2455e26f 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/DomainCtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/DomainCtType.java @@ -15,19 +15,19 @@ public class DomainCtType extends AbstractCtType { private final List typeArgCtTypes; - private final ClassName descClassName; + private final ClassName typeClassName; DomainCtType( Context ctx, TypeMirror type, BasicCtType basicCtType, List typeArgCtTypes, - ClassName descClassName) { + ClassName typeClassName) { super(ctx, type); - assertNotNull(basicCtType, typeArgCtTypes, descClassName); + assertNotNull(basicCtType, typeArgCtTypes, typeClassName); this.basicCtType = basicCtType; this.typeArgCtTypes = typeArgCtTypes; - this.descClassName = descClassName; + this.typeClassName = typeClassName; } public BasicCtType getBasicCtType() { @@ -46,15 +46,15 @@ public boolean hasTypevar() { return typeArgCtTypes.stream().anyMatch(CtType::isTypevar); } - public Code getDescCode() { + public Code getTypeCode() { return new Code( p -> { if (typeArgCtTypes.isEmpty()) { - p.print("%1$s.getSingletonInternal()", descClassName); + p.print("%1$s.getSingletonInternal()", typeClassName); } else { List typeArgs = typeArgCtTypes.stream().map(CtType::getType).collect(toList()); - p.print("%1$s.<%2$s>getSingletonInternal()", descClassName, typeArgs); + p.print("%1$s.<%2$s>getSingletonInternal()", typeClassName, typeArgs); } }); } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EmbeddableCtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EmbeddableCtType.java index 6c1ee810b..584903a66 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EmbeddableCtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EmbeddableCtType.java @@ -9,16 +9,16 @@ public class EmbeddableCtType extends AbstractCtType { - private final ClassName descClassName; + private final ClassName typeClassName; - EmbeddableCtType(Context ctx, TypeMirror type, ClassName descClassName) { + EmbeddableCtType(Context ctx, TypeMirror type, ClassName typeClassName) { super(ctx, type); - assertNotNull(descClassName); - this.descClassName = descClassName; + assertNotNull(typeClassName); + this.typeClassName = typeClassName; } - public Code getDescCode() { - return new Code(p -> p.print("%1$s.getSingletonInternal()", descClassName)); + public Code getTypeCode() { + return new Code(p -> p.print("%1$s.getSingletonInternal()", typeClassName)); } @Override diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EntityCtType.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EntityCtType.java index 7051babd7..59aa8796d 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EntityCtType.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/cttype/EntityCtType.java @@ -12,13 +12,13 @@ public class EntityCtType extends AbstractCtType { private final boolean immutable; - private final ClassName descClassName; + private final ClassName typeClassName; - EntityCtType(Context ctx, TypeMirror type, boolean immutable, ClassName descClassName) { + EntityCtType(Context ctx, TypeMirror type, boolean immutable, ClassName typeClassName) { super(ctx, type); - assertNotNull(descClassName); + assertNotNull(typeClassName); this.immutable = immutable; - this.descClassName = descClassName; + this.typeClassName = typeClassName; } public boolean isImmutable() { @@ -29,8 +29,8 @@ public boolean isAbstract() { return typeElement.getModifiers().contains(Modifier.ABSTRACT); } - public Code getDescCode() { - return new Code(p -> p.print("%1$s.getSingletonInternal()", descClassName)); + public Code getTypeCode() { + return new Code(p -> p.print("%1$s.getSingletonInternal()", typeClassName)); } @Override diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/DaoImplMethodGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/DaoImplMethodGenerator.java index efafe1d3e..a73a382d5 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/DaoImplMethodGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/DaoImplMethodGenerator.java @@ -94,7 +94,7 @@ public Void visitSqlFileSelectQueryMeta(final SqlFileSelectQueryMeta m) { iprint("__query.setOptions(%1$s);%n", m.getSelectOptionsParameterName()); } if (m.getEntityCtType() != null) { - iprint("__query.setEntityType(%1$s);%n", m.getEntityCtType().getDescCode()); + iprint("__query.setEntityType(%1$s);%n", m.getEntityCtType().getTypeCode()); } printAddParameterStatements(m.getParameterMetas()); @@ -193,7 +193,7 @@ public Void visitAutoModifyQueryMeta(AutoModifyQueryMeta m) { "%1$s<%2$s> __query = getQueryImplementors().create%4$s(%5$s, %3$s);%n", /* 1 */ m.getQueryClass().getName(), /* 2 */ m.getEntityCtType().getType(), - /* 3 */ m.getEntityCtType().getDescCode(), + /* 3 */ m.getEntityCtType().getTypeCode(), /* 4 */ m.getQueryClass().getSimpleName(), /* 5 */ methodName); iprint("__query.setMethod(%1$s);%n", methodName); @@ -284,7 +284,7 @@ public Void visitSqlFileModifyQueryMeta(SqlFileModifyQueryMeta m) { "__query.setEntityAndEntityType(\"%1$s\", %2$s, %3$s);%n", m.getEntityParameterName(), m.getEntityParameterName(), - m.getEntityCtType().getDescCode()); + m.getEntityCtType().getTypeCode()); } Boolean excludeNull = m.getExcludeNull(); @@ -353,7 +353,7 @@ public Void visitAutoBatchModifyQueryMeta(AutoBatchModifyQueryMeta m) { "%1$s<%2$s> __query = getQueryImplementors().create%4$s(%5$s, %3$s);%n", /* 1 */ m.getQueryClass().getName(), /* 2 */ m.getEntityCtType().getType(), - /* 3 */ m.getEntityCtType().getDescCode(), + /* 3 */ m.getEntityCtType().getTypeCode(), /* 4 */ m.getQueryClass().getSimpleName(), /* 5 */ methodName); iprint("__query.setMethod(%1$s);%n", methodName); @@ -436,7 +436,7 @@ public Void visitSqlFileBatchModifyQueryMeta(SqlFileBatchModifyQueryMeta m) { iprint("__query.setSqlLogType(%1$s.%2$s);%n", m.getSqlLogType().getClass(), m.getSqlLogType()); if (m.getEntityType() != null) { - iprint("__query.setEntityType(%1$s);%n", m.getEntityType().getDescCode()); + iprint("__query.setEntityType(%1$s);%n", m.getEntityType().getTypeCode()); } Boolean ignoreVersion = m.getIgnoreVersion(); @@ -853,7 +853,7 @@ public Void visitDomainListParameterMeta(DomainListParameterMeta m, AutoModuleQu /* 1 */ DomainListParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -865,7 +865,7 @@ public Void visitEntityListParameterMeta(EntityListParameterMeta m, AutoModuleQu "__query.addParameter(new %1$s<%2$s>(%3$s, %4$s, \"%4$s\", %5$s));%n", /* 1 */ EntityListParameter.class, /* 2 */ entityCtType.getType(), - /* 3 */ entityCtType.getDescCode(), + /* 3 */ entityCtType.getTypeCode(), /* 4 */ m.getName(), /* 5 */ m.getEnsureResultMapping()); return null; @@ -905,7 +905,7 @@ public Void visitDomainInOutParameterMeta(DomainInOutParameterMeta m, AutoModule /* 1 */ DomainInOutParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -931,7 +931,7 @@ public Void visitDomainOutParameterMeta(DomainOutParameterMeta m, AutoModuleQuer /* 1 */ DomainOutParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -957,7 +957,7 @@ public Void visitDomainInParameterMeta(DomainInParameterMeta m, AutoModuleQueryM /* 1 */ DomainInParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -984,7 +984,7 @@ public Void visitDomainResultListParameterMeta( /* 1 */ DomainResultListParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode()); + /* 4 */ domainCtType.getTypeCode()); return null; } @@ -996,7 +996,7 @@ public Void visitEntityResultListParameterMeta( "__query.setResultParameter(new %1$s<%2$s>(%3$s, %4$s));%n", /* 1 */ EntityResultListParameter.class, /* 2 */ entityCtType.getType(), - /* 3 */ entityCtType.getDescCode(), + /* 3 */ entityCtType.getTypeCode(), /* 4 */ m.getEnsureResultMapping()); return null; } @@ -1035,7 +1035,7 @@ public Void visitDomainSingleResultParameterMeta( /* 1 */ DomainSingleResultParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode()); + /* 4 */ domainCtType.getTypeCode()); return null; } @@ -1125,7 +1125,7 @@ public Void visitOptionalDomainInParameterMeta( /* 1 */ OptionalDomainInParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -1140,7 +1140,7 @@ public Void visitOptionalDomainOutParameterMeta( /* 1 */ OptionalDomainOutParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -1155,7 +1155,7 @@ public Void visitOptionalDomainInOutParameterMeta( /* 1 */ OptionalDomainInOutParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -1170,7 +1170,7 @@ public Void visitOptionalDomainListParameterMeta( /* 1 */ OptionalDomainListParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode(), + /* 4 */ domainCtType.getTypeCode(), /* 5 */ m.getName()); return null; } @@ -1185,7 +1185,7 @@ public Void visitOptionalDomainSingleResultParameterMeta( /* 1 */ OptionalDomainSingleResultParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode()); + /* 4 */ domainCtType.getTypeCode()); return null; } @@ -1199,7 +1199,7 @@ public Void visitOptionalDomainResultListParameterMeta( /* 1 */ OptionalDomainResultListParameter.class, /* 2 */ basicCtType.getBoxedType(), /* 3 */ domainCtType.getType(), - /* 4 */ domainCtType.getDescCode()); + /* 4 */ domainCtType.getTypeCode()); return null; } @@ -1446,7 +1446,7 @@ public Void visitDomainCtType(DomainCtType ctType, Boolean optional) { /* 2 */ resultBoxedType, /* 3 */ getDomainStreamHandler(optional), /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ functionParamName, /* 7 */ commandName, /* 8 */ methodName, @@ -1478,7 +1478,7 @@ public Void visitEntityCtType(EntityCtType ctType, Boolean optional) { /* 2 */ resultBoxedType, /* 3 */ EntityStreamHandler.class, /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ functionParamName, /* 7 */ commandName, /* 8 */ methodName); @@ -1588,7 +1588,7 @@ public Void visitDomainCtType(DomainCtType ctType, Boolean optional) { /* 2 */ resultMeta.getBoxedType(), /* 3 */ getDomainCollectorHandler(optional), /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ collectorParamName, /* 7 */ commandName, /* 8 */ methodName, @@ -1620,7 +1620,7 @@ public Void visitEntityCtType(EntityCtType ctType, Boolean optional) { /* 2 */ resultMeta.getBoxedType(), /* 3 */ EntityCollectorHandler.class, /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ collectorParamName, /* 7 */ commandName, /* 8 */ methodName); @@ -1725,7 +1725,7 @@ public Void visitDomainCtType(DomainCtType ctType, Boolean optional) { /* 1 */ commandClass, /* 2 */ resultBoxedType, /* 3 */ getDomainSingleResultHandler(optional), - /* 4 */ ctType.getDescCode(), + /* 4 */ ctType.getTypeCode(), /* 5 */ ctType.getType(), /* 6 */ commandName, /* 7 */ methodName, @@ -1755,7 +1755,7 @@ public Void visitEntityCtType(EntityCtType ctType, Boolean optional) { /* 1 */ commandClass, /* 2 */ resultBoxedType, /* 3 */ getEntitySingleResultHandler(optional), - /* 4 */ ctType.getDescCode(), + /* 4 */ ctType.getTypeCode(), /* 5 */ ctType.getType(), /* 6 */ commandName, /* 7 */ methodName); @@ -1832,7 +1832,7 @@ public Void visitDomainCtType(DomainCtType ctType, Boolean optional) { /* 2 */ resultBoxedType, /* 3 */ getDomainResultListHandler(optional), /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ commandName, /* 7 */ methodName, /* 8 */ ctType.getBasicCtType().getBoxedType()); @@ -1862,7 +1862,7 @@ public Void visitEntityCtType(EntityCtType ctType, Boolean optional) { /* 2 */ resultBoxedType, /* 3 */ EntityResultListHandler.class, /* 4 */ ctType.getType(), - /* 5 */ ctType.getDescCode(), + /* 5 */ ctType.getTypeCode(), /* 6 */ commandName, /* 7 */ methodName); return null; diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableDefGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableMetamodelGenerator.java similarity index 53% rename from doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableDefGenerator.java rename to doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableMetamodelGenerator.java index c51af7161..8d07ac981 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableDefGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableMetamodelGenerator.java @@ -2,58 +2,38 @@ import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.cttype.CtType; -import org.seasar.doma.internal.apt.meta.entity.EmbeddableDescMeta; import org.seasar.doma.internal.apt.meta.entity.EmbeddableMeta; import org.seasar.doma.internal.apt.meta.entity.EmbeddablePropertyMeta; import org.seasar.doma.internal.util.Pair; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EmbeddableDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; import org.seasar.doma.jdbc.entity.EntityType; -public class EmbeddableDefGenerator extends AbstractGenerator { +public class EmbeddableMetamodelGenerator extends AbstractGenerator { private final EmbeddableMeta embeddableMeta; - private final ClassName embeddableTypeClassName; - - public EmbeddableDefGenerator( - Context ctx, ClassName className, Printer printer, EmbeddableDescMeta embeddableDescMeta) { + public EmbeddableMetamodelGenerator( + Context ctx, ClassName className, Printer printer, EmbeddableMeta embeddableMeta) { super(ctx, className, printer); - assertNotNull(embeddableDescMeta); - this.embeddableMeta = embeddableDescMeta.getEmbeddableMeta(); - TypeElement embeddableTypeElement = embeddableMeta.getTypeElement(); - Name binaryName = ctx.getMoreElements().getBinaryName(embeddableTypeElement); - embeddableTypeClassName = ClassNames.newEmbeddableTypeClassName(binaryName); + assertNotNull(embeddableMeta); + this.embeddableMeta = embeddableMeta; } @Override public void generate() { - printPackage(); printClass(); } - private void printPackage() { - if (!packageName.isEmpty()) { - iprint("package %1$s;%n", packageName); - iprint("%n"); - } - } - private void printClass() { iprint("/** */%n"); - printGenerated(); - iprint("public final class %1$s implements %2$s {%n", simpleName, EmbeddableDef.class); + iprint("public static final class Metamodel {%n"); print("%n"); indent(); - printValidateVersionStaticInitializer(); printFields(); printConstructor(); printMethods(); @@ -62,12 +42,14 @@ private void printClass() { } private void printFields() { - printAllPropertyDefsFields(); + printAllPropertyModelFields(); printPropertyDefFields(); } - private void printAllPropertyDefsFields() { - iprint("private final java.util.List<%1$s> __allPropertyDefs;%n", PropertyDef.class); + private void printAllPropertyModelFields() { + iprint( + "private final java.util.List<%1$s> __allPropertyMetamodels;%n", + PropertyMetamodel.class); print("%n"); } @@ -77,13 +59,13 @@ private void printPropertyDefFields() { Pair pair = p.getCtType().accept(visitor, null); iprint( "public final %1$s<%2$s> %3$s;%n", - /* 1 */ PropertyDef.class, /* 2 */ pair.snd, /* 3 */ p.getName()); + /* 1 */ PropertyMetamodel.class, /* 2 */ pair.snd, /* 3 */ p.getName()); print("%n"); } } private void printConstructor() { - iprint("public %1$s(%2$s entityType, String name) {%n", simpleName, EntityType.class); + iprint("public Metamodel(%1$s entityType, String name) {%n", EntityType.class); indent(); UnwrapOptionalVisitor visitor = new UnwrapOptionalVisitor(); for (EmbeddablePropertyMeta p : embeddableMeta.getEmbeddablePropertyMetas()) { @@ -91,31 +73,30 @@ private void printConstructor() { iprint( "this.%1$s = new %2$s<%3$s>(%4$s.class, entityType, name + \".%1$s\");%n", /* 1 */ p.getName(), - /* 2 */ DefaultPropertyDef.class, + /* 2 */ DefaultPropertyMetamodel.class, /* 3 */ pair.snd, /* 4 */ pair.fst.getQualifiedName()); } iprint( "java.util.List<%1$s> __list = new java.util.ArrayList<>(%2$s);%n", - PropertyDef.class, embeddableMeta.getEmbeddablePropertyMetas().size()); + PropertyMetamodel.class, embeddableMeta.getEmbeddablePropertyMetas().size()); for (EmbeddablePropertyMeta p : embeddableMeta.getEmbeddablePropertyMetas()) { iprint("__list.add(this.%1$s);%n", p.getName()); } - iprint("__allPropertyDefs = java.util.Collections.unmodifiableList(__list);%n"); + iprint("__allPropertyMetamodels = java.util.Collections.unmodifiableList(__list);%n"); unindent(); iprint("}%n"); print("%n"); } private void printMethods() { - printAllPropertyDefsMethod(); + printAllPropertyMetamodelsMethod(); } - private void printAllPropertyDefsMethod() { - iprint("@Override%n"); - iprint("public java.util.List<%1$s> allPropertyDefs() {%n", PropertyDef.class); + private void printAllPropertyMetamodelsMethod() { + iprint("public java.util.List<%1$s> allPropertyMetamodels() {%n", PropertyMetamodel.class); indent(); - iprint("return __allPropertyDefs;%n"); + iprint("return __allPropertyMetamodels;%n"); unindent(); iprint("}%n"); print("%n"); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableTypeGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableTypeGenerator.java index 6ba180b85..215ef117e 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableTypeGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EmbeddableTypeGenerator.java @@ -2,9 +2,11 @@ import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; -import java.util.*; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.EmbeddableDesc; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.generator.ScalarMetaFactory.ScalarMeta; import org.seasar.doma.internal.apt.meta.entity.EmbeddableMeta; @@ -42,7 +44,6 @@ private void printPackage() { private void printClass() { iprint("/** */%n"); printGenerated(); - printEmbeddableDesc(); iprint( "public final class %1$s implements %2$s<%3$s> {%n", /* 1 */ simpleName, /* 2 */ EmbeddableType.class, /* 3 */ embeddableMeta.getType()); @@ -51,14 +52,11 @@ private void printClass() { printValidateVersionStaticInitializer(); printFields(); printMethods(); + printNestedClass(); unindent(); iprint("}%n"); } - private void printEmbeddableDesc() { - iprint("@%1$s(%2$s.class)%n", EmbeddableDesc.class, embeddableMeta.getType()); - } - private void printFields() { printSingletonField(); } @@ -106,6 +104,10 @@ private void printGetEmbeddablePropertyTypesMethod() { } private void printNewEmbeddableMethod() { + if (embeddableMeta.getEmbeddablePropertyMetas().stream() + .anyMatch(p -> p.getCtType().hasTypeParameter())) { + iprint("@SuppressWarnings(\"unchecked\")%n"); + } iprint("@Override%n"); iprint( "public %1$s newEmbeddable(String embeddedPropertyName, %2$s> __args) {%n", @@ -141,4 +143,10 @@ private void printGetSingletonInternalMethod() { iprint("}%n"); print("%n"); } + + private void printNestedClass() { + EmbeddableMetamodelGenerator generator = + new EmbeddableMetamodelGenerator(ctx, className, printer, embeddableMeta); + generator.generate(); + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityDefGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java similarity index 52% rename from doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityDefGenerator.java rename to doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java index 428beab6a..d597a777a 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityDefGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityMetamodelGenerator.java @@ -10,28 +10,30 @@ import org.seasar.doma.internal.apt.AptIllegalStateException; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.cttype.CtType; -import org.seasar.doma.internal.apt.meta.entity.EntityDescMeta; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; import org.seasar.doma.internal.apt.meta.entity.EntityPropertyMeta; import org.seasar.doma.internal.util.Pair; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EntityDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EntityType; -public class EntityDefGenerator extends AbstractGenerator { +public class EntityMetamodelGenerator extends AbstractGenerator { private final EntityMeta entityMeta; - - private final ClassName entityTypeClassName; - - public EntityDefGenerator( - Context ctx, ClassName className, Printer printer, EntityDescMeta entityDescMeta) { + private final ClassName entityTypeName; + + public EntityMetamodelGenerator( + Context ctx, + ClassName className, + Printer printer, + EntityMeta entityMeta, + ClassName entityTypeName) { super(ctx, className, printer); - assertNotNull(entityDescMeta); - this.entityMeta = entityDescMeta.getEntityMeta(); - TypeElement entityTypeElement = entityMeta.getTypeElement(); - Name binaryName = ctx.getMoreElements().getBinaryName(entityTypeElement); - entityTypeClassName = ClassNames.newEntityTypeClassName(binaryName); + assertNotNull(entityMeta, entityTypeName); + this.entityMeta = entityMeta; + this.entityTypeName = entityTypeName; } @Override @@ -52,47 +54,70 @@ private void printClass() { printGenerated(); iprint( "public final class %1$s implements %2$s<%3$s> {%n", - /* 1 */ simpleName, /* 2 */ EntityDef.class, /* 3 */ entityMeta.getType()); + /* 1 */ simpleName, /* 2 */ EntityMetamodel.class, /* 3 */ entityMeta.getType()); print("%n"); indent(); printValidateVersionStaticInitializer(); printFields(); - printConstructor(); + printConstructors(); printMethods(); unindent(); iprint("}%n"); } private void printFields() { + printQualifiedTableNameField(); printEntityTypeField(); - printAllPropertyDefsFields(); + printAllPropertyMetamodelsFields(); printPropertyDefFields(); } private void printEntityTypeField() { - iprint("private final %1$s __entityType = %1$s.getSingletonInternal();%n", entityTypeClassName); + iprint("private final %1$s __entityType = %1$s.getSingletonInternal();%n", entityTypeName); print("%n"); } - private void printAllPropertyDefsFields() { - iprint("private final java.util.List<%1$s> __allPropertyDefs;%n", PropertyDef.class); + private void printAllPropertyMetamodelsFields() { + iprint( + "private final java.util.List<%1$s> __allPropertyMetamodels;%n", + PropertyMetamodel.class); print("%n"); } - private void printConstructor() { + private void printQualifiedTableNameField() { + iprint("private final String __qualifiedTableName;%n"); + print("%n"); + } + + private void printConstructors() { + printNoArgsConstructor(); + printOneArgConstructor(); + } + + private void printNoArgsConstructor() { iprint("public %1$s() {%n", simpleName); indent(); + iprint("this(\"\");%n"); + unindent(); + iprint("}%n"); + print("%n"); + } + + private void printOneArgConstructor() { + iprint("public %1$s(String qualifiedTableName) {%n", simpleName); + indent(); + iprint("this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName);%n"); iprint( "java.util.ArrayList<%1$s> __list = new java.util.ArrayList<>(%2$s);%n", - PropertyDef.class, entityMeta.getAllPropertyMetas().size()); + PropertyMetamodel.class, entityMeta.getAllPropertyMetas().size()); for (EntityPropertyMeta p : entityMeta.getAllPropertyMetas()) { if (p.isEmbedded()) { - iprint("__list.addAll(%1$s.allPropertyDefs());%n", p.getName()); + iprint("__list.addAll(%1$s.allPropertyMetamodels());%n", p.getName()); } else { iprint("__list.add(%1$s);%n", p.getName()); } } - iprint("__allPropertyDefs = java.util.Collections.unmodifiableList(__list);%n"); + iprint("__allPropertyMetamodels = java.util.Collections.unmodifiableList(__list);%n"); unindent(); iprint("}%n"); print("%n"); @@ -102,53 +127,55 @@ private void printPropertyDefFields() { UnwrapOptionalVisitor visitor = new UnwrapOptionalVisitor(); for (EntityPropertyMeta p : entityMeta.getAllPropertyMetas()) { if (p.isEmbedded()) { - ClassName className = createEmbeddableDefClassName(p); + ClassName className = createEmbeddableTypeClassName(p); iprint( - "public final %1$s %2$s = new %1$s(__entityType, \"%2$s\");%n", + "public final %1$s.Metamodel %2$s = new %1$s.Metamodel(__entityType, \"%2$s\");%n", /* 1 */ className, /* 2 */ p.getName()); } else { Pair pair = p.getCtType().accept(visitor, null); iprint( "public final %1$s<%2$s> %3$s = new %4$s<%2$s>(%5$s.class, __entityType, \"%3$s\");%n", - /* 1 */ PropertyDef.class, + /* 1 */ PropertyMetamodel.class, /* 2 */ pair.snd, /* 3 */ p.getName(), - /* 4 */ DefaultPropertyDef.class, + /* 4 */ DefaultPropertyMetamodel.class, /* 5 */ pair.fst.getQualifiedName()); } print("%n"); } } - private ClassName createEmbeddableDefClassName(EntityPropertyMeta p) { + private ClassName createEmbeddableTypeClassName(EntityPropertyMeta p) { TypeElement embeddableTypeElement = ctx.getMoreTypes().toTypeElement(p.getType()); if (embeddableTypeElement == null) { throw new AptIllegalStateException("embeddableTypeElement"); } Name binaryName = ctx.getMoreElements().getBinaryName(embeddableTypeElement); - String prefix = ctx.getOptions().getCriteriaPrefix(); - String suffix = ctx.getOptions().getCriteriaSuffix(); - return ClassNames.newEntityDefClassNameBuilder(binaryName, prefix, suffix); + return ClassNames.newEmbeddableTypeClassName(binaryName); } private void printMethods() { printAsTypeMethod(); - printAllPropertyDefsMethod(); + printAllPropertyMetamodelsMethod(); } private void printAsTypeMethod() { iprint("@Override%n"); - iprint("public %1$s asType() {%n", entityTypeClassName); - iprint(" return __entityType;%n"); + iprint("public %1$s<%2$s> asType() {%n", EntityType.class, entityMeta.getType()); + indent(); + iprint( + "return __qualifiedTableName.isEmpty() ? __entityType : new %1$s<>(__entityType, __qualifiedTableName);%n", + EntityTypeProxy.class); + unindent(); iprint("}%n"); print("%n"); } - private void printAllPropertyDefsMethod() { + private void printAllPropertyMetamodelsMethod() { iprint("@Override%n"); - iprint("public java.util.List<%1$s> allPropertyDefs() {%n", PropertyDef.class); + iprint("public java.util.List<%1$s> allPropertyMetamodels() {%n", PropertyMetamodel.class); indent(); - iprint("return __allPropertyDefs;%n"); + iprint("return __allPropertyMetamodels;%n"); unindent(); iprint("}%n"); print("%n"); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypeGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypeGenerator.java index 570859a04..ff1dab04e 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypeGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypeGenerator.java @@ -7,7 +7,6 @@ import java.util.function.BiFunction; import javax.lang.model.element.TypeElement; import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.EntityDesc; import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.cttype.CtType; import org.seasar.doma.internal.apt.cttype.EmbeddableCtType; @@ -22,6 +21,7 @@ import org.seasar.doma.internal.apt.meta.id.TableIdGeneratorMeta; import org.seasar.doma.jdbc.Naming; import org.seasar.doma.jdbc.entity.AbstractEntityType; +import org.seasar.doma.jdbc.entity.EmbeddedPropertyType; import org.seasar.doma.jdbc.entity.EntityPropertyType; import org.seasar.doma.jdbc.entity.GeneratedIdPropertyType; import org.seasar.doma.jdbc.entity.NamingType; @@ -63,7 +63,6 @@ private void printPackage() { private void printClass() { iprint("/** */%n"); printGenerated(); - printEntityDesc(); iprint( "public final class %1$s extends %2$s<%3$s> {%n", /* 1 */ simpleName, /* 2 */ AbstractEntityType.class, /* 3 */ entityMeta.getType()); @@ -78,16 +77,11 @@ private void printClass() { iprint("}%n"); } - private void printEntityDesc() { - iprint("@%1$s(%2$s.class)%n", EntityDesc.class, entityMeta.getType()); - } - private void printFields() { printSingletonField(); printOriginalStatesAccessorField(); printNamingTypeField(); printIdGeneratorField(); - printPropertyTypeFields(); printListenerSupplierField(); printImmutableField(); printCatalogNameField(); @@ -98,6 +92,7 @@ private void printFields() { printIdPropertyTypesField(); printEntityPropertyTypesField(); printEntityPropertyTypeMapField(); + printEmbeddedPropertyTypeMapField(); } private void printSingletonField() { @@ -127,15 +122,6 @@ private void printIdGeneratorField() { } } - private void printPropertyTypeFields() { - for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) { - EntityTypePropertyGenerator propertyGenerator = - new EntityTypePropertyGenerator(ctx, className, printer, entityMeta, pm); - propertyGenerator.generate(); - print("%n"); - } - } - private void printListenerSupplierField() { if (entityMeta.isGenericEntityListener()) { iprint( @@ -210,6 +196,16 @@ private void printEntityPropertyTypeMapField() { print("%n"); } + private void printEmbeddedPropertyTypeMapField() { + if (!entityMeta.hasEmbeddedProperties()) { + iprint("@SuppressWarnings(\"unused\")%n"); + } + iprint( + "private final java.util.Map> __embeddedPropertyTypeMap;%n", + EmbeddedPropertyType.class, entityMeta.getType()); + print("%n"); + } + private void printConstructor() { iprint("private %1$s() {%n", simpleName); iprint(" __listenerSupplier = () -> ListenerHolder.listener;%n"); @@ -228,30 +224,31 @@ private void printConstructor() { /* 2 */ entityMeta.getType(), /* 3 */ entityMeta.getAllPropertyMetas().size()); iprint( - " java.util.Map> __map = new java.util.HashMap<>(%3$s);%n", + " java.util.Map> __map = new java.util.LinkedHashMap<>(%3$s);%n", /* 1 */ EntityPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ entityMeta.getAllPropertyMetas().size()); - for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) { - if (pm.isEmbedded()) { - iprint(" __list.addAll(%1$s.getEmbeddablePropertyTypes());%n", pm.getFieldName()); - iprint(" __map.putAll(%1$s.getEmbeddablePropertyTypeMap());%n", pm.getFieldName()); - } else { - if (pm.isId()) { - iprint(" __idList.add(%1$s);%n", pm.getFieldName()); - } - iprint(" __list.add(%1$s);%n", pm.getFieldName()); - iprint(" __map.put(\"%1$s\", %2$s);%n", pm.getName(), pm.getFieldName()); - } - } + iprint( + " java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(%3$s);%n", + /* 1 */ EmbeddedPropertyType.class, + /* 2 */ entityMeta.getType(), + /* 3 */ entityMeta.getAllPropertyMetas().size()); + iprint(" initializeMaps(__map, __embeddedMap);%n"); + iprint(" initializeIdList(__map, __idList);%n"); + iprint(" initializeList(__map, __list);%n"); iprint(" __idPropertyTypes = java.util.Collections.unmodifiableList(__idList);%n"); iprint(" __entityPropertyTypes = java.util.Collections.unmodifiableList(__list);%n"); iprint(" __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map);%n"); + iprint( + " __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap);%n"); iprint("}%n"); print("%n"); } private void printMethods() { + printInitializeMapsMethod(); + printInitializeIdListMethod(); + printInitializeListMethod(); printGetNamingTypeMethod(); printIsImmutableMethod(); printGetNameMethod(); @@ -279,6 +276,58 @@ private void printMethods() { printNewInstanceMethod(); } + private void printInitializeMapsMethod() { + iprint( + "private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) {%n", + /* 1 */ EntityPropertyType.class, + /* 2 */ entityMeta.getType(), + /* 3 */ EmbeddedPropertyType.class); + indent(); + for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) { + EntityTypePropertyGenerator propertyGenerator = + new EntityTypePropertyGenerator(ctx, className, printer, entityMeta, pm); + if (pm.isEmbedded()) { + iprint("__embeddedMap.put(\"%1$s\", ", pm.getName()); + propertyGenerator.generate(); + print(");%n"); + iprint( + "__map.putAll(__embeddedMap.get(\"%1$s\").getEmbeddablePropertyTypeMap());%n", + pm.getName()); + } else { + iprint("__map.put(\"%1$s\", ", pm.getName()); + propertyGenerator.generate(); + print(");%n"); + } + } + unindent(); + iprint("}%n"); + print("%n"); + } + + private void printInitializeIdListMethod() { + iprint( + "private void initializeIdList(java.util.Map> __map, java.util.List<%1$s<%2$s, ?>> __idList) {%n", + EntityPropertyType.class, entityMeta.getType()); + indent(); + for (EntityPropertyMeta pm : entityMeta.getIdPropertyMetas()) { + iprint("__idList.add(__map.get(\"%1$s\"));%n", pm.getName()); + } + unindent(); + iprint("}%n"); + print("%n"); + } + + private void printInitializeListMethod() { + iprint( + "private void initializeList(java.util.Map> __map, java.util.List<%1$s<%2$s, ?>> __list) {%n", + EntityPropertyType.class, entityMeta.getType()); + indent(); + iprint("__list.addAll(__map.values());%n"); + unindent(); + iprint("}%n"); + print("%n"); + } + private void printGetNamingTypeMethod() { iprint("@Override%n"); iprint("public %1$s getNamingType() {%n", NamingType.class); @@ -451,13 +500,16 @@ private void printGetGeneratedIdPropertyTypeMethod() { String idName = "null"; if (entityMeta.hasGeneratedIdPropertyMeta()) { EntityPropertyMeta pm = entityMeta.getGeneratedIdPropertyMeta(); - idName = pm.getFieldName(); + idName = pm.getName(); } + iprint("@SuppressWarnings(\"unchecked\")%n"); iprint("@Override%n"); iprint( "public %1$s<%2$s, ?, ?> getGeneratedIdPropertyType() {%n", GeneratedIdPropertyType.class, entityMeta.getType()); - iprint(" return %1$s;%n", idName); + iprint( + " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n", + GeneratedIdPropertyType.class, entityMeta.getType(), idName); iprint("}%n"); print("%n"); } @@ -466,13 +518,16 @@ private void printGetVersionPropertyTypeMethod() { String versionName = "null"; if (entityMeta.hasVersionPropertyMeta()) { EntityPropertyMeta pm = entityMeta.getVersionPropertyMeta(); - versionName = pm.getFieldName(); + versionName = pm.getName(); } + iprint("@SuppressWarnings(\"unchecked\")%n"); iprint("@Override%n"); iprint( "public %1$s<%2$s, ?, ?> getVersionPropertyType() {%n", VersionPropertyType.class, entityMeta.getType()); - iprint(" return %1$s;%n", versionName); + iprint( + " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n", + VersionPropertyType.class, entityMeta.getType(), versionName); iprint("}%n"); print("%n"); } @@ -481,19 +536,23 @@ private void printGetTenantIdPropertyTypeMethod() { String tenantIdName = "null"; if (entityMeta.hasTenantIdPropertyMeta()) { EntityPropertyMeta pm = entityMeta.getTenantIdPropertyMeta(); - tenantIdName = pm.getFieldName(); + tenantIdName = pm.getName(); } + iprint("@SuppressWarnings(\"unchecked\")%n"); iprint("@Override%n"); iprint( "public %1$s<%2$s, ?, ?> getTenantIdPropertyType() {%n", TenantIdPropertyType.class, entityMeta.getType()); - iprint(" return %1$s;%n", tenantIdName); + iprint( + " return (%1$s<%2$s, ?, ?>)__entityPropertyTypeMap.get(\"%3$s\");%n", + TenantIdPropertyType.class, entityMeta.getType(), tenantIdName); iprint("}%n"); print("%n"); } private void printNewEntityMethod() { - if (hasGenericTypeProperty()) { + if (hasGenericTypeProperty() + || (!entityMeta.isImmutable() && entityMeta.hasEmbeddedProperties())) { iprint("@SuppressWarnings(\"unchecked\")%n"); } iprint("@Override%n"); @@ -517,7 +576,7 @@ public Void visitEmbeddableCtType(EmbeddableCtType ctType, Void aVoid) throws RuntimeException { iprint( " %1$s.newEmbeddable(\"%2$s\", __args)", - ctType.getDescCode(), propertyMeta.getName()); + ctType.getTypeCode(), propertyMeta.getName()); return null; } @@ -547,10 +606,13 @@ protected Void defaultAction(CtType ctType, Void aVoid) public Void visitEmbeddableCtType(EmbeddableCtType ctType, Void aVoid) throws RuntimeException { iprint( - " %1$s.save(entity, %2$s.newEmbeddable(\"%3$s\", __args));%n", - propertyMeta.getFieldName(), - ctType.getDescCode(), - propertyMeta.getName()); + " ((%4$s<%5$s, %6$s>)__embeddedPropertyTypeMap.get(\"%1$s\")).save(entity, %2$s.newEmbeddable(\"%3$s\", __args));%n", + /* 1 */ propertyMeta.getName(), + /* 2 */ ctType.getTypeCode(), + /* 3 */ propertyMeta.getName(), + /* 4 */ EmbeddedPropertyType.class, + /* 5 */ entityMeta.getType(), + /* 6 */ ctType.getType()); return null; } @@ -612,7 +674,9 @@ private void printSaveCurrentStatesMethod() { if (!entityMeta.isAbstract() && entityMeta.hasOriginalStatesMeta()) { iprint(" %1$s __currentStates = new %1$s();%n", entityMeta.getType()); for (EntityPropertyMeta pm : entityMeta.getAllPropertyMetas()) { - iprint(" %1$s.copy(__currentStates, __entity);%n", pm.getFieldName()); + iprint( + " (__entityPropertyTypeMap.get(\"%1$s\")).copy(__currentStates, __entity);%n", + pm.getName()); } iprint(" __originalStatesAccessor.set(__entity, __currentStates);%n"); } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypePropertyGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypePropertyGenerator.java index ceec9f81c..2d2681fd1 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypePropertyGenerator.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityTypePropertyGenerator.java @@ -40,7 +40,6 @@ public void generate() { } private void printPropertyTypeField() { - iprint("/** the %1$s */%n", propertyMeta.getName()); if (propertyMeta.isEmbedded()) { EmbeddableCtTypeVisitor visitor = new EmbeddableCtTypeVisitor(); EmbeddableCtType embeddableCtType = propertyMeta.getCtType().accept(visitor, null); @@ -64,26 +63,24 @@ private void printPropertyTypeField() { } private void printEmbeddedPropertyTypeField(EmbeddableCtType embeddableCtType) { - iprint( - "public final %1$s<%2$s, %3$s> %4$s = " - + "new %1$s<>(\"%5$s\", %2$s.class, %6$s.getEmbeddablePropertyTypes(\"%5$s\", %2$s.class, __namingType));%n", + print( + "new %1$s<%2$s, %3$s>(\"%5$s\", %2$s.class, %6$s.getEmbeddablePropertyTypes(\"%5$s\", %2$s.class, __namingType))", /* 1 */ EmbeddedPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ propertyMeta.getType(), - /* 4 */ propertyMeta.getFieldName(), + /* 4 */ null, /* 5 */ propertyMeta.getName(), - /* 6 */ embeddableCtType.getDescCode()); + /* 6 */ embeddableCtType.getTypeCode()); } private void printGeneratedIdPropertyTypeField(ScalarMeta scalarMeta) { - iprint( - "public final %1$s<%2$s, %3$s, %4$s> %5$s = " - + "new %1$s<>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s, __idGenerator);%n", + print( + "new %1$s<%2$s, %3$s, %4$s>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s, __idGenerator)", /* 1 */ GeneratedIdPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ scalarMeta.getBasicType(), /* 4 */ scalarMeta.getContainerType(), - /* 5 */ propertyMeta.getFieldName(), + /* 5 */ null, /* 6 */ entityMeta.getType(), /* 7 */ scalarMeta.getSupplier(), /* 8 */ propertyMeta.getName(), @@ -92,14 +89,13 @@ private void printGeneratedIdPropertyTypeField(ScalarMeta scalarMeta) { } private void printAssignedIdPropertyTypeField(ScalarMeta scalarMeta) { - iprint( - "public final %1$s<%2$s, %3$s, %4$s> %5$s = " - + "new %1$s<>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s);%n", + print( + "new %1$s<%2$s, %3$s, %4$s>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s)", /* 1 */ AssignedIdPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ scalarMeta.getBasicType(), /* 4 */ scalarMeta.getContainerType(), - /* 5 */ propertyMeta.getFieldName(), + /* 5 */ null, /* 6 */ entityMeta.getType(), /* 7 */ scalarMeta.getSupplier(), /* 8 */ propertyMeta.getName(), @@ -108,14 +104,13 @@ private void printAssignedIdPropertyTypeField(ScalarMeta scalarMeta) { } private void printVersionPropertyTypeField(ScalarMeta scalarMeta) { - iprint( - "public final %1$s<%2$s, %3$s, %4$s> %5$s = " - + "new %1$s<>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s);%n", + print( + "new %1$s<%2$s, %3$s, %4$s>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s)", /* 1 */ VersionPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ scalarMeta.getBasicType(), /* 4 */ scalarMeta.getContainerType(), - /* 5 */ propertyMeta.getFieldName(), + /* 5 */ null, /* 6 */ entityMeta.getType(), /* 7 */ scalarMeta.getSupplier(), /* 8 */ propertyMeta.getName(), @@ -124,14 +119,13 @@ private void printVersionPropertyTypeField(ScalarMeta scalarMeta) { } private void printTenantIdPropertyTypeField(ScalarMeta scalarMeta) { - iprint( - "public final %1$s<%2$s, %3$s, %4$s> %5$s = " - + "new %1$s<>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s);%n", + print( + "new %1$s<%2$s, %3$s, %4$s>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s)", /* 1 */ TenantIdPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ scalarMeta.getBasicType(), /* 4 */ scalarMeta.getContainerType(), - /* 5 */ propertyMeta.getFieldName(), + /* 5 */ null, /* 6 */ entityMeta.getType(), /* 7 */ scalarMeta.getSupplier(), /* 8 */ propertyMeta.getName(), @@ -140,14 +134,13 @@ private void printTenantIdPropertyTypeField(ScalarMeta scalarMeta) { } private void printDefaultPropertyTypeField(ScalarMeta scalarMeta) { - iprint( - "public final %1$s<%2$s, %3$s, %4$s> %5$s = " - + "new %1$s<>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s, %11$s, %12$s);%n", + print( + "new %1$s<%2$s, %3$s, %4$s>(%6$s.class, %7$s, \"%8$s\", \"%9$s\", __namingType, %10$s, %11$s, %12$s)", /* 1 */ DefaultPropertyType.class, /* 2 */ entityMeta.getType(), /* 3 */ scalarMeta.getBasicType(), /* 4 */ scalarMeta.getContainerType(), - /* 5 */ propertyMeta.getFieldName(), + /* 5 */ null, /* 6 */ entityMeta.getType(), /* 7 */ scalarMeta.getSupplier(), /* 8 */ propertyMeta.getName(), diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/JavaFileGenerator.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/JavaFileGenerator.java new file mode 100644 index 000000000..821d60383 --- /dev/null +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/JavaFileGenerator.java @@ -0,0 +1,54 @@ +package org.seasar.doma.internal.apt.generator; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Formatter; +import java.util.Objects; +import javax.lang.model.element.TypeElement; +import javax.tools.JavaFileObject; +import org.seasar.doma.internal.ClassName; +import org.seasar.doma.internal.apt.AptException; +import org.seasar.doma.internal.apt.Context; +import org.seasar.doma.internal.apt.meta.TypeElementMeta; +import org.seasar.doma.internal.util.IOUtil; +import org.seasar.doma.message.Message; + +public class JavaFileGenerator { + + private final Context ctx; + private final ClassNameFactory classNameFactory; + private final GeneratorFactory generatorFactory; + + public JavaFileGenerator( + Context ctx, ClassNameFactory classNameFactory, GeneratorFactory generatorFactory) { + this.ctx = Objects.requireNonNull(ctx); + this.classNameFactory = Objects.requireNonNull(classNameFactory); + this.generatorFactory = Objects.requireNonNull(generatorFactory); + } + + public void generate(TypeElement typeElement, M meta) { + ClassName className = classNameFactory.create(typeElement, meta); + Formatter formatter = null; + try { + JavaFileObject file = ctx.getResources().createSourceFile(className, typeElement); + formatter = new Formatter(new BufferedWriter(file.openWriter())); + Printer printer = new Printer(ctx, formatter); + Generator generator = generatorFactory.create(className, printer, meta); + generator.generate(); + } catch (IOException | UncheckedIOException e) { + throw new AptException( + Message.DOMA4011, typeElement, e, new Object[] {typeElement.getQualifiedName(), e}); + } finally { + IOUtil.close(formatter); + } + } + + public interface ClassNameFactory { + ClassName create(TypeElement typeElement, M meta); + } + + public interface GeneratorFactory { + Generator create(ClassName className, Printer printer, M meta); + } +} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/ScalarMetaFactory.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/ScalarMetaFactory.java index cd1de2ddc..67661bcea 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/ScalarMetaFactory.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/ScalarMetaFactory.java @@ -83,11 +83,9 @@ public ScalarMeta visitBasicCtType(BasicCtType basicCtType, Boolean optional) { if (optional) { p.print( "() -> new %1$s<>(%2$s)", - OptionalBasicScalar.class, basicCtType.getWrapperSupplierCode()); + OptionalBasicScalar.class, basicCtType.getWrapperCode()); } else { - p.print( - "() -> new %1$s<>(%2$s)", - BasicScalar.class, basicCtType.getWrapperSupplierCode()); + p.print("() -> new %1$s<>(%2$s)", BasicScalar.class, basicCtType.getWrapperCode()); } }); return defaultAction(basicCtType, optional); @@ -109,9 +107,9 @@ public ScalarMeta visitDomainCtType(DomainCtType domainCtType, Boolean optional) new Code( p -> { if (optional) { - p.print("%1$s::createOptionalScalar", domainCtType.getDescCode()); + p.print("%1$s::createOptionalScalar", domainCtType.getTypeCode()); } else { - p.print("%1$s::createScalar", domainCtType.getDescCode()); + p.print("%1$s::createScalar", domainCtType.getTypeCode()); } }); return defaultAction(domainCtType, optional); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMeta.java deleted file mode 100644 index b3a24a62d..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMeta.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.seasar.doma.internal.apt.meta.entity; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.annot.EmbeddableDescAnnot; -import org.seasar.doma.internal.apt.meta.TypeElementMeta; - -public class EmbeddableDescMeta implements TypeElementMeta { - - private final EmbeddableDescAnnot embeddableDescAnnot; - - private final TypeElement typeElement; - - private final TypeMirror type; - - private final EmbeddableMeta embeddableMeta; - - private boolean error; - - public EmbeddableDescMeta( - EmbeddableDescAnnot embeddableDescAnnot, - TypeElement typeElement, - EmbeddableMeta embeddableMeta) { - assertNotNull(embeddableDescAnnot, typeElement, embeddableMeta); - this.embeddableDescAnnot = embeddableDescAnnot; - this.typeElement = typeElement; - this.type = typeElement.asType(); - this.embeddableMeta = embeddableMeta; - } - - public EmbeddableDescAnnot getEmbeddableDescAnnot() { - return embeddableDescAnnot; - } - - public EmbeddableMeta getEmbeddableMeta() { - return embeddableMeta; - } - - @Override - public boolean isError() { - return error; - } - - public void setError(boolean error) { - this.error = error; - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMetaFactory.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMetaFactory.java deleted file mode 100644 index 83b763c69..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EmbeddableDescMetaFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.seasar.doma.internal.apt.meta.entity; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.Context; -import org.seasar.doma.internal.apt.annot.EmbeddableDescAnnot; -import org.seasar.doma.internal.apt.meta.TypeElementMetaFactory; - -public class EmbeddableDescMetaFactory implements TypeElementMetaFactory { - - private final Context ctx; - - public EmbeddableDescMetaFactory(Context ctx) { - assertNotNull(ctx); - this.ctx = ctx; - } - - @Override - public EmbeddableDescMeta createTypeElementMeta(TypeElement typeElement) { - assertNotNull(typeElement); - EmbeddableDescAnnot embeddableDescAnnot = - ctx.getAnnotations().newEmbeddableDescAnnot(typeElement); - if (embeddableDescAnnot == null) { - throw new AptIllegalStateException("embeddableDescAnnot must not be null."); - } - TypeMirror embeddableTypeMirror = embeddableDescAnnot.getValueValue(); - TypeElement embeddableTypeElement = ctx.getMoreTypes().toTypeElement(embeddableTypeMirror); - if (embeddableTypeElement == null) { - throw new AptIllegalStateException("embeddableTypeElement"); - } - EmbeddableMetaFactory factory = new EmbeddableMetaFactory(ctx); - EmbeddableMeta embeddableMeta = factory.createTypeElementMeta(embeddableTypeElement); - return new EmbeddableDescMeta(embeddableDescAnnot, typeElement, embeddableMeta); - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMeta.java deleted file mode 100644 index 7732d7bc6..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMeta.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.seasar.doma.internal.apt.meta.entity; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.annot.EntityDescAnnot; -import org.seasar.doma.internal.apt.meta.TypeElementMeta; - -public class EntityDescMeta implements TypeElementMeta { - - private final EntityDescAnnot entityDescAnnot; - private final TypeElement typeElement; - private final TypeMirror type; - private final EntityMeta entityMeta; - private boolean error; - - public EntityDescMeta( - EntityDescAnnot entityDescAnnot, TypeElement typeElement, EntityMeta entityMeta) { - assertNotNull(entityDescAnnot, typeElement, entityMeta); - this.entityDescAnnot = entityDescAnnot; - this.typeElement = typeElement; - this.type = typeElement.asType(); - this.entityMeta = entityMeta; - } - - public EntityMeta getEntityMeta() { - return entityMeta; - } - - @Override - public boolean isError() { - return error; - } - - public void setError(boolean error) { - this.error = error; - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMetaFactory.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMetaFactory.java deleted file mode 100644 index caae710cc..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityDescMetaFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.seasar.doma.internal.apt.meta.entity; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; -import org.seasar.doma.internal.apt.AptIllegalStateException; -import org.seasar.doma.internal.apt.Context; -import org.seasar.doma.internal.apt.annot.EntityDescAnnot; -import org.seasar.doma.internal.apt.meta.TypeElementMetaFactory; - -public class EntityDescMetaFactory implements TypeElementMetaFactory { - - private final Context ctx; - - public EntityDescMetaFactory(Context ctx) { - assertNotNull(ctx); - this.ctx = ctx; - } - - @Override - public EntityDescMeta createTypeElementMeta(TypeElement typeElement) { - assertNotNull(typeElement); - EntityDescAnnot entityDescAnnot = ctx.getAnnotations().newEntityDescAnnot(typeElement); - if (entityDescAnnot == null) { - throw new AptIllegalStateException("entityDescAnnot must not null."); - } - TypeMirror entityTypeMirror = entityDescAnnot.getValueValue(); - TypeElement entityTypeElement = ctx.getMoreTypes().toTypeElement(entityTypeMirror); - if (entityTypeElement == null) { - throw new AptIllegalStateException("entityTypeElement"); - } - EntityMeta entityMeta = new EntityMetaFactory(ctx).createTypeElementMeta(entityTypeElement); - return new EntityDescMeta(entityDescAnnot, typeElement, entityMeta); - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java index a91def233..e7ba9d4bd 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMeta.java @@ -63,7 +63,7 @@ public void setEntityName(String entityName) { this.entityName = entityName; } - EntityAnnot getEntityAnnot() { + public EntityAnnot getEntityAnnot() { return entityAnnot; } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaFactory.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaFactory.java index 69af6c305..70b7b6771 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaFactory.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/meta/entity/EntityMetaFactory.java @@ -37,6 +37,7 @@ import org.seasar.doma.internal.apt.Context; import org.seasar.doma.internal.apt.annot.AllArgsConstructorAnnot; import org.seasar.doma.internal.apt.annot.EntityAnnot; +import org.seasar.doma.internal.apt.annot.MetamodelAnnot; import org.seasar.doma.internal.apt.annot.TableAnnot; import org.seasar.doma.internal.apt.annot.ValueAnnot; import org.seasar.doma.internal.apt.meta.TypeElementMetaFactory; @@ -203,6 +204,7 @@ protected static class DefaultStrategy implements Strategy { public void doClassElement(TypeElement classElement, EntityMeta entityMeta) { validateClass(classElement, entityMeta); validateEntityListener(classElement, entityMeta); + validateMetamodelAnnotation(classElement, entityMeta); doTable(classElement, entityMeta); } @@ -461,6 +463,22 @@ TypeMirror getListenerArgumentType(TypeMirror typeMirror) { return null; } + void validateMetamodelAnnotation(TypeElement classElement, EntityMeta entityMeta) { + EntityAnnot entityAnnot = entityMeta.getEntityAnnot(); + MetamodelAnnot metamodelAnnot = entityAnnot.getMetamodelValue(); + if (metamodelAnnot != null) { + String prefix = metamodelAnnot.getPrefixValue(); + String suffix = metamodelAnnot.getSuffixValue(); + if (Constants.TYPE_PREFIX.equals(prefix) && suffix.isEmpty()) { + throw new AptException( + Message.DOMA4455, + classElement, + metamodelAnnot.getAnnotationMirror(), + new Object[] {Constants.TYPE_PREFIX}); + } + } + } + void doTable(TypeElement classElement, EntityMeta entityMeta) { TableAnnot tableAnnot = ctx.getAnnotations().newTableAnnot(classElement); if (tableAnnot == null) { diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/AbstractGeneratingProcessor.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/AbstractGeneratingProcessor.java index 91a2a20d5..785b1ada3 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/AbstractGeneratingProcessor.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/AbstractGeneratingProcessor.java @@ -1,23 +1,16 @@ package org.seasar.doma.internal.apt.processor; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.UncheckedIOException; import java.lang.annotation.Annotation; -import java.util.Formatter; import java.util.Set; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.TypeElement; import javax.lang.model.util.ElementFilter; -import javax.tools.JavaFileObject; import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.apt.AptException; import org.seasar.doma.internal.apt.generator.Generator; +import org.seasar.doma.internal.apt.generator.JavaFileGenerator; import org.seasar.doma.internal.apt.generator.Printer; import org.seasar.doma.internal.apt.meta.TypeElementMeta; import org.seasar.doma.internal.apt.meta.TypeElementMetaFactory; -import org.seasar.doma.internal.util.IOUtil; -import org.seasar.doma.message.Message; public abstract class AbstractGeneratingProcessor extends AbstractProcessor { @@ -50,19 +43,9 @@ public boolean process(Set annotations, RoundEnvironment protected abstract TypeElementMetaFactory createTypeElementMetaFactory(); protected void generate(TypeElement typeElement, M meta) { - ClassName className = createClassName(typeElement, meta); - Formatter formatter = null; - try { - JavaFileObject file = ctx.getResources().createSourceFile(className, typeElement); - formatter = new Formatter(new BufferedWriter(file.openWriter())); - Generator generator = createGenerator(className, new Printer(ctx, formatter), meta); - generator.generate(); - } catch (IOException | UncheckedIOException e) { - throw new AptException( - Message.DOMA4011, typeElement, e, new Object[] {typeElement.getQualifiedName(), e}); - } finally { - IOUtil.close(formatter); - } + JavaFileGenerator javaFileGenerator = + new JavaFileGenerator<>(ctx, this::createClassName, this::createGenerator); + javaFileGenerator.generate(typeElement, meta); } protected abstract ClassName createClassName(TypeElement typeElement, M meta); diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableDescProcessor.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableDescProcessor.java deleted file mode 100644 index 9ef7ad986..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableDescProcessor.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.seasar.doma.internal.apt.processor; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import java.util.Set; -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedOptions; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.EmbeddableDesc; -import org.seasar.doma.internal.apt.Options; -import org.seasar.doma.internal.apt.generator.EmbeddableDefGenerator; -import org.seasar.doma.internal.apt.generator.Generator; -import org.seasar.doma.internal.apt.generator.Printer; -import org.seasar.doma.internal.apt.meta.entity.EmbeddableDescMeta; -import org.seasar.doma.internal.apt.meta.entity.EmbeddableDescMetaFactory; -import org.seasar.doma.internal.apt.meta.entity.EmbeddableMeta; - -@SupportedAnnotationTypes({"org.seasar.doma.internal.EmbeddableDesc"}) -@SupportedOptions({ - Options.RESOURCES_DIR, - Options.TEST, - Options.DEBUG, - Options.CONFIG_PATH, - Options.CRITERIA_ENABLED, - Options.CRITERIA_PREFIX, - Options.CRITERIA_SUFFIX -}) -public class EmbeddableDescProcessor extends AbstractGeneratingProcessor { - - public EmbeddableDescProcessor() { - super(EmbeddableDesc.class); - } - - @Override - public boolean process(Set annotations, RoundEnvironment roundEnv) { - if (!ctx.getOptions().isCriteriaEnabled()) { - return true; - } - return super.process(annotations, roundEnv); - } - - @Override - protected EmbeddableDescMetaFactory createTypeElementMetaFactory() { - return new EmbeddableDescMetaFactory(ctx); - } - - @Override - protected ClassName createClassName(TypeElement typeElement, EmbeddableDescMeta meta) { - assertNotNull(typeElement, meta); - EmbeddableMeta embeddableMeta = meta.getEmbeddableMeta(); - TypeElement embeddableTypeElement = embeddableMeta.getTypeElement(); - Name binaryName = ctx.getMoreElements().getBinaryName(embeddableTypeElement); - String prefix = ctx.getOptions().getCriteriaPrefix(); - String suffix = ctx.getOptions().getCriteriaSuffix(); - return ClassNames.newEmbeddableDefClassNameBuilder(binaryName, prefix, suffix); - } - - @Override - protected Generator createGenerator( - ClassName className, Printer printer, EmbeddableDescMeta meta) { - assertNotNull(className, meta, printer); - return new EmbeddableDefGenerator(ctx, className, printer, meta); - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableProcessor.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableProcessor.java index 990a41332..f9100bf27 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableProcessor.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableProcessor.java @@ -13,6 +13,7 @@ import org.seasar.doma.internal.apt.generator.EmbeddableTypeGenerator; import org.seasar.doma.internal.apt.generator.Generator; import org.seasar.doma.internal.apt.generator.Printer; +import org.seasar.doma.internal.apt.meta.TypeElementMetaFactory; import org.seasar.doma.internal.apt.meta.entity.EmbeddableMeta; import org.seasar.doma.internal.apt.meta.entity.EmbeddableMetaFactory; @@ -24,7 +25,10 @@ Options.LOMBOK_ALL_ARGS_CONSTRUCTOR, Options.TEST, Options.DEBUG, - Options.CONFIG_PATH + Options.CONFIG_PATH, + Options.METAMODEL_ENABLED, + Options.METAMODEL_PREFIX, + Options.METAMODEL_SUFFIX }) public class EmbeddableProcessor extends AbstractGeneratingProcessor { @@ -33,7 +37,7 @@ public EmbeddableProcessor() { } @Override - protected EmbeddableMetaFactory createTypeElementMetaFactory() { + protected TypeElementMetaFactory createTypeElementMetaFactory() { return new EmbeddableMetaFactory(ctx); } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityDescProcessor.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityDescProcessor.java deleted file mode 100644 index 7bd1b7d61..000000000 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityDescProcessor.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.seasar.doma.internal.apt.processor; - -import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; - -import java.util.Set; -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedAnnotationTypes; -import javax.annotation.processing.SupportedOptions; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.EntityDesc; -import org.seasar.doma.internal.apt.Options; -import org.seasar.doma.internal.apt.generator.EntityDefGenerator; -import org.seasar.doma.internal.apt.generator.Generator; -import org.seasar.doma.internal.apt.generator.Printer; -import org.seasar.doma.internal.apt.meta.entity.EntityDescMeta; -import org.seasar.doma.internal.apt.meta.entity.EntityDescMetaFactory; -import org.seasar.doma.internal.apt.meta.entity.EntityMeta; - -@SupportedAnnotationTypes({"org.seasar.doma.internal.EntityDesc"}) -@SupportedOptions({ - Options.RESOURCES_DIR, - Options.TEST, - Options.DEBUG, - Options.CONFIG_PATH, - Options.CRITERIA_ENABLED, - Options.CRITERIA_PREFIX, - Options.CRITERIA_SUFFIX -}) -public class EntityDescProcessor extends AbstractGeneratingProcessor { - - public EntityDescProcessor() { - super(EntityDesc.class); - } - - @Override - public boolean process(Set annotations, RoundEnvironment roundEnv) { - if (!ctx.getOptions().isCriteriaEnabled()) { - return true; - } - return super.process(annotations, roundEnv); - } - - @Override - protected EntityDescMetaFactory createTypeElementMetaFactory() { - return new EntityDescMetaFactory(ctx); - } - - @Override - protected ClassName createClassName(TypeElement typeElement, EntityDescMeta meta) { - assertNotNull(typeElement, meta); - EntityMeta entityMeta = meta.getEntityMeta(); - TypeElement entityTypeElement = entityMeta.getTypeElement(); - Name binaryName = ctx.getMoreElements().getBinaryName(entityTypeElement); - String prefix = ctx.getOptions().getCriteriaPrefix(); - String suffix = ctx.getOptions().getCriteriaSuffix(); - return ClassNames.newEntityDefClassNameBuilder(binaryName, prefix, suffix); - } - - @Override - protected Generator createGenerator(ClassName className, Printer printer, EntityDescMeta meta) { - assertNotNull(className, meta, printer); - return new EntityDefGenerator(ctx, className, printer, meta); - } -} diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityProcessor.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityProcessor.java index 490eca645..78e27e353 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityProcessor.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityProcessor.java @@ -2,16 +2,23 @@ import static org.seasar.doma.internal.util.AssertionUtil.assertNotNull; +import java.util.Set; +import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedOptions; import javax.lang.model.element.Name; import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; import org.seasar.doma.Entity; import org.seasar.doma.internal.ClassName; import org.seasar.doma.internal.ClassNames; import org.seasar.doma.internal.apt.Options; +import org.seasar.doma.internal.apt.annot.EntityAnnot; +import org.seasar.doma.internal.apt.annot.MetamodelAnnot; +import org.seasar.doma.internal.apt.generator.EntityMetamodelGenerator; import org.seasar.doma.internal.apt.generator.EntityTypeGenerator; import org.seasar.doma.internal.apt.generator.Generator; +import org.seasar.doma.internal.apt.generator.JavaFileGenerator; import org.seasar.doma.internal.apt.generator.Printer; import org.seasar.doma.internal.apt.meta.entity.EntityMeta; import org.seasar.doma.internal.apt.meta.entity.EntityMetaFactory; @@ -26,29 +33,96 @@ Options.LOMBOK_ALL_ARGS_CONSTRUCTOR, Options.TEST, Options.DEBUG, - Options.CONFIG_PATH + Options.CONFIG_PATH, + Options.METAMODEL_ENABLED, + Options.METAMODEL_PREFIX, + Options.METAMODEL_SUFFIX }) -public class EntityProcessor extends AbstractGeneratingProcessor { +public class EntityProcessor extends AbstractProcessor { public EntityProcessor() { super(Entity.class); } @Override - protected EntityMetaFactory createTypeElementMetaFactory() { - return new EntityMetaFactory(ctx); + public boolean process(Set annotations, RoundEnvironment roundEnv) { + if (roundEnv.processingOver()) { + return true; + } + for (TypeElement annotation : annotations) { + final EntityMetaFactory factory = new EntityMetaFactory(ctx); + for (TypeElement typeElement : + ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + handleTypeElement( + typeElement, + __ -> { + EntityMeta meta = factory.createTypeElementMeta(typeElement); + if (!meta.isError()) { + generateEntityType(typeElement, meta); + if (isMetamodelEnabled(meta)) { + generateEntityMetamodel(typeElement, meta); + } + } + }); + } + } + return true; } - @Override - protected ClassName createClassName(TypeElement typeElement, EntityMeta meta) { + private boolean isMetamodelEnabled(EntityMeta meta) { + EntityAnnot entityAnnot = meta.getEntityAnnot(); + MetamodelAnnot metamodelAnnot = entityAnnot.getMetamodelValue(); + return metamodelAnnot != null || ctx.getOptions().isMetamodelEnabled(); + } + + private void generateEntityType(TypeElement typeElement, EntityMeta meta) { + JavaFileGenerator generator = + new JavaFileGenerator<>( + ctx, this::createEntityTypeClassName, this::createEntityTypeGenerator); + generator.generate(typeElement, meta); + } + + private ClassName createEntityTypeClassName(TypeElement typeElement, EntityMeta meta) { assertNotNull(typeElement, meta); Name binaryName = ctx.getMoreElements().getBinaryName(typeElement); return ClassNames.newEntityTypeClassName(binaryName); } - @Override - protected Generator createGenerator(ClassName className, Printer printer, EntityMeta meta) { + private Generator createEntityTypeGenerator( + ClassName className, Printer printer, EntityMeta meta) { assertNotNull(className, meta, printer); return new EntityTypeGenerator(ctx, className, printer, meta); } + + private void generateEntityMetamodel(TypeElement typeElement, EntityMeta meta) { + JavaFileGenerator generator = + new JavaFileGenerator<>( + ctx, this::createEntityMetamodelClassName, this::createEntityMetamodelGenerator); + generator.generate(typeElement, meta); + } + + private ClassName createEntityMetamodelClassName(TypeElement typeElement, EntityMeta meta) { + assertNotNull(typeElement, meta); + EntityAnnot entityAnnot = meta.getEntityAnnot(); + MetamodelAnnot metamodelAnnot = entityAnnot.getMetamodelValue(); + Name binaryName = ctx.getMoreElements().getBinaryName(typeElement); + String prefix = ctx.getOptions().getMetamodelPrefix(); + String suffix = ctx.getOptions().getMetamodelSuffix(); + if (metamodelAnnot != null) { + String prefixValue = metamodelAnnot.getPrefixValue(); + String suffixValue = metamodelAnnot.getSuffixValue(); + if (!prefixValue.isEmpty() || !suffixValue.isEmpty()) { + prefix = prefixValue; + suffix = suffixValue; + } + } + return ClassNames.newEntityMetamodelClassNameBuilder(binaryName, prefix, suffix); + } + + private Generator createEntityMetamodelGenerator( + ClassName className, Printer printer, EntityMeta meta) { + assertNotNull(className, meta, printer); + ClassName entityTypeName = createEntityTypeClassName(meta.getTypeElement(), meta); + return new EntityMetamodelGenerator(ctx, className, printer, meta, entityTypeName); + } } diff --git a/doma-processor/src/main/java/org/seasar/doma/internal/apt/util/AnnotationValueUtil.java b/doma-processor/src/main/java/org/seasar/doma/internal/apt/util/AnnotationValueUtil.java index a9bb3f6ae..203d78d91 100644 --- a/doma-processor/src/main/java/org/seasar/doma/internal/apt/util/AnnotationValueUtil.java +++ b/doma-processor/src/main/java/org/seasar/doma/internal/apt/util/AnnotationValueUtil.java @@ -1,7 +1,5 @@ package org.seasar.doma.internal.apt.util; -import static org.seasar.doma.internal.util.AssertionUtil.*; - import java.util.ArrayList; import java.util.List; import javax.lang.model.element.AnnotationMirror; @@ -179,4 +177,18 @@ public VariableElement visitEnumConstant(VariableElement c, Void p) { }, null); } + + public static AnnotationMirror toAnnotation(AnnotationValue value) { + if (value == null) { + return null; + } + return value.accept( + new SimpleAnnotationValueVisitor8() { + @Override + public AnnotationMirror visitAnnotation(AnnotationMirror a, Void p) { + return a; + } + }, + null); + } } diff --git a/doma-processor/src/main/resources/META-INF/gradle/incremental.annotation.processors b/doma-processor/src/main/resources/META-INF/gradle/incremental.annotation.processors index 6afc942f9..650e1bd32 100644 --- a/doma-processor/src/main/resources/META-INF/gradle/incremental.annotation.processors +++ b/doma-processor/src/main/resources/META-INF/gradle/incremental.annotation.processors @@ -6,5 +6,3 @@ org.seasar.doma.internal.apt.processor.EmbeddableProcessor,isolating org.seasar.doma.internal.apt.processor.EntityProcessor,isolating org.seasar.doma.internal.apt.processor.DaoProcessor,isolating org.seasar.doma.internal.apt.processor.SingletonConfigProcessor,isolating -org.seasar.doma.internal.apt.processor.EmbeddableDescProcessor,isolating -org.seasar.doma.internal.apt.processor.EntityDescProcessor,isolating diff --git a/doma-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/doma-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor index bea870362..e7ff72b20 100644 --- a/doma-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/doma-processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -6,5 +6,3 @@ org.seasar.doma.internal.apt.processor.EmbeddableProcessor org.seasar.doma.internal.apt.processor.EntityProcessor org.seasar.doma.internal.apt.processor.DaoProcessor org.seasar.doma.internal.apt.processor.SingletonConfigProcessor -org.seasar.doma.internal.apt.processor.EmbeddableDescProcessor -org.seasar.doma.internal.apt.processor.EntityDescProcessor diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/CriteriaGeneratedClassNameParameterResolver.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CriteriaGeneratedClassNameParameterResolver.java new file mode 100644 index 000000000..a6ee6d52b --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/CriteriaGeneratedClassNameParameterResolver.java @@ -0,0 +1,49 @@ +package org.seasar.doma.internal.apt; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.opentest4j.AssertionFailedError; +import org.seasar.doma.Entity; +import org.seasar.doma.internal.ClassNames; + +public class CriteriaGeneratedClassNameParameterResolver implements ParameterResolver { + + private final Class clazz; + private final String prefix; + private final String suffix; + + public CriteriaGeneratedClassNameParameterResolver(Class clazz) { + this(clazz, "", "_"); + } + + public CriteriaGeneratedClassNameParameterResolver(Class clazz, String prefix, String suffix) { + assertNotNull(clazz); + assertNotNull(prefix); + assertNotNull(suffix); + this.clazz = clazz; + this.prefix = prefix; + this.suffix = suffix; + } + + @Override + public boolean supportsParameter( + ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return parameterContext.getParameter().getType().equals(String.class); + } + + @Override + public Object resolveParameter( + ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + if (clazz.isAnnotationPresent(Entity.class)) { + return ClassNames.newEntityMetamodelClassNameBuilder(clazz.getName(), prefix, suffix) + .toString(); + } + throw new AssertionFailedError("annotation not found."); + } +} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/GeneratedClassNameParameterResolver.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/GeneratedClassNameParameterResolver.java index 2f8d55cad..b0db1815b 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/GeneratedClassNameParameterResolver.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/GeneratedClassNameParameterResolver.java @@ -13,8 +13,6 @@ import org.seasar.doma.Embeddable; import org.seasar.doma.Entity; import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.EmbeddableDesc; -import org.seasar.doma.internal.EntityDesc; public class GeneratedClassNameParameterResolver implements ParameterResolver { @@ -64,14 +62,6 @@ public Object resolveParameter( if (clazz.isAnnotationPresent(Domain.class)) { return ClassNames.newDomainTypeClassName(clazz.getName()).toString(); } - if (clazz.isAnnotationPresent(EntityDesc.class)) { - EntityDesc entityDesc = clazz.getAnnotation(EntityDesc.class); - return entityDesc.value().getName() + "_"; - } - if (clazz.isAnnotationPresent(EmbeddableDesc.class)) { - EmbeddableDesc embeddableDesc = clazz.getAnnotation(EmbeddableDesc.class); - return embeddableDesc.value().getName() + "_"; - } throw new AssertionFailedError("annotation not found."); } } diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/Address.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/Address.java deleted file mode 100644 index d07e23fd1..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/Address.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import java.util.Optional; -import java.util.OptionalDouble; -import java.util.OptionalInt; -import java.util.OptionalLong; -import org.seasar.doma.Embeddable; - -@Embeddable -public class Address { - - public final Integer streetNo; - public final City city; - public final Optional optional; - public final OptionalDouble optionalDouble; - public final OptionalInt optionalInt; - public final OptionalLong optionalLong; - - public Address( - Integer streetNo, - City city, - Optional optional, - OptionalDouble optionalDouble, - OptionalInt optionalInt, - OptionalLong optionalLong) { - this.streetNo = streetNo; - this.city = city; - this.optional = optional; - this.optionalDouble = optionalDouble; - this.optionalInt = optionalInt; - this.optionalLong = optionalLong; - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/City.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/City.java deleted file mode 100644 index 5e2c588e0..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/City.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import org.seasar.doma.Domain; - -@Domain(valueType = String.class) -public class City { - private final String value; - - public City(String value) { - this.value = value; - } - - public String getValue() { - return value; - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest.java deleted file mode 100644 index a05c7fd85..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.TestTemplate; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.Extension; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.TestTemplateInvocationContext; -import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; -import org.opentest4j.AssertionFailedError; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.EmbeddableDesc; -import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.GeneratedClassNameParameterResolver; -import org.seasar.doma.internal.apt.ResourceParameterResolver; -import org.seasar.doma.internal.apt.SimpleParameterResolver; -import org.seasar.doma.internal.apt.processor.EmbeddableDescProcessor; - -class EmbeddableDescProcessorOptionTest extends CompilerSupport { - - private static final String prefix = "Q"; - private static final String suffix = "Def"; - - @BeforeEach - void beforeEach() { - addOption("-Adoma.test=true"); - addOption("-Adoma.criteria.prefix=" + prefix); - addOption("-Adoma.criteria.suffix=" + suffix); - } - - @TestTemplate - @ExtendWith(SuccessInvocationContextProvider.class) - void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) - throws Exception { - addOption(options); - addProcessor(new EmbeddableDescProcessor()); - addCompilationUnit(clazz); - compile(); - assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); - assertTrue(getCompiledResult()); - } - - static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { - @Override - public boolean supportsTestTemplate(ExtensionContext context) { - return true; - } - - @Override - public Stream provideTestTemplateInvocationContexts( - ExtensionContext context) { - return Stream.of(invocationContext(_Address.class)); - } - - private TestTemplateInvocationContext invocationContext( - Class compilationUnit, String... options) { - return new TestTemplateInvocationContext() { - @Override - public String getDisplayName(int invocationIndex) { - return compilationUnit.getSimpleName(); - } - - @Override - public List getAdditionalExtensions() { - return Arrays.asList( - new SimpleParameterResolver(compilationUnit), - new ResourceParameterResolver(compilationUnit), - new CustomGeneratedClassNameParameterResolver(compilationUnit), - new SimpleParameterResolver(options)); - } - }; - } - } - - private static class CustomGeneratedClassNameParameterResolver - extends GeneratedClassNameParameterResolver { - - public CustomGeneratedClassNameParameterResolver(Class clazz) { - super(clazz); - } - - @Override - public Object resolveParameter( - ParameterContext parameterContext, ExtensionContext extensionContext) - throws ParameterResolutionException { - if (clazz.isAnnotationPresent(EmbeddableDesc.class)) { - EmbeddableDesc embeddableDesc = clazz.getAnnotation(EmbeddableDesc.class); - ClassName className = - ClassNames.newEmbeddableDefClassNameBuilder( - embeddableDesc.value().getName(), prefix, suffix); - return className.toString(); - } - throw new AssertionFailedError("annotation not found."); - } - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest.java deleted file mode 100644 index 00921c4ff..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.TestTemplate; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.Extension; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.TestTemplateInvocationContext; -import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; -import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.GeneratedClassNameParameterResolver; -import org.seasar.doma.internal.apt.ResourceParameterResolver; -import org.seasar.doma.internal.apt.SimpleParameterResolver; -import org.seasar.doma.internal.apt.processor.EmbeddableDescProcessor; - -class EmbeddableDescProcessorTest extends CompilerSupport { - - @BeforeEach - void beforeEach() { - addOption("-Adoma.test=true"); - } - - @TestTemplate - @ExtendWith(SuccessInvocationContextProvider.class) - void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) - throws Exception { - addOption(options); - addProcessor(new EmbeddableDescProcessor()); - addCompilationUnit(clazz); - compile(); - assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); - assertTrue(getCompiledResult()); - } - - static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { - @Override - public boolean supportsTestTemplate(ExtensionContext context) { - return true; - } - - @Override - public Stream provideTestTemplateInvocationContexts( - ExtensionContext context) { - return Stream.of(invocationContext(_Address.class)); - } - - private TestTemplateInvocationContext invocationContext( - Class compilationUnit, String... options) { - return new TestTemplateInvocationContext() { - @Override - public String getDisplayName(int invocationIndex) { - return compilationUnit.getSimpleName(); - } - - @Override - public List getAdditionalExtensions() { - return Arrays.asList( - new SimpleParameterResolver(compilationUnit), - new ResourceParameterResolver(compilationUnit), - new GeneratedClassNameParameterResolver(compilationUnit), - new SimpleParameterResolver(options)); - } - }; - } - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_Address.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_Address.java deleted file mode 100644 index 91591f527..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_Address.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import java.util.List; -import java.util.Map; -import org.seasar.doma.internal.EmbeddableDesc; -import org.seasar.doma.jdbc.entity.EmbeddableType; -import org.seasar.doma.jdbc.entity.EntityPropertyType; -import org.seasar.doma.jdbc.entity.NamingType; -import org.seasar.doma.jdbc.entity.Property; - -@EmbeddableDesc(Address.class) -public class _Address implements EmbeddableType
{ - @Override - public List> getEmbeddablePropertyTypes( - String embeddedPropertyName, Class entityClass, NamingType namingType) { - return null; - } - - @Override - public Address newEmbeddable( - String embeddedPropertyName, Map> __args) { - return null; - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_City.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_City.java deleted file mode 100644 index b66166b69..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/embeddabledesc/_City.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -import org.seasar.doma.jdbc.domain.AbstractDomainType; - -public class _City extends AbstractDomainType { - - private _City() { - super(() -> new org.seasar.doma.wrapper.StringWrapper()); - } - - @Override - public City newDomain(String value) { - return null; - } - - @Override - public String getBasicValue(City domain) { - return null; - } - - @Override - public Class getBasicClass() { - return null; - } - - @Override - public Class getDomainClass() { - return null; - } - - public static _City getSingletonInternal() { - return null; - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo_.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo_.java deleted file mode 100644 index e5d63967f..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo_.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -import java.time.LocalDate; -import java.util.Arrays; -import java.util.List; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EmbeddableDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; -import org.seasar.doma.jdbc.entity.EntityType; - -public class EmpInfo_ implements EmbeddableDef { - - public final PropertyDef hiredate; - - public EmpInfo_(EntityType entityType, String name) { - hiredate = new DefaultPropertyDef<>(LocalDate.class, entityType, name + ".hiredate"); - } - - @Override - public List> allPropertyDefs() { - return Arrays.asList(hiredate); - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest.java deleted file mode 100644 index 3fea5b889..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.net.URL; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.TestTemplate; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.Extension; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.TestTemplateInvocationContext; -import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; -import org.opentest4j.AssertionFailedError; -import org.seasar.doma.internal.ClassName; -import org.seasar.doma.internal.ClassNames; -import org.seasar.doma.internal.EntityDesc; -import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.GeneratedClassNameParameterResolver; -import org.seasar.doma.internal.apt.ResourceParameterResolver; -import org.seasar.doma.internal.apt.SimpleParameterResolver; -import org.seasar.doma.internal.apt.processor.EntityDescProcessor; - -class EntityDescProcessorOptionTest extends CompilerSupport { - - private static final String prefix = "Q"; - private static final String suffix = "Def"; - - @BeforeEach - void beforeEach() { - addOption("-Adoma.test=true"); - addOption("-Adoma.criteria.prefix=" + prefix); - addOption("-Adoma.criteria.suffix=" + suffix); - } - - @TestTemplate - @ExtendWith(SuccessInvocationContextProvider.class) - void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) - throws Exception { - addOption(options); - addProcessor(new EntityDescProcessor()); - addCompilationUnit(clazz); - compile(); - assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); - assertTrue(getCompiledResult()); - } - - static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { - @Override - public boolean supportsTestTemplate(ExtensionContext context) { - return true; - } - - @Override - public Stream provideTestTemplateInvocationContexts( - ExtensionContext context) { - return Stream.of(invocationContext(_Emp.class)); - } - - private TestTemplateInvocationContext invocationContext( - Class compilationUnit, String... options) { - return new TestTemplateInvocationContext() { - @Override - public String getDisplayName(int invocationIndex) { - return compilationUnit.getSimpleName(); - } - - @Override - public List getAdditionalExtensions() { - return Arrays.asList( - new SimpleParameterResolver(compilationUnit), - new ResourceParameterResolver(compilationUnit), - new CustomGeneratedClassNameParameterResolver(compilationUnit), - new SimpleParameterResolver(options)); - } - }; - } - } - - private static class CustomGeneratedClassNameParameterResolver - extends GeneratedClassNameParameterResolver { - - public CustomGeneratedClassNameParameterResolver(Class clazz) { - super(clazz); - } - - @Override - public Object resolveParameter( - ParameterContext parameterContext, ExtensionContext extensionContext) - throws ParameterResolutionException { - if (clazz.isAnnotationPresent(EntityDesc.class)) { - EntityDesc entityDesc = clazz.getAnnotation(EntityDesc.class); - ClassName className = - ClassNames.newEntityDefClassNameBuilder(entityDesc.value().getName(), prefix, suffix); - return className.toString(); - } - throw new AssertionFailedError("annotation not found."); - } - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/QEmpInfoDef.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/QEmpInfoDef.java deleted file mode 100644 index 037b1efbf..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/QEmpInfoDef.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -import java.time.LocalDate; -import java.util.Arrays; -import java.util.List; -import org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef; -import org.seasar.doma.jdbc.criteria.def.EmbeddableDef; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; -import org.seasar.doma.jdbc.entity.EntityType; - -public class QEmpInfoDef implements EmbeddableDef { - - public final PropertyDef hiredate; - - public QEmpInfoDef(EntityType entityType, String name) { - hiredate = new DefaultPropertyDef<>(LocalDate.class, entityType, name + ".hiredate"); - } - - @Override - public List> allPropertyDefs() { - return Arrays.asList(hiredate); - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Emp.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Emp.java deleted file mode 100644 index 5e8514320..000000000 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Emp.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import org.seasar.doma.internal.EntityDesc; -import org.seasar.doma.jdbc.entity.AbstractEntityType; -import org.seasar.doma.jdbc.entity.EntityPropertyType; -import org.seasar.doma.jdbc.entity.GeneratedIdPropertyType; -import org.seasar.doma.jdbc.entity.NamingType; -import org.seasar.doma.jdbc.entity.PostDeleteContext; -import org.seasar.doma.jdbc.entity.PostInsertContext; -import org.seasar.doma.jdbc.entity.PostUpdateContext; -import org.seasar.doma.jdbc.entity.PreDeleteContext; -import org.seasar.doma.jdbc.entity.PreInsertContext; -import org.seasar.doma.jdbc.entity.PreUpdateContext; -import org.seasar.doma.jdbc.entity.Property; -import org.seasar.doma.jdbc.entity.TenantIdPropertyType; -import org.seasar.doma.jdbc.entity.VersionPropertyType; - -@EntityDesc(Emp.class) -public class _Emp extends AbstractEntityType { - - private static final _Emp INSTANCE = new _Emp(); - - @Override - public boolean isImmutable() { - return false; - } - - @Override - public String getName() { - return null; - } - - @Override - public String getCatalogName() { - return null; - } - - @Override - public String getSchemaName() { - return null; - } - - @Override - public String getTableName() { - return null; - } - - @Override - public String getTableName(BiFunction namingFunction) { - return null; - } - - @Override - public boolean isQuoteRequired() { - return false; - } - - @Override - public NamingType getNamingType() { - return null; - } - - @Override - public GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; - } - - @Override - public VersionPropertyType getVersionPropertyType() { - return null; - } - - @Override - public TenantIdPropertyType getTenantIdPropertyType() { - return null; - } - - @Override - public List> getIdPropertyTypes() { - return null; - } - - @Override - public EntityPropertyType getEntityPropertyType(String __name) { - return null; - } - - @Override - public List> getEntityPropertyTypes() { - return null; - } - - @Override - public Emp newEntity(Map> __args) { - return null; - } - - @Override - public Class getEntityClass() { - return null; - } - - @Override - public void saveCurrentStates(Emp emp) {} - - @Override - public Emp getOriginalStates(Emp emp) { - return null; - } - - @Override - public void preInsert(Emp emp, PreInsertContext context) {} - - @Override - public void preUpdate(Emp emp, PreUpdateContext context) {} - - @Override - public void preDelete(Emp emp, PreDeleteContext context) {} - - @Override - public void postInsert(Emp emp, PostInsertContext context) {} - - @Override - public void postUpdate(Emp emp, PostUpdateContext context) {} - - @Override - public void postDelete(Emp emp, PostDeleteContext context) {} - - public static _Emp getSingletonInternal() { - return INSTANCE; - } -} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Dept.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Dept.java new file mode 100644 index 000000000..e94513800 --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Dept.java @@ -0,0 +1,11 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import org.seasar.doma.Entity; +import org.seasar.doma.Id; +import org.seasar.doma.Metamodel; + +@Entity(metamodel = @Metamodel(prefix = "Q")) +public class Dept { + @Id public Integer id; + public Name name; +} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Emp.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Emp.java similarity index 75% rename from doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Emp.java rename to doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Emp.java index 051de8f04..0692c4b6c 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Emp.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Emp.java @@ -1,12 +1,13 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; +package org.seasar.doma.internal.apt.processor.metamodel; import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.OptionalLong; import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; -@Entity +@Entity(metamodel = @Metamodel) public class Emp { public Integer id; public Name name; diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/EmpInfo.java similarity index 78% rename from doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo.java rename to doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/EmpInfo.java index 1c2bbfe7e..b5ce73f83 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EmpInfo.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/EmpInfo.java @@ -1,4 +1,4 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; +package org.seasar.doma.internal.apt.processor.metamodel; import java.time.LocalDate; import org.seasar.doma.Embeddable; diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest.java similarity index 74% rename from doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest.java rename to doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest.java index 72d86f319..b3b0f2690 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest.java @@ -1,4 +1,4 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; +package org.seasar.doma.internal.apt.processor.metamodel; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -14,16 +14,22 @@ import org.junit.jupiter.api.extension.TestTemplateInvocationContext; import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; import org.seasar.doma.internal.apt.CompilerSupport; -import org.seasar.doma.internal.apt.GeneratedClassNameParameterResolver; +import org.seasar.doma.internal.apt.CriteriaGeneratedClassNameParameterResolver; import org.seasar.doma.internal.apt.ResourceParameterResolver; import org.seasar.doma.internal.apt.SimpleParameterResolver; -import org.seasar.doma.internal.apt.processor.EntityDescProcessor; +import org.seasar.doma.internal.apt.processor.EntityProcessor; -class EntityDescProcessorTest extends CompilerSupport { +class MetamodelOptionTest extends CompilerSupport { + + private static final String PREFIX = "Q"; + private static final String SUFFIX = "Metamodel"; @BeforeEach void beforeEach() { addOption("-Adoma.test=true"); + addOption("-Adoma.metamodel.enabled=true"); + addOption("-Adoma.metamodel.prefix=" + PREFIX); + addOption("-Adoma.metamodel.suffix=" + SUFFIX); } @TestTemplate @@ -31,7 +37,7 @@ void beforeEach() { void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) throws Exception { addOption(options); - addProcessor(new EntityDescProcessor()); + addProcessor(new EntityProcessor()); addCompilationUnit(clazz); compile(); assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); @@ -47,7 +53,7 @@ public boolean supportsTestTemplate(ExtensionContext context) { @Override public Stream provideTestTemplateInvocationContexts( ExtensionContext context) { - return Stream.of(invocationContext(_Emp.class)); + return Stream.of(invocationContext(Emp.class), invocationContext(Person.class)); } private TestTemplateInvocationContext invocationContext( @@ -63,7 +69,7 @@ public List getAdditionalExtensions() { return Arrays.asList( new SimpleParameterResolver(compilationUnit), new ResourceParameterResolver(compilationUnit), - new GeneratedClassNameParameterResolver(compilationUnit), + new CriteriaGeneratedClassNameParameterResolver(compilationUnit, PREFIX, SUFFIX), new SimpleParameterResolver(options)); } }; diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest.java new file mode 100644 index 000000000..19161b76c --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest.java @@ -0,0 +1,164 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestTemplate; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestTemplateInvocationContext; +import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; +import org.seasar.doma.internal.apt.CompilerSupport; +import org.seasar.doma.internal.apt.CriteriaGeneratedClassNameParameterResolver; +import org.seasar.doma.internal.apt.ResourceParameterResolver; +import org.seasar.doma.internal.apt.SimpleParameterResolver; +import org.seasar.doma.internal.apt.processor.EntityProcessor; +import org.seasar.doma.message.Message; + +class MetamodelTest extends CompilerSupport { + + @BeforeEach + void beforeEach() { + addOption("-Adoma.test=true"); + } + + @TestTemplate + @ExtendWith(SuccessInvocationContextProvider.class) + void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) + throws Exception { + addOption(options); + addProcessor(new EntityProcessor()); + addCompilationUnit(clazz); + compile(); + assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); + assertTrue(getCompiledResult()); + } + + static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider { + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts( + ExtensionContext context) { + return Stream.of(invocationContext(Emp.class)); + } + + private TestTemplateInvocationContext invocationContext( + Class compilationUnit, String... options) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + return compilationUnit.getSimpleName(); + } + + @Override + public List getAdditionalExtensions() { + return Arrays.asList( + new SimpleParameterResolver(compilationUnit), + new ResourceParameterResolver(compilationUnit), + new CriteriaGeneratedClassNameParameterResolver(compilationUnit), + new SimpleParameterResolver(options)); + } + }; + } + } + + @TestTemplate + @ExtendWith(SuccessPrefixInvocationContextProvider.class) + void success_prefix( + Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options) + throws Exception { + addOption(options); + addProcessor(new EntityProcessor()); + addCompilationUnit(clazz); + compile(); + assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName); + assertTrue(getCompiledResult()); + } + + static class SuccessPrefixInvocationContextProvider + implements TestTemplateInvocationContextProvider { + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts( + ExtensionContext context) { + return Stream.of(invocationContext(Dept.class)); + } + + private TestTemplateInvocationContext invocationContext( + Class compilationUnit, String... options) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + return compilationUnit.getSimpleName(); + } + + @Override + public List getAdditionalExtensions() { + return Arrays.asList( + new SimpleParameterResolver(compilationUnit), + new ResourceParameterResolver(compilationUnit), + new CriteriaGeneratedClassNameParameterResolver(compilationUnit, "Q", ""), + new SimpleParameterResolver(options)); + } + }; + } + } + + @TestTemplate + @ExtendWith(ErrorInvocationContextProvider.class) + void error(Class clazz, Message message, String... options) throws Exception { + addOption(options); + addProcessor(new EntityProcessor()); + addCompilationUnit(clazz); + compile(); + assertFalse(getCompiledResult()); + assertMessage(message); + } + + static class ErrorInvocationContextProvider implements TestTemplateInvocationContextProvider { + @Override + public boolean supportsTestTemplate(ExtensionContext context) { + return true; + } + + @Override + public Stream provideTestTemplateInvocationContexts( + ExtensionContext context) { + return Stream.of( + invocationContext(Worker.class, Message.DOMA4455), + invocationContext(Salesman.class, Message.DOMA4455)); + } + + private TestTemplateInvocationContext invocationContext( + Class clazz, Message message, String... options) { + return new TestTemplateInvocationContext() { + @Override + public String getDisplayName(int invocationIndex) { + return clazz.getSimpleName(); + } + + @Override + public List getAdditionalExtensions() { + return Arrays.asList( + new SimpleParameterResolver(clazz), + new SimpleParameterResolver(message), + new SimpleParameterResolver(options)); + } + }; + } + } +} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Name.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Name.java similarity index 79% rename from doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Name.java rename to doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Name.java index e7b740c0d..cea2ab51f 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/Name.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Name.java @@ -1,4 +1,4 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; +package org.seasar.doma.internal.apt.processor.metamodel; import org.seasar.doma.Domain; diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Person.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Person.java new file mode 100644 index 000000000..5e082714e --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Person.java @@ -0,0 +1,9 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import org.seasar.doma.Entity; + +@Entity +public class Person { + public Integer id; + public Name name; +} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Salesman.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Salesman.java new file mode 100644 index 000000000..064e2012f --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Salesman.java @@ -0,0 +1,7 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; + +@Entity(metamodel = @Metamodel(prefix = "_", suffix = "")) +public class Salesman {} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Worker.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Worker.java new file mode 100644 index 000000000..69792bf46 --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/Worker.java @@ -0,0 +1,7 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; + +@Entity(metamodel = @Metamodel(prefix = "_")) +public class Worker {} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_EmpInfo.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_EmpInfo.java new file mode 100644 index 000000000..5e1f1e1ec --- /dev/null +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_EmpInfo.java @@ -0,0 +1,44 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.entity.EmbeddableType; +import org.seasar.doma.jdbc.entity.EntityPropertyType; +import org.seasar.doma.jdbc.entity.EntityType; +import org.seasar.doma.jdbc.entity.NamingType; +import org.seasar.doma.jdbc.entity.Property; + +public class _EmpInfo implements EmbeddableType { + @Override + public List> getEmbeddablePropertyTypes( + String embeddedPropertyName, Class entityClass, NamingType namingType) { + return null; + } + + @Override + public EmpInfo newEmbeddable( + String embeddedPropertyName, Map> __args) { + return null; + } + + public static _EmpInfo getSingletonInternal() { + return null; + } + + public static final class Metamodel { + + public final PropertyMetamodel hiredate; + + public Metamodel(EntityType entityType, String name) { + hiredate = new DefaultPropertyMetamodel<>(LocalDate.class, entityType, name + ".hiredate"); + } + + public List> allPropertyMetamodels() { + return Arrays.asList(hiredate); + } + } +} diff --git a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Name.java b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_Name.java similarity index 74% rename from doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Name.java rename to doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_Name.java index 00f50a44e..b8b5cde1d 100644 --- a/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/entitydesc/_Name.java +++ b/doma-processor/src/test/java/org/seasar/doma/internal/apt/processor/metamodel/_Name.java @@ -1,12 +1,12 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; +package org.seasar.doma.internal.apt.processor.metamodel; -import org.seasar.doma.internal.apt.processor.domain.Name; import org.seasar.doma.jdbc.domain.AbstractDomainType; +import org.seasar.doma.wrapper.StringWrapper; public class _Name extends AbstractDomainType { private _Name() { - super(() -> new org.seasar.doma.wrapper.StringWrapper()); + super(StringWrapper::new); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_AbstractEmbeddable.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_AbstractEmbeddable.txt index d0ad0f661..6d0b5f129 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_AbstractEmbeddable.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_AbstractEmbeddable.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.AbstractEmbeddable.class) public final class _AbstractEmbeddable implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,7 +13,7 @@ public final class _AbstractEmbeddable implements org.seasar.doma.jdbc.entity.Em @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".aaa", "", namingType, true, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".aaa", "", namingType, true, true, false)); } @Override @@ -29,4 +28,23 @@ public final class _AbstractEmbeddable implements org.seasar.doma.jdbc.entity.Em return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel aaa; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.aaa = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".aaa"); + java.util.List> __list = new java.util.ArrayList<>(1); + __list.add(this.aaa); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Address.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Address.txt index ab502b24a..da1c08f9b 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Address.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Address.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.Address.class) public final class _Address implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,8 +13,8 @@ public final class _Address implements org.seasar.doma.jdbc.entity.EmbeddableTyp @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".city", "", namingType, true, true, false), - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".street", "STREET", namingType, false, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".city", "", namingType, true, true, false), + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".street", "STREET", namingType, false, true, false)); } @Override @@ -32,4 +31,27 @@ public final class _Address implements org.seasar.doma.jdbc.entity.EmbeddableTyp return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel city; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel street; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.city = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".city"); + this.street = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".street"); + java.util.List> __list = new java.util.ArrayList<>(2); + __list.add(this.city); + __list.add(this.street); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Derived.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Derived.txt index c0eb2564d..2be312dd0 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Derived.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_Derived.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.Derived.class) public final class _Derived implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,8 +13,8 @@ public final class _Derived implements org.seasar.doma.jdbc.entity.EmbeddableTyp @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".aaa", "", namingType, true, true, false), - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".bbb", "", namingType, true, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".aaa", "", namingType, true, true, false), + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".bbb", "", namingType, true, true, false)); } @Override @@ -32,4 +31,27 @@ public final class _Derived implements org.seasar.doma.jdbc.entity.EmbeddableTyp return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel aaa; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel bbb; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.aaa = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".aaa"); + this.bbb = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".bbb"); + java.util.List> __list = new java.util.ArrayList<>(2); + __list.add(this.aaa); + __list.add(this.bbb); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokAllArgsConstructor.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokAllArgsConstructor.txt index dce660e08..3bfe92804 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokAllArgsConstructor.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokAllArgsConstructor.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.LombokAllArgsConstructor.class) public final class _LombokAllArgsConstructor implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,8 +13,8 @@ public final class _LombokAllArgsConstructor implements org.seasar.doma.jdbc.ent @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".street", "", namingType, true, true, false), - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".city", "", namingType, true, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".street", "", namingType, true, true, false), + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".city", "", namingType, true, true, false)); } @Override @@ -32,4 +31,27 @@ public final class _LombokAllArgsConstructor implements org.seasar.doma.jdbc.ent return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel street; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel city; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.street = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".street"); + this.city = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".city"); + java.util.List> __list = new java.util.ArrayList<>(2); + __list.add(this.street); + __list.add(this.city); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokValue.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokValue.txt index 57e21a602..60bd13a4a 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokValue.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_LombokValue.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.LombokValue.class) public final class _LombokValue implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,8 +13,8 @@ public final class _LombokValue implements org.seasar.doma.jdbc.entity.Embeddabl @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".street", "", namingType, true, true, false), - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".city", "", namingType, true, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".street", "", namingType, true, true, false), + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".city", "", namingType, true, true, false)); } @Override @@ -32,4 +31,27 @@ public final class _LombokValue implements org.seasar.doma.jdbc.entity.Embeddabl return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel street; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel city; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.street = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".street"); + this.city = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".city"); + java.util.List> __list = new java.util.ArrayList<>(2); + __list.add(this.street); + __list.add(this.city); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_NotTopLevel.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_NotTopLevel.txt index bcb0c9455..f417d4c52 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_NotTopLevel.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddable/EmbeddableProcessorTest_NotTopLevel.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.embeddable; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EmbeddableDesc(org.seasar.doma.internal.apt.processor.embeddable.NotTopLevel.Address.class) public final class _NotTopLevel__Address implements org.seasar.doma.jdbc.entity.EmbeddableType { static { @@ -14,8 +13,8 @@ public final class _NotTopLevel__Address implements org.seasar.doma.jdbc.entity. @Override public java.util.List> getEmbeddablePropertyTypes(String embeddedPropertyName, Class entityClass, org.seasar.doma.jdbc.entity.NamingType namingType) { return java.util.Arrays.asList( - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".city", "", namingType, true, true, false), - new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), embeddedPropertyName + ".street", "", namingType, true, true, false)); + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".city", "", namingType, true, true, false), + new org.seasar.doma.jdbc.entity.DefaultPropertyType(entityClass, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), embeddedPropertyName + ".street", "", namingType, true, true, false)); } @Override @@ -32,4 +31,27 @@ public final class _NotTopLevel__Address implements org.seasar.doma.jdbc.entity. return __singleton; } + /** */ + public static final class Metamodel { + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel city; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel street; + + public Metamodel(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { + this.city = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".city"); + this.street = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, entityType, name + ".street"); + java.util.List> __list = new java.util.ArrayList<>(2); + __list.add(this.city); + __list.add(this.street); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + + } } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest__Address.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest__Address.txt deleted file mode 100644 index 37d3475d2..000000000 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorOptionTest__Address.txt +++ /dev/null @@ -1,47 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -/** */ -@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -public final class QAddressDef implements org.seasar.doma.jdbc.criteria.def.EmbeddableDef { - - static { - org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); - } - - private final java.util.List> __allPropertyDefs; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef streetNo; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef city; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optional; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalDouble; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalInt; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalLong; - - public QAddressDef(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { - this.streetNo = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.Integer.class, entityType, name + ".streetNo"); - this.city = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(org.seasar.doma.internal.apt.processor.embeddabledesc.City.class, entityType, name + ".city"); - this.optional = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.String.class, entityType, name + ".optional"); - this.optionalDouble = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(double.class, entityType, name + ".optionalDouble"); - this.optionalInt = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(int.class, entityType, name + ".optionalInt"); - this.optionalLong = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(long.class, entityType, name + ".optionalLong"); - java.util.List> __list = new java.util.ArrayList<>(6); - __list.add(this.streetNo); - __list.add(this.city); - __list.add(this.optional); - __list.add(this.optionalDouble); - __list.add(this.optionalInt); - __list.add(this.optionalLong); - __allPropertyDefs = java.util.Collections.unmodifiableList(__list); - } - - @Override - public java.util.List> allPropertyDefs() { - return __allPropertyDefs; - } - -} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest__Address.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest__Address.txt deleted file mode 100644 index 2ae186a85..000000000 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/embeddabledesc/EmbeddableDescProcessorTest__Address.txt +++ /dev/null @@ -1,47 +0,0 @@ -package org.seasar.doma.internal.apt.processor.embeddabledesc; - -/** */ -@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -public final class Address_ implements org.seasar.doma.jdbc.criteria.def.EmbeddableDef { - - static { - org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); - } - - private final java.util.List> __allPropertyDefs; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef streetNo; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef city; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optional; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalDouble; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalInt; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalLong; - - public Address_(org.seasar.doma.jdbc.entity.EntityType entityType, String name) { - this.streetNo = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.Integer.class, entityType, name + ".streetNo"); - this.city = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(org.seasar.doma.internal.apt.processor.embeddabledesc.City.class, entityType, name + ".city"); - this.optional = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.String.class, entityType, name + ".optional"); - this.optionalDouble = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(double.class, entityType, name + ".optionalDouble"); - this.optionalInt = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(int.class, entityType, name + ".optionalInt"); - this.optionalLong = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(long.class, entityType, name + ".optionalLong"); - java.util.List> __list = new java.util.ArrayList<>(6); - __list.add(this.streetNo); - __list.add(this.city); - __list.add(this.optional); - __list.add(this.optionalDouble); - __list.add(this.optionalInt); - __list.add(this.optionalLong); - __allPropertyDefs = java.util.Collections.unmodifiableList(__list); - } - - @Override - public java.util.List> allPropertyDefs() { - return __allPropertyDefs; - } - -} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_AbstractEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_AbstractEntity.txt index 111fe0ccf..0c4721b9a 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_AbstractEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_AbstractEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.AbstractEntity.class) public final class _AbstractEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _AbstractEntity extends org.seasar.doma.jdbc.entity.AbstractE private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.AbstractEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _AbstractEntity extends org.seasar.doma.jdbc.entity.AbstractE private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _AbstractEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,13 +45,27 @@ public final class _AbstractEntity extends org.seasar.doma.jdbc.entity.AbstractE __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __idList.add($id); - __list.add($id); - __map.put("id", $id); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.AbstractEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -161,19 +174,22 @@ public final class _AbstractEntity extends org.seasar.doma.jdbc.entity.AbstractE return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_BytesPropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_BytesPropertyEntity.txt index 88a6ac5f5..3a999ec19 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_BytesPropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_BytesPropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.BytesPropertyEntity.class) public final class _BytesPropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _BytesPropertyEntity extends org.seasar.doma.jdbc.entity.Abst private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the bytes */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bytes = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.BytesPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BytesWrapper::new), "bytes", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _BytesPropertyEntity extends org.seasar.doma.jdbc.entity.Abst private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _BytesPropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _BytesPropertyEntity extends org.seasar.doma.jdbc.entity.Abst __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($bytes); - __map.put("bytes", $bytes); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("bytes", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.BytesPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BytesWrapper()), "bytes", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _BytesPropertyEntity extends org.seasar.doma.jdbc.entity.Abst return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2InheritingEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2InheritingEntity.txt index a9b52dfdb..1ec3e4881 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2InheritingEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2InheritingEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class) public final class _Child2InheritingEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _Child2InheritingEntity extends org.seasar.doma.jdbc.entity.A private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BigDecimalWrapper::new), "bbb", "", __namingType, true, true, false); - - /** the ccc */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $ccc = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "ccc", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _Child2InheritingEntity extends org.seasar.doma.jdbc.entity.A private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _Child2InheritingEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,16 +45,28 @@ public final class _Child2InheritingEntity extends org.seasar.doma.jdbc.entity.A __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); - __list.add($ccc); - __map.put("ccc", $ccc); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BigDecimalWrapper()), "bbb", "", __namingType, true, true, false)); + __map.put("ccc", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Child2InheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "ccc", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -170,19 +175,22 @@ public final class _Child2InheritingEntity extends org.seasar.doma.jdbc.entity.A return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2NoInheritingEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2NoInheritingEntity.txt index 952d5c5a7..f1b3e4da4 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2NoInheritingEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Child2NoInheritingEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.Child2NoInheritingEntity.class) public final class _Child2NoInheritingEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _Child2NoInheritingEntity extends org.seasar.doma.jdbc.entity private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Child2NoInheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Child2NoInheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "bbb", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,9 @@ public final class _Child2NoInheritingEntity extends org.seasar.doma.jdbc.entity private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _Child2NoInheritingEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -49,14 +45,27 @@ public final class _Child2NoInheritingEntity extends org.seasar.doma.jdbc.entity __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Child2NoInheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Child2NoInheritingEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "bbb", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -165,19 +174,22 @@ public final class _Child2NoInheritingEntity extends org.seasar.doma.jdbc.entity return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ChildEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ChildEntity.txt index 9410a17fe..af8c54938 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ChildEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ChildEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class) public final class _ChildEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _ChildEntity extends org.seasar.doma.jdbc.entity.AbstractEnti private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BigDecimalWrapper::new), "bbb", "", __namingType, true, true, false); - - /** the ccc */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $ccc = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "ccc", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _ChildEntity extends org.seasar.doma.jdbc.entity.AbstractEnti private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _ChildEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,16 +45,28 @@ public final class _ChildEntity extends org.seasar.doma.jdbc.entity.AbstractEnti __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); - __list.add($ccc); - __map.put("ccc", $ccc); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BigDecimalWrapper()), "bbb", "", __namingType, true, true, false)); + __map.put("ccc", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "ccc", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -170,19 +175,22 @@ public final class _ChildEntity extends org.seasar.doma.jdbc.entity.AbstractEnti return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_CommonChild.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_CommonChild.txt index c1f64415d..cef2e25ff 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_CommonChild.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_CommonChild.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.CommonChild.class) public final class _CommonChild extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _CommonChild extends org.seasar.doma.jdbc.entity.AbstractEnti private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _CommonChild() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _CommonChild extends org.seasar.doma.jdbc.entity.AbstractEnti __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _CommonChild extends org.seasar.doma.jdbc.entity.AbstractEnti return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Dept.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Dept.txt index ff7c7c024..4e3b705c0 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Dept.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Dept.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.Dept.class) public final class _Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Dept.class, __.org.seasar.doma.internal.apt.processor.entity._PrimaryKey.getSingletonInternal()::createScalar, "id", "", __namingType, false); - - /** the branch */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $branch = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Dept.class, __.org.seasar.doma.internal.apt.processor.entity._Branch.getSingletonInternal()::createScalar, "branch", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,9 @@ public final class _Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _Dept() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -49,15 +45,28 @@ public final class _Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType< __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($branch); - __map.put("branch", $branch); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.Dept.class, __.org.seasar.doma.internal.apt.processor.entity._PrimaryKey.getSingletonInternal()::createScalar, "id", "", __namingType, false)); + __map.put("branch", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Dept.class, __.org.seasar.doma.internal.apt.processor.entity._Branch.getSingletonInternal()::createScalar, "branch", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -166,19 +175,22 @@ public final class _Dept extends org.seasar.doma.jdbc.entity.AbstractEntityType< return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_DomainPropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_DomainPropertyEntity.txt index 152a409f6..7f79492a8 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_DomainPropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_DomainPropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class) public final class _DomainPropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -21,15 +20,6 @@ public final class _DomainPropertyEntity extends org.seasar.doma.jdbc.entity.Abs __idGenerator.initialize(); } - /** the id */ - public final org.seasar.doma.jdbc.entity.GeneratedIdPropertyType $id = new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Identifier.getSingletonInternal()::createScalar, "id", "", __namingType, false, __idGenerator); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Name.getSingletonInternal()::createScalar, "name", "", __namingType, true, true, false); - - /** the ver */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $ver = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Ver.getSingletonInternal()::createScalar, "ver", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -50,6 +40,9 @@ public final class _DomainPropertyEntity extends org.seasar.doma.jdbc.entity.Abs private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _DomainPropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -60,17 +53,29 @@ public final class _DomainPropertyEntity extends org.seasar.doma.jdbc.entity.Abs __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); - __list.add($ver); - __map.put("ver", $ver); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Identifier.getSingletonInternal()::createScalar, "id", "", __namingType, false, __idGenerator)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Name.getSingletonInternal()::createScalar, "name", "", __namingType, true, true, false)); + __map.put("ver", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.DomainPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Ver.getSingletonInternal()::createScalar, "ver", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -179,19 +184,22 @@ public final class _DomainPropertyEntity extends org.seasar.doma.jdbc.entity.Abs return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return $id; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("id"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $ver; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("ver"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Emp.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Emp.txt index 0b5999562..e202a1b06 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Emp.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Emp.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.Emp.class) public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -23,21 +22,6 @@ public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType $id = new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false, __idGenerator); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - - /** the salary */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $salary = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BigDecimalWrapper::new), "salary", "SALARY", __namingType, false, false, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "version", "", __namingType, false); - - /** the object */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $object = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.ObjectWrapper::new), "object", "", __namingType, true, true, false); - private final java.util.function.Supplier __listenerSupplier; private final boolean __immutable; @@ -58,6 +42,9 @@ public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _Emp() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -68,21 +55,31 @@ public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(5); - java.util.Map> __map = new java.util.HashMap<>(5); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); - __list.add($salary); - __map.put("salary", $salary); - __list.add($version); - __map.put("version", $version); - __list.add($object); - __map.put("object", $object); + java.util.Map> __map = new java.util.LinkedHashMap<>(5); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(5); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false, __idGenerator)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + __map.put("salary", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BigDecimalWrapper()), "salary", "SALARY", __namingType, false, false, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "version", "", __namingType, false)); + __map.put("object", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Emp.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.ObjectWrapper()), "object", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -191,19 +188,22 @@ public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType getGeneratedIdPropertyType() { - return $id; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("id"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override @@ -230,11 +230,11 @@ public final class _Emp extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _EnumPropertyEntity extends org.seasar.doma.jdbc.entity.Abstr private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(() -> new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.Hoge.class)), "id", "", __namingType, false); - - /** the hoge */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $hoge = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(() -> new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.Hoge.class)), "hoge", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,9 @@ public final class _EnumPropertyEntity extends org.seasar.doma.jdbc.entity.Abstr private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _EnumPropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -49,15 +45,28 @@ public final class _EnumPropertyEntity extends org.seasar.doma.jdbc.entity.Abstr __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($hoge); - __map.put("hoge", $hoge); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.Hoge.class)), "id", "", __namingType, false)); + __map.put("hoge", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.EnumPropertyEntity.Hoge.class)), "hoge", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -166,19 +175,22 @@ public final class _EnumPropertyEntity extends org.seasar.doma.jdbc.entity.Abstr return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener1Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener1Entity.txt index de82eccad..29d59da87 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener1Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener1Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.GenericListener1Entity.class) public final class _GenericListener1Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _GenericListener1Entity extends org.seasar.doma.jdbc.entity.A private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _GenericListener1Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _GenericListener1Entity extends org.seasar.doma.jdbc.entity.A __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _GenericListener1Entity extends org.seasar.doma.jdbc.entity.A return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener3Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener3Entity.txt index 67791627a..bbed48bf3 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener3Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener3Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.GenericListener3Entity.class) public final class _GenericListener3Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _GenericListener3Entity extends org.seasar.doma.jdbc.entity.A private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _GenericListener3Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _GenericListener3Entity extends org.seasar.doma.jdbc.entity.A __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _GenericListener3Entity extends org.seasar.doma.jdbc.entity.A return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener6Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener6Entity.txt index e8433d3b6..ae2b6a1e0 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener6Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_GenericListener6Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.GenericListener6Entity.class) public final class _GenericListener6Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _GenericListener6Entity extends org.seasar.doma.jdbc.entity.A private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _GenericListener6Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _GenericListener6Entity extends org.seasar.doma.jdbc.entity.A __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _GenericListener6Entity extends org.seasar.doma.jdbc.entity.A return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableChildEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableChildEntity.txt index af1648e92..be4ed3c59 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableChildEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableChildEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class) public final class _ImmutableChildEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _ImmutableChildEntity extends org.seasar.doma.jdbc.entity.Abs private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "bbb", "", __namingType, true, true, false); - - /** the ccc */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $ccc = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "ccc", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _ImmutableChildEntity extends org.seasar.doma.jdbc.entity.Abs private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _ImmutableChildEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -52,16 +45,28 @@ public final class _ImmutableChildEntity extends org.seasar.doma.jdbc.entity.Abs __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); - __list.add($ccc); - __map.put("ccc", $ccc); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "bbb", "", __namingType, true, true, false)); + __map.put("ccc", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "ccc", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -170,19 +175,22 @@ public final class _ImmutableChildEntity extends org.seasar.doma.jdbc.entity.Abs return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableEntity.txt index 75f0d4bc1..1be482b9b 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class) public final class _ImmutableEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _ImmutableEntity extends org.seasar.doma.jdbc.entity.Abstract private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveIntWrapper::new), "bbb", "", __namingType, true, true, false); - - /** the ccc */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $ccc = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "ccc", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _ImmutableEntity extends org.seasar.doma.jdbc.entity.Abstract private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _ImmutableEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -52,16 +45,28 @@ public final class _ImmutableEntity extends org.seasar.doma.jdbc.entity.Abstract __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); - __list.add($ccc); - __map.put("ccc", $ccc); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveIntWrapper()), "bbb", "", __namingType, true, true, false)); + __map.put("ccc", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "ccc", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -170,19 +175,22 @@ public final class _ImmutableEntity extends org.seasar.doma.jdbc.entity.Abstract return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableUser.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableUser.txt index debb155fc..de98b5d8d 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableUser.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ImmutableUser.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class) public final class _ImmutableUser extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _ImmutableUser extends org.seasar.doma.jdbc.entity.AbstractEn private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false); - - /** the address */ - public final org.seasar.doma.jdbc.entity.EmbeddedPropertyType $address = new org.seasar.doma.jdbc.entity.EmbeddedPropertyType<>("address", org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().getEmbeddablePropertyTypes("address", org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, __namingType)); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,8 @@ public final class _ImmutableUser extends org.seasar.doma.jdbc.entity.AbstractEn private final java.util.Map> __entityPropertyTypeMap; + private final java.util.Map> __embeddedPropertyTypeMap; + private _ImmutableUser() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -49,15 +44,29 @@ public final class _ImmutableUser extends org.seasar.doma.jdbc.entity.AbstractEn __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.addAll($address.getEmbeddablePropertyTypes()); - __map.putAll($address.getEmbeddablePropertyTypeMap()); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false)); + __embeddedMap.put("address", new org.seasar.doma.jdbc.entity.EmbeddedPropertyType("address", org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().getEmbeddablePropertyTypes("address", org.seasar.doma.internal.apt.processor.entity.ImmutableUser.class, __namingType))); + __map.putAll(__embeddedMap.get("address").getEmbeddablePropertyTypeMap()); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -166,19 +175,22 @@ public final class _ImmutableUser extends org.seasar.doma.jdbc.entity.AbstractEn return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokAllArgsConstructor.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokAllArgsConstructor.txt index 307d16c79..560c964ad 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokAllArgsConstructor.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokAllArgsConstructor.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.LombokAllArgsConstructor.class) public final class _LombokAllArgsConstructor extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _LombokAllArgsConstructor extends org.seasar.doma.jdbc.entity private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $id = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.LombokAllArgsConstructor.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveIntWrapper::new), "id", "", __namingType, true, true, false); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.LombokAllArgsConstructor.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,9 @@ public final class _LombokAllArgsConstructor extends org.seasar.doma.jdbc.entity private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _LombokAllArgsConstructor() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -49,14 +45,27 @@ public final class _LombokAllArgsConstructor extends org.seasar.doma.jdbc.entity __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.LombokAllArgsConstructor.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveIntWrapper()), "id", "", __namingType, true, true, false)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.LombokAllArgsConstructor.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -165,19 +174,22 @@ public final class _LombokAllArgsConstructor extends org.seasar.doma.jdbc.entity return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokValue.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokValue.txt index 67091970e..4062cb8cb 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokValue.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_LombokValue.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.LombokValue.class) public final class _LombokValue extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _LombokValue extends org.seasar.doma.jdbc.entity.AbstractEnti private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $id = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.LombokValue.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveIntWrapper::new), "id", "", __namingType, true, true, false); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.LombokValue.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,9 @@ public final class _LombokValue extends org.seasar.doma.jdbc.entity.AbstractEnti private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _LombokValue() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -49,14 +45,27 @@ public final class _LombokValue extends org.seasar.doma.jdbc.entity.AbstractEnti __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.LombokValue.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveIntWrapper()), "id", "", __namingType, true, true, false)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.LombokValue.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -165,19 +174,22 @@ public final class _LombokValue extends org.seasar.doma.jdbc.entity.AbstractEnti return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType1Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType1Entity.txt index 88f24f9f8..4e9ea6cc0 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType1Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType1Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.NamingType1Entity.class) public final class _NamingType1Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _NamingType1Entity extends org.seasar.doma.jdbc.entity.Abstra private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _NamingType1Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _NamingType1Entity extends org.seasar.doma.jdbc.entity.Abstra __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _NamingType1Entity extends org.seasar.doma.jdbc.entity.Abstra return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType2Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType2Entity.txt index 987e77059..003c9b8d8 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType2Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType2Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.NamingType2Entity.class) public final class _NamingType2Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _NamingType2Entity extends org.seasar.doma.jdbc.entity.Abstra private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _NamingType2Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _NamingType2Entity extends org.seasar.doma.jdbc.entity.Abstra __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _NamingType2Entity extends org.seasar.doma.jdbc.entity.Abstra return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType3Entity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType3Entity.txt index 71567fa29..367d954a9 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType3Entity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NamingType3Entity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.NamingType3Entity.class) public final class _NamingType3Entity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _NamingType3Entity extends org.seasar.doma.jdbc.entity.Abstra private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _NamingType3Entity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _NamingType3Entity extends org.seasar.doma.jdbc.entity.Abstra __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _NamingType3Entity extends org.seasar.doma.jdbc.entity.Abstra return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelEntity.txt index 8ac50fc84..041eff36c 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.NotTopLevelEntity.Hoge.class) public final class _NotTopLevelEntity__Hoge extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -33,6 +32,9 @@ public final class _NotTopLevelEntity__Hoge extends org.seasar.doma.jdbc.entity. private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _NotTopLevelEntity__Hoge() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -43,10 +45,25 @@ public final class _NotTopLevelEntity__Hoge extends org.seasar.doma.jdbc.entity. __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(0); - java.util.Map> __map = new java.util.HashMap<>(0); + java.util.Map> __map = new java.util.LinkedHashMap<>(0); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(0); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -155,19 +172,22 @@ public final class _NotTopLevelEntity__Hoge extends org.seasar.doma.jdbc.entity. return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelImmutableEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelImmutableEntity.txt index 025b6f0ed..7b3201f84 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelImmutableEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_NotTopLevelImmutableEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.NotTopLevelImmutableEntity.Hoge.class) public final class _NotTopLevelImmutableEntity__Hoge extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _NotTopLevelImmutableEntity__Hoge extends org.seasar.doma.jdb private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.NotTopLevelImmutableEntity.Hoge.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _NotTopLevelImmutableEntity__Hoge extends org.seasar.doma.jdb private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _NotTopLevelImmutableEntity__Hoge() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = true; @@ -46,12 +45,26 @@ public final class _NotTopLevelImmutableEntity__Hoge extends org.seasar.doma.jdb __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($name); - __map.put("name", $name); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.NotTopLevelImmutableEntity.Hoge.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _NotTopLevelImmutableEntity__Hoge extends org.seasar.doma.jdb return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalDoubleEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalDoubleEntity.txt index a8ec6bf24..f8118ecab 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalDoubleEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalDoubleEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class) public final class _OptionalDoubleEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _OptionalDoubleEntity extends org.seasar.doma.jdbc.entity.Abs private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "id", "", __namingType, false); - - /** the age */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $age = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "age", "", __namingType, true, true, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _OptionalDoubleEntity extends org.seasar.doma.jdbc.entity.Abs private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _OptionalDoubleEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,17 +45,29 @@ public final class _OptionalDoubleEntity extends org.seasar.doma.jdbc.entity.Abs __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($age); - __map.put("age", $age); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "id", "", __namingType, false)); + __map.put("age", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "age", "", __namingType, true, true, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalDoubleEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalDoubleScalar::new, "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -171,19 +176,22 @@ public final class _OptionalDoubleEntity extends org.seasar.doma.jdbc.entity.Abs return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalEntity.txt index e9dde08ab..4ce0c4575 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class) public final class _OptionalEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,24 +12,6 @@ public final class _OptionalEntity extends org.seasar.doma.jdbc.entity.AbstractE private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType> $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType> $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, org.seasar.doma.internal.apt.processor.entity._Name.getSingletonInternal()::createOptionalScalar, "name", "", __namingType, true, true, false); - - /** the city */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType> $city = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "city", "", __namingType, true, true, false); - - /** the weight */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType>> $weight = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, org.seasar.doma.internal.apt.processor.entity._Weight.getSingletonInternal()::createOptionalScalar, "weight", "", __namingType, true, true, false); - - /** the kind */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType> $kind = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(() -> new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.Kind.class)), "kind", "", __namingType, true, true, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType> $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(org.seasar.doma.wrapper.LongWrapper::new), "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -51,6 +32,9 @@ public final class _OptionalEntity extends org.seasar.doma.jdbc.entity.AbstractE private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _OptionalEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -61,23 +45,32 @@ public final class _OptionalEntity extends org.seasar.doma.jdbc.entity.AbstractE __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(6); - java.util.Map> __map = new java.util.HashMap<>(6); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); - __list.add($city); - __map.put("city", $city); - __list.add($weight); - __map.put("weight", $weight); - __list.add($kind); - __map.put("kind", $kind); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(6); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(6); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, org.seasar.doma.internal.apt.processor.entity._Name.getSingletonInternal()::createOptionalScalar, "name", "", __namingType, true, true, false)); + __map.put("city", new org.seasar.doma.jdbc.entity.DefaultPropertyType>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "city", "", __namingType, true, true, false)); + __map.put("weight", new org.seasar.doma.jdbc.entity.DefaultPropertyType>>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, org.seasar.doma.internal.apt.processor.entity._Weight.getSingletonInternal()::createOptionalScalar, "weight", "", __namingType, true, true, false)); + __map.put("kind", new org.seasar.doma.jdbc.entity.DefaultPropertyType>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(new org.seasar.doma.wrapper.EnumWrapper(org.seasar.doma.internal.apt.processor.entity.Kind.class)), "kind", "", __namingType, true, true, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType>(org.seasar.doma.internal.apt.processor.entity.OptionalEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.OptionalBasicScalar<>(new org.seasar.doma.wrapper.LongWrapper()), "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -186,19 +179,22 @@ public final class _OptionalEntity extends org.seasar.doma.jdbc.entity.AbstractE return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalIntEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalIntEntity.txt index 3b04d7f49..2a1ca008d 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalIntEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalIntEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class) public final class _OptionalIntEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _OptionalIntEntity extends org.seasar.doma.jdbc.entity.Abstra private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "id", "", __namingType, false); - - /** the age */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $age = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "age", "", __namingType, true, true, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _OptionalIntEntity extends org.seasar.doma.jdbc.entity.Abstra private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _OptionalIntEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,17 +45,29 @@ public final class _OptionalIntEntity extends org.seasar.doma.jdbc.entity.Abstra __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($age); - __map.put("age", $age); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "id", "", __namingType, false)); + __map.put("age", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "age", "", __namingType, true, true, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalIntEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalIntScalar::new, "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -171,19 +176,22 @@ public final class _OptionalIntEntity extends org.seasar.doma.jdbc.entity.Abstra return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalLongEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalLongEntity.txt index ae67db09b..0484f6f79 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalLongEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OptionalLongEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class) public final class _OptionalLongEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _OptionalLongEntity extends org.seasar.doma.jdbc.entity.Abstr private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "id", "", __namingType, false); - - /** the age */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $age = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "age", "", __namingType, true, true, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _OptionalLongEntity extends org.seasar.doma.jdbc.entity.Abstr private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _OptionalLongEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,17 +45,29 @@ public final class _OptionalLongEntity extends org.seasar.doma.jdbc.entity.Abstr __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($age); - __map.put("age", $age); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "id", "", __namingType, false)); + __map.put("age", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "age", "", __namingType, true, true, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.OptionalLongEntity.class, org.seasar.doma.internal.jdbc.scalar.OptionalLongScalar::new, "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -171,19 +176,22 @@ public final class _OptionalLongEntity extends org.seasar.doma.jdbc.entity.Abstr return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OriginalStatesChildEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OriginalStatesChildEntity.txt index 13ae99165..98ee68096 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OriginalStatesChildEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_OriginalStatesChildEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class) public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -15,15 +14,6 @@ public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entit private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the aaa */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $aaa = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "aaa", "", __namingType, true, true, false); - - /** the bbb */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bbb = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BigDecimalWrapper::new), "bbb", "", __namingType, true, true, false); - - /** the ccc */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $ccc = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "ccc", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -44,6 +34,9 @@ public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entit private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _OriginalStatesChildEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -54,16 +47,28 @@ public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entit __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __list.add($aaa); - __map.put("aaa", $aaa); - __list.add($bbb); - __map.put("bbb", $bbb); - __list.add($ccc); - __map.put("ccc", $ccc); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("aaa", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "aaa", "", __namingType, true, true, false)); + __map.put("bbb", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BigDecimalWrapper()), "bbb", "", __namingType, true, true, false)); + __map.put("ccc", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "ccc", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -172,19 +177,22 @@ public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entit return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override @@ -209,9 +217,9 @@ public final class _OriginalStatesChildEntity extends org.seasar.doma.jdbc.entit @Override public void saveCurrentStates(org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity __entity) { org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity __currentStates = new org.seasar.doma.internal.apt.processor.entity.OriginalStatesChildEntity(); - $aaa.copy(__currentStates, __entity); - $bbb.copy(__currentStates, __entity); - $ccc.copy(__currentStates, __entity); + (__entityPropertyTypeMap.get("aaa")).copy(__currentStates, __entity); + (__entityPropertyTypeMap.get("bbb")).copy(__currentStates, __entity); + (__entityPropertyTypeMap.get("ccc")).copy(__currentStates, __entity); __originalStatesAccessor.set(__entity, __currentStates); } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PackagePrivateEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PackagePrivateEntity.txt index 685a4ce8c..c9ddb56fc 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PackagePrivateEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PackagePrivateEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class) public final class _PackagePrivateEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -21,18 +20,6 @@ public final class _PackagePrivateEntity extends org.seasar.doma.jdbc.entity.Abs __idGenerator.initialize(); } - /** the id */ - public final org.seasar.doma.jdbc.entity.GeneratedIdPropertyType $id = new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false, __idGenerator); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - - /** the salary */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $salary = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.BigDecimalWrapper::new), "salary", "SALARY", __namingType, false, false, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -53,6 +40,9 @@ public final class _PackagePrivateEntity extends org.seasar.doma.jdbc.entity.Abs private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _PackagePrivateEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -63,19 +53,30 @@ public final class _PackagePrivateEntity extends org.seasar.doma.jdbc.entity.Abs __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(4); - java.util.Map> __map = new java.util.HashMap<>(4); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); - __list.add($salary); - __map.put("salary", $salary); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(4); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(4); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.GeneratedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false, __idGenerator)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + __map.put("salary", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.BigDecimalWrapper()), "salary", "SALARY", __namingType, false, false, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.PackagePrivateEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -184,19 +185,22 @@ public final class _PackagePrivateEntity extends org.seasar.doma.jdbc.entity.Abs return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return $id; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("id"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ParameterizedPropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ParameterizedPropertyEntity.txt index 5c6419640..b2e8a2857 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ParameterizedPropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_ParameterizedPropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.ParameterizedPropertyEntity.class) public final class _ParameterizedPropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _ParameterizedPropertyEntity extends org.seasar.doma.jdbc.ent private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the wight */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType> $wight = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.ParameterizedPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Weight.getSingletonInternal()::createScalar, "wight", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _ParameterizedPropertyEntity extends org.seasar.doma.jdbc.ent private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _ParameterizedPropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _ParameterizedPropertyEntity extends org.seasar.doma.jdbc.ent __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($wight); - __map.put("wight", $wight); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("wight", new org.seasar.doma.jdbc.entity.DefaultPropertyType>(org.seasar.doma.internal.apt.processor.entity.ParameterizedPropertyEntity.class, org.seasar.doma.internal.apt.processor.entity._Weight.getSingletonInternal()::createScalar, "wight", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _ParameterizedPropertyEntity extends org.seasar.doma.jdbc.ent return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrimitivePropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrimitivePropertyEntity.txt index 9d9cdc655..715f8a4a2 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrimitivePropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrimitivePropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class) public final class _PrimitivePropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _PrimitivePropertyEntity extends org.seasar.doma.jdbc.entity. private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveIntWrapper::new), "id", "", __namingType, false); - - /** the bool */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $bool = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveBooleanWrapper::new), "bool", "", __namingType, true, true, false); - - /** the version */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $version = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.PrimitiveLongWrapper::new), "version", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _PrimitivePropertyEntity extends org.seasar.doma.jdbc.entity. private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _PrimitivePropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,17 +45,29 @@ public final class _PrimitivePropertyEntity extends org.seasar.doma.jdbc.entity. __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($bool); - __map.put("bool", $bool); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveIntWrapper()), "id", "", __namingType, false)); + __map.put("bool", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveBooleanWrapper()), "bool", "", __namingType, true, true, false)); + __map.put("version", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.PrimitivePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.PrimitiveLongWrapper()), "version", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -171,19 +176,22 @@ public final class _PrimitivePropertyEntity extends org.seasar.doma.jdbc.entity. return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $version; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("version"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivateOriginalStatesEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivateOriginalStatesEntity.txt index 8746c8f05..4f049aacc 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivateOriginalStatesEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivateOriginalStatesEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity.class) public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -15,9 +14,6 @@ public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.ent private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -38,6 +34,9 @@ public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.ent private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _PrivateOriginalStatesEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -48,12 +47,26 @@ public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.ent __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($name); - __map.put("name", $name); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -162,19 +175,22 @@ public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.ent return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override @@ -197,7 +213,7 @@ public final class _PrivateOriginalStatesEntity extends org.seasar.doma.jdbc.ent @Override public void saveCurrentStates(org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity __entity) { org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity __currentStates = new org.seasar.doma.internal.apt.processor.entity.PrivateOriginalStatesEntity(); - $name.copy(__currentStates, __entity); + (__entityPropertyTypeMap.get("name")).copy(__currentStates, __entity); __originalStatesAccessor.set(__entity, __currentStates); } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivatePropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivatePropertyEntity.txt index 58e90dfee..3266b9443 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivatePropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_PrivatePropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.PrivatePropertyEntity.class) public final class _PrivatePropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _PrivatePropertyEntity extends org.seasar.doma.jdbc.entity.Ab private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.PrivatePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _PrivatePropertyEntity extends org.seasar.doma.jdbc.entity.Ab private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _PrivatePropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _PrivatePropertyEntity extends org.seasar.doma.jdbc.entity.Ab __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($name); - __map.put("name", $name); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.PrivatePropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _PrivatePropertyEntity extends org.seasar.doma.jdbc.entity.Ab return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_QuoteEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_QuoteEntity.txt index 93358139f..7417268f9 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_QuoteEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_QuoteEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class) public final class _QuoteEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,15 +12,6 @@ public final class _QuoteEntity extends org.seasar.doma.jdbc.entity.AbstractEnti private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, true); - - /** the name */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $name = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "name", "", __namingType, true, true, true); - - /** the version */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $version = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "version", "", __namingType, true, true, true); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -42,6 +32,9 @@ public final class _QuoteEntity extends org.seasar.doma.jdbc.entity.AbstractEnti private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _QuoteEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -52,17 +45,29 @@ public final class _QuoteEntity extends org.seasar.doma.jdbc.entity.AbstractEnti __isQuoteRequired = true; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(3); - java.util.Map> __map = new java.util.HashMap<>(3); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.add($name); - __map.put("name", $name); - __list.add($version); - __map.put("version", $version); + java.util.Map> __map = new java.util.LinkedHashMap<>(3); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(3); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, true)); + __map.put("name", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "name", "", __namingType, true, true, true)); + __map.put("version", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.QuoteEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "version", "", __namingType, true, true, true)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -171,19 +176,22 @@ public final class _QuoteEntity extends org.seasar.doma.jdbc.entity.AbstractEnti return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Room.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Room.txt index 6b53087fb..ba71982b3 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Room.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_Room.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.Room.class) public final class _Room extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _Room extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the colors */ - public final org.seasar.doma.jdbc.entity.DefaultPropertyType $colors = new org.seasar.doma.jdbc.entity.DefaultPropertyType<>(org.seasar.doma.internal.apt.processor.entity.Room.class, __.java.lang._String__ARRAY__.getSingletonInternal()::createScalar, "colors", "", __namingType, true, true, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _Room extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _Room() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _Room extends org.seasar.doma.jdbc.entity.AbstractEntityType< __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($colors); - __map.put("colors", $colors); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("colors", new org.seasar.doma.jdbc.entity.DefaultPropertyType(org.seasar.doma.internal.apt.processor.entity.Room.class, __.java.lang._String__ARRAY__.getSingletonInternal()::createScalar, "colors", "", __namingType, true, true, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _Room extends org.seasar.doma.jdbc.entity.AbstractEntityType< return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TenantIdEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TenantIdEntity.txt index baa3347f7..c4fcb2829 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TenantIdEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TenantIdEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.TenantIdEntity.class) public final class _TenantIdEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _TenantIdEntity extends org.seasar.doma.jdbc.entity.AbstractE private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the tenantDiscriminator */ - public final org.seasar.doma.jdbc.entity.TenantIdPropertyType $tenantDiscriminator = new org.seasar.doma.jdbc.entity.TenantIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.TenantIdEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.StringWrapper::new), "tenantDiscriminator", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _TenantIdEntity extends org.seasar.doma.jdbc.entity.AbstractE private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _TenantIdEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _TenantIdEntity extends org.seasar.doma.jdbc.entity.AbstractE __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($tenantDiscriminator); - __map.put("tenantDiscriminator", $tenantDiscriminator); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("tenantDiscriminator", new org.seasar.doma.jdbc.entity.TenantIdPropertyType(org.seasar.doma.internal.apt.processor.entity.TenantIdEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.StringWrapper()), "tenantDiscriminator", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _TenantIdEntity extends org.seasar.doma.jdbc.entity.AbstractE return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return $tenantDiscriminator; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("tenantDiscriminator"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TransientPropertyEntity.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TransientPropertyEntity.txt index a66feade8..bd05f549d 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TransientPropertyEntity.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_TransientPropertyEntity.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.TransientPropertyEntity.class) public final class _TransientPropertyEntity extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,9 +12,6 @@ public final class _TransientPropertyEntity extends org.seasar.doma.jdbc.entity. private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.VersionPropertyType $id = new org.seasar.doma.jdbc.entity.VersionPropertyType<>(org.seasar.doma.internal.apt.processor.entity.TransientPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -36,6 +32,9 @@ public final class _TransientPropertyEntity extends org.seasar.doma.jdbc.entity. private final java.util.Map> __entityPropertyTypeMap; + @SuppressWarnings("unused") + private final java.util.Map> __embeddedPropertyTypeMap; + private _TransientPropertyEntity() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -46,12 +45,26 @@ public final class _TransientPropertyEntity extends org.seasar.doma.jdbc.entity. __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(1); - java.util.Map> __map = new java.util.HashMap<>(1); - __list.add($id); - __map.put("id", $id); + java.util.Map> __map = new java.util.LinkedHashMap<>(1); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(1); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.VersionPropertyType(org.seasar.doma.internal.apt.processor.entity.TransientPropertyEntity.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false)); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -160,19 +173,22 @@ public final class _TransientPropertyEntity extends org.seasar.doma.jdbc.entity. return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return $id; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("id"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } @Override diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_User.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_User.txt index c964b53c8..5358d8b2e 100644 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_User.txt +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entity/EntityProcessorTest_User.txt @@ -2,7 +2,6 @@ package org.seasar.doma.internal.apt.processor.entity; /** */ @javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -@org.seasar.doma.internal.EntityDesc(org.seasar.doma.internal.apt.processor.entity.User.class) public final class _User extends org.seasar.doma.jdbc.entity.AbstractEntityType { static { @@ -13,12 +12,6 @@ public final class _User extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final org.seasar.doma.jdbc.entity.NamingType __namingType = null; - /** the id */ - public final org.seasar.doma.jdbc.entity.AssignedIdPropertyType $id = new org.seasar.doma.jdbc.entity.AssignedIdPropertyType<>(org.seasar.doma.internal.apt.processor.entity.User.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(org.seasar.doma.wrapper.IntegerWrapper::new), "id", "", __namingType, false); - - /** the address */ - public final org.seasar.doma.jdbc.entity.EmbeddedPropertyType $address = new org.seasar.doma.jdbc.entity.EmbeddedPropertyType<>("address", org.seasar.doma.internal.apt.processor.entity.User.class, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().getEmbeddablePropertyTypes("address", org.seasar.doma.internal.apt.processor.entity.User.class, __namingType)); - private final java.util.function.Supplier> __listenerSupplier; private final boolean __immutable; @@ -39,6 +32,8 @@ public final class _User extends org.seasar.doma.jdbc.entity.AbstractEntityType< private final java.util.Map> __entityPropertyTypeMap; + private final java.util.Map> __embeddedPropertyTypeMap; + private _User() { __listenerSupplier = () -> ListenerHolder.listener; __immutable = false; @@ -49,15 +44,29 @@ public final class _User extends org.seasar.doma.jdbc.entity.AbstractEntityType< __isQuoteRequired = false; java.util.List> __idList = new java.util.ArrayList<>(); java.util.List> __list = new java.util.ArrayList<>(2); - java.util.Map> __map = new java.util.HashMap<>(2); - __idList.add($id); - __list.add($id); - __map.put("id", $id); - __list.addAll($address.getEmbeddablePropertyTypes()); - __map.putAll($address.getEmbeddablePropertyTypeMap()); + java.util.Map> __map = new java.util.LinkedHashMap<>(2); + java.util.Map> __embeddedMap = new java.util.LinkedHashMap<>(2); + initializeMaps(__map, __embeddedMap); + initializeIdList(__map, __idList); + initializeList(__map, __list); __idPropertyTypes = java.util.Collections.unmodifiableList(__idList); __entityPropertyTypes = java.util.Collections.unmodifiableList(__list); __entityPropertyTypeMap = java.util.Collections.unmodifiableMap(__map); + __embeddedPropertyTypeMap = java.util.Collections.unmodifiableMap(__embeddedMap); + } + + private void initializeMaps(java.util.Map> __map, java.util.Map> __embeddedMap) { + __map.put("id", new org.seasar.doma.jdbc.entity.AssignedIdPropertyType(org.seasar.doma.internal.apt.processor.entity.User.class, () -> new org.seasar.doma.internal.jdbc.scalar.BasicScalar<>(new org.seasar.doma.wrapper.IntegerWrapper()), "id", "", __namingType, false)); + __embeddedMap.put("address", new org.seasar.doma.jdbc.entity.EmbeddedPropertyType("address", org.seasar.doma.internal.apt.processor.entity.User.class, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().getEmbeddablePropertyTypes("address", org.seasar.doma.internal.apt.processor.entity.User.class, __namingType))); + __map.putAll(__embeddedMap.get("address").getEmbeddablePropertyTypeMap()); + } + + private void initializeIdList(java.util.Map> __map, java.util.List> __idList) { + __idList.add(__map.get("id")); + } + + private void initializeList(java.util.Map> __map, java.util.List> __list) { + __list.addAll(__map.values()); } @Override @@ -166,26 +175,30 @@ public final class _User extends org.seasar.doma.jdbc.entity.AbstractEntityType< return __idPropertyTypes; } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.GeneratedIdPropertyType getGeneratedIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.GeneratedIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.VersionPropertyType getVersionPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.VersionPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.jdbc.entity.TenantIdPropertyType getTenantIdPropertyType() { - return null; + return (org.seasar.doma.jdbc.entity.TenantIdPropertyType)__entityPropertyTypeMap.get("null"); } + @SuppressWarnings("unchecked") @Override public org.seasar.doma.internal.apt.processor.entity.User newEntity(java.util.Map> __args) { org.seasar.doma.internal.apt.processor.entity.User entity = new org.seasar.doma.internal.apt.processor.entity.User(); if (__args.get("id") != null) __args.get("id").save(entity); - $address.save(entity, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().newEmbeddable("address", __args)); + ((org.seasar.doma.jdbc.entity.EmbeddedPropertyType)__embeddedPropertyTypeMap.get("address")).save(entity, org.seasar.doma.internal.apt.processor.entity._UserAddress.getSingletonInternal().newEmbeddable("address", __args)); return entity; } diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest__Emp.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest__Emp.txt deleted file mode 100644 index c89245412..000000000 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorOptionTest__Emp.txt +++ /dev/null @@ -1,51 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -/** */ -@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -public final class QEmpDef implements org.seasar.doma.jdbc.criteria.def.EntityDef { - - static { - org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); - } - - private final org.seasar.doma.internal.apt.processor.entitydesc._Emp __entityType = org.seasar.doma.internal.apt.processor.entitydesc._Emp.getSingletonInternal(); - - private final java.util.List> __allPropertyDefs; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef id = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.Integer.class, __entityType, "id"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef name = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(org.seasar.doma.internal.apt.processor.entitydesc.Name.class, __entityType, "name"); - - public final org.seasar.doma.internal.apt.processor.entitydesc.QEmpInfoDef empInfo = new org.seasar.doma.internal.apt.processor.entitydesc.QEmpInfoDef(__entityType, "empInfo"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optional = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.String.class, __entityType, "optional"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalDouble = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(double.class, __entityType, "optionalDouble"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalInt = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(int.class, __entityType, "optionalInt"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalLong = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(long.class, __entityType, "optionalLong"); - - public QEmpDef() { - java.util.ArrayList> __list = new java.util.ArrayList<>(7); - __list.add(id); - __list.add(name); - __list.addAll(empInfo.allPropertyDefs()); - __list.add(optional); - __list.add(optionalDouble); - __list.add(optionalInt); - __list.add(optionalLong); - __allPropertyDefs = java.util.Collections.unmodifiableList(__list); - } - - @Override - public org.seasar.doma.internal.apt.processor.entitydesc._Emp asType() { - return __entityType; - } - - @Override - public java.util.List> allPropertyDefs() { - return __allPropertyDefs; - } - -} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest__Emp.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest__Emp.txt deleted file mode 100644 index 7a98b0d4a..000000000 --- a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/entitydesc/EntityDescProcessorTest__Emp.txt +++ /dev/null @@ -1,51 +0,0 @@ -package org.seasar.doma.internal.apt.processor.entitydesc; - -/** */ -@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") -public final class Emp_ implements org.seasar.doma.jdbc.criteria.def.EntityDef { - - static { - org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); - } - - private final org.seasar.doma.internal.apt.processor.entitydesc._Emp __entityType = org.seasar.doma.internal.apt.processor.entitydesc._Emp.getSingletonInternal(); - - private final java.util.List> __allPropertyDefs; - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef id = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.Integer.class, __entityType, "id"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef name = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(org.seasar.doma.internal.apt.processor.entitydesc.Name.class, __entityType, "name"); - - public final org.seasar.doma.internal.apt.processor.entitydesc.EmpInfo_ empInfo = new org.seasar.doma.internal.apt.processor.entitydesc.EmpInfo_(__entityType, "empInfo"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optional = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(java.lang.String.class, __entityType, "optional"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalDouble = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(double.class, __entityType, "optionalDouble"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalInt = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(int.class, __entityType, "optionalInt"); - - public final org.seasar.doma.jdbc.criteria.def.PropertyDef optionalLong = new org.seasar.doma.jdbc.criteria.def.DefaultPropertyDef(long.class, __entityType, "optionalLong"); - - public Emp_() { - java.util.ArrayList> __list = new java.util.ArrayList<>(7); - __list.add(id); - __list.add(name); - __list.addAll(empInfo.allPropertyDefs()); - __list.add(optional); - __list.add(optionalDouble); - __list.add(optionalInt); - __list.add(optionalLong); - __allPropertyDefs = java.util.Collections.unmodifiableList(__list); - } - - @Override - public org.seasar.doma.internal.apt.processor.entitydesc._Emp asType() { - return __entityType; - } - - @Override - public java.util.List> allPropertyDefs() { - return __allPropertyDefs; - } - -} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Emp.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Emp.txt new file mode 100644 index 000000000..d54907955 --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Emp.txt @@ -0,0 +1,58 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class QEmpMetamodel implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.metamodel._Emp __entityType = org.seasar.doma.internal.apt.processor.metamodel._Emp.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Integer.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(org.seasar.doma.internal.apt.processor.metamodel.Name.class, __entityType, "name"); + + public final org.seasar.doma.internal.apt.processor.metamodel._EmpInfo.Metamodel empInfo = new org.seasar.doma.internal.apt.processor.metamodel._EmpInfo.Metamodel(__entityType, "empInfo"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optional = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "optional"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalDouble = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(double.class, __entityType, "optionalDouble"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalInt = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(int.class, __entityType, "optionalInt"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalLong = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(long.class, __entityType, "optionalLong"); + + public QEmpMetamodel() { + this(""); + } + + public QEmpMetamodel(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(7); + __list.add(id); + __list.add(name); + __list.addAll(empInfo.allPropertyMetamodels()); + __list.add(optional); + __list.add(optionalDouble); + __list.add(optionalInt); + __list.add(optionalLong); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + +} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Person.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Person.txt new file mode 100644 index 000000000..fce31dedc --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelOptionTest_Person.txt @@ -0,0 +1,43 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class QPersonMetamodel implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.metamodel._Person __entityType = org.seasar.doma.internal.apt.processor.metamodel._Person.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Integer.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(org.seasar.doma.internal.apt.processor.metamodel.Name.class, __entityType, "name"); + + public QPersonMetamodel() { + this(""); + } + + public QPersonMetamodel(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(2); + __list.add(id); + __list.add(name); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + +} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Dept.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Dept.txt new file mode 100644 index 000000000..a59301ddb --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Dept.txt @@ -0,0 +1,43 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class QDept implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.metamodel._Dept __entityType = org.seasar.doma.internal.apt.processor.metamodel._Dept.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Integer.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(org.seasar.doma.internal.apt.processor.metamodel.Name.class, __entityType, "name"); + + public QDept() { + this(""); + } + + public QDept(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(2); + __list.add(id); + __list.add(name); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + +} diff --git a/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Emp.txt b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Emp.txt new file mode 100644 index 000000000..459fd6e9d --- /dev/null +++ b/doma-processor/src/test/resources/org/seasar/doma/internal/apt/processor/metamodel/MetamodelTest_Emp.txt @@ -0,0 +1,58 @@ +package org.seasar.doma.internal.apt.processor.metamodel; + +/** */ +@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900") +public final class Emp_ implements org.seasar.doma.jdbc.criteria.metamodel.EntityMetamodel { + + static { + org.seasar.doma.internal.Artifact.validateVersion("@VERSION@"); + } + + private final String __qualifiedTableName; + + private final org.seasar.doma.internal.apt.processor.metamodel._Emp __entityType = org.seasar.doma.internal.apt.processor.metamodel._Emp.getSingletonInternal(); + + private final java.util.List> __allPropertyMetamodels; + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel id = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.Integer.class, __entityType, "id"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel name = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(org.seasar.doma.internal.apt.processor.metamodel.Name.class, __entityType, "name"); + + public final org.seasar.doma.internal.apt.processor.metamodel._EmpInfo.Metamodel empInfo = new org.seasar.doma.internal.apt.processor.metamodel._EmpInfo.Metamodel(__entityType, "empInfo"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optional = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(java.lang.String.class, __entityType, "optional"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalDouble = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(double.class, __entityType, "optionalDouble"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalInt = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(int.class, __entityType, "optionalInt"); + + public final org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel optionalLong = new org.seasar.doma.jdbc.criteria.metamodel.DefaultPropertyMetamodel(long.class, __entityType, "optionalLong"); + + public Emp_() { + this(""); + } + + public Emp_(String qualifiedTableName) { + this.__qualifiedTableName = java.util.Objects.requireNonNull(qualifiedTableName); + java.util.ArrayList> __list = new java.util.ArrayList<>(7); + __list.add(id); + __list.add(name); + __list.addAll(empInfo.allPropertyMetamodels()); + __list.add(optional); + __list.add(optionalDouble); + __list.add(optionalInt); + __list.add(optionalLong); + __allPropertyMetamodels = java.util.Collections.unmodifiableList(__list); + } + + @Override + public org.seasar.doma.jdbc.entity.EntityType asType() { + return __qualifiedTableName.isEmpty() ? __entityType : new org.seasar.doma.jdbc.criteria.metamodel.EntityTypeProxy<>(__entityType, __qualifiedTableName); + } + + @Override + public java.util.List> allPropertyMetamodels() { + return __allPropertyMetamodels; + } + +} diff --git a/gradle.properties b/gradle.properties index da0f1066f..80ad96aca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=org.seasar.doma -version=2.34.0 +version=2.35.0 encoding=UTF-8 systemProp.org.gradle.internal.publish.checksums.insecure=true projectUrl=https://github.com/domaframework/doma @@ -7,5 +7,5 @@ githubUrl=git@github.com:domaframework/doma.git sonatypeUsername= sonatypePassword= release.useAutomaticVersion=true -release.releaseVersion=2.34.0 -release.newVersion=2.34.1-SNAPSHOT +release.releaseVersion=2.35.0 +release.newVersion=2.35.1-SNAPSHOT diff --git a/test-criteria/src/main/java/example/Address.java b/test-criteria/src/main/java/example/Address.java index 22c067961..6650c5109 100644 --- a/test-criteria/src/main/java/example/Address.java +++ b/test-criteria/src/main/java/example/Address.java @@ -2,8 +2,9 @@ import org.seasar.doma.Entity; import org.seasar.doma.Id; +import org.seasar.doma.Metamodel; -@Entity +@Entity(metamodel = @Metamodel) public class Address { @Id private Integer addressId; private String street; diff --git a/test-criteria/src/main/java/example/Department.java b/test-criteria/src/main/java/example/Department.java index 661dd922a..d45bd044f 100644 --- a/test-criteria/src/main/java/example/Department.java +++ b/test-criteria/src/main/java/example/Department.java @@ -4,11 +4,12 @@ import java.util.List; import org.seasar.doma.Entity; import org.seasar.doma.Id; +import org.seasar.doma.Metamodel; import org.seasar.doma.OriginalStates; import org.seasar.doma.Transient; import org.seasar.doma.Version; -@Entity +@Entity(metamodel = @Metamodel) public class Department { @Id private Integer departmentId; diff --git a/test-criteria/src/main/java/example/DepartmentArchive.java b/test-criteria/src/main/java/example/DepartmentArchive.java new file mode 100644 index 000000000..ccd720189 --- /dev/null +++ b/test-criteria/src/main/java/example/DepartmentArchive.java @@ -0,0 +1,78 @@ +package example; + +import java.util.ArrayList; +import java.util.List; +import org.seasar.doma.Entity; +import org.seasar.doma.Id; +import org.seasar.doma.Metamodel; +import org.seasar.doma.OriginalStates; +import org.seasar.doma.Transient; +import org.seasar.doma.Version; + +@Entity(metamodel = @Metamodel) +public class DepartmentArchive { + + @Id private Integer departmentId; + private Integer departmentNo; + private String departmentName; + private String location; + @Version private Integer version; + @OriginalStates private DepartmentArchive originalStates; + @Transient private List employeeList = new ArrayList<>(); + + public Integer getDepartmentId() { + return departmentId; + } + + public void setDepartmentId(Integer departmentId) { + this.departmentId = departmentId; + } + + public Integer getDepartmentNo() { + return departmentNo; + } + + public void setDepartmentNo(Integer departmentNo) { + this.departmentNo = departmentNo; + } + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public DepartmentArchive getOriginalStates() { + return originalStates; + } + + public void setOriginalStates(DepartmentArchive originalStates) { + this.originalStates = originalStates; + } + + public List getEmployeeList() { + return employeeList; + } + + public void setEmployeeList(List employeeList) { + this.employeeList = employeeList; + } +} diff --git a/test-criteria/src/main/java/example/Employee.java b/test-criteria/src/main/java/example/Employee.java index 9475882fc..4607ea3d8 100644 --- a/test-criteria/src/main/java/example/Employee.java +++ b/test-criteria/src/main/java/example/Employee.java @@ -3,11 +3,12 @@ import java.time.LocalDate; import org.seasar.doma.Entity; import org.seasar.doma.Id; +import org.seasar.doma.Metamodel; import org.seasar.doma.OriginalStates; import org.seasar.doma.Transient; import org.seasar.doma.Version; -@Entity +@Entity(metamodel = @Metamodel) public class Employee { @Id private Integer employeeId; diff --git a/test-criteria/src/main/java/example/Person.java b/test-criteria/src/main/java/example/Person.java index 1cbee7cb4..085010a61 100644 --- a/test-criteria/src/main/java/example/Person.java +++ b/test-criteria/src/main/java/example/Person.java @@ -4,9 +4,10 @@ import java.util.Optional; import java.util.OptionalInt; import org.seasar.doma.Entity; +import org.seasar.doma.Metamodel; import org.seasar.doma.Table; -@Entity +@Entity(metamodel = @Metamodel) @Table(name = "EMPLOYEE") public class Person { diff --git a/test-criteria/src/test/java/example/DifferenceBetweenTwoDsls.java b/test-criteria/src/test/java/example/DifferenceBetweenTwoDsls.java new file mode 100644 index 000000000..0ec52c500 --- /dev/null +++ b/test-criteria/src/test/java/example/DifferenceBetweenTwoDsls.java @@ -0,0 +1,37 @@ +package example; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.criteria.Entityql; +import org.seasar.doma.jdbc.criteria.NativeSql; + +@ExtendWith(Env.class) +public class DifferenceBetweenTwoDsls { + + private final Entityql entityql; + private final NativeSql nativeSql; + + public DifferenceBetweenTwoDsls(Config config) { + this.entityql = new Entityql(config); + this.nativeSql = new NativeSql(config); + } + + @Test + void compare() { + Department_ d = new Department_(); + Employee_ e = new Employee_(); + + // (1) Use Entityql DSL + List list1 = + entityql.from(d).innerJoin(e, on -> on.eq(d.departmentId, e.departmentId)).fetch(); + + // (2) Use NativeSql DSL + List list2 = + nativeSql.from(d).innerJoin(e, on -> on.eq(d.departmentId, e.departmentId)).fetch(); + + System.out.println(list1.size()); // 3 + System.out.println(list2.size()); // 14 + } +} diff --git a/test-criteria/src/test/java/example/EntityqlBatchDeleteTest.java b/test-criteria/src/test/java/example/EntityqlBatchDeleteTest.java index a55a671b0..da3a97ecf 100644 --- a/test-criteria/src/test/java/example/EntityqlBatchDeleteTest.java +++ b/test-criteria/src/test/java/example/EntityqlBatchDeleteTest.java @@ -1,5 +1,6 @@ package example; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -8,6 +9,7 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.criteria.Entityql; @@ -27,19 +29,35 @@ void test() { List employees = entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); - List results = entityql.delete(e, employees).execute(); - assertEquals(employees, results); + BatchResult result = entityql.delete(e, employees).execute(); + assertArrayEquals(new int[] {1, 1}, result.getCounts()); + assertEquals(employees, result.getEntities()); List employees2 = entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); assertTrue(employees2.isEmpty()); } + @Test + void suppressOptimisticLockException() { + Employee_ e = new Employee_(); + + List employees = + entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); + employees.forEach(it -> it.setEmployeeId(100)); + + BatchResult result = + entityql + .delete(e, employees, settings -> settings.setSuppressOptimisticLockException(true)) + .execute(); + assertArrayEquals(new int[] {0, 0}, result.getCounts()); + } + @Test void empty() { Employee_ e = new Employee_(); - List results = entityql.delete(e, Collections.emptyList()).execute(); - assertTrue(results.isEmpty()); + BatchResult result = entityql.delete(e, Collections.emptyList()).execute(); + assertTrue(result.getEntities().isEmpty()); } } diff --git a/test-criteria/src/test/java/example/EntityqlBatchInsertTest.java b/test-criteria/src/test/java/example/EntityqlBatchInsertTest.java index b651eaee0..27b460c25 100644 --- a/test-criteria/src/test/java/example/EntityqlBatchInsertTest.java +++ b/test-criteria/src/test/java/example/EntityqlBatchInsertTest.java @@ -9,6 +9,7 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.criteria.Entityql; @@ -39,8 +40,8 @@ void test() { List departments = Arrays.asList(department, department2); - List results = entityql.insert(d, departments).execute(); - assertEquals(departments, results); + BatchResult result = entityql.insert(d, departments).execute(); + assertEquals(departments, result.getEntities()); List ids = departments.stream().map(Department::getDepartmentId).collect(toList()); @@ -57,7 +58,7 @@ void test() { void empty() { Employee_ e = new Employee_(); - List results = entityql.insert(e, Collections.emptyList()).execute(); - assertTrue(results.isEmpty()); + BatchResult result = entityql.insert(e, Collections.emptyList()).execute(); + assertTrue(result.getEntities().isEmpty()); } } diff --git a/test-criteria/src/test/java/example/EntityqlBatchUpdateTest.java b/test-criteria/src/test/java/example/EntityqlBatchUpdateTest.java index 84c85f96f..acce7ca0a 100644 --- a/test-criteria/src/test/java/example/EntityqlBatchUpdateTest.java +++ b/test-criteria/src/test/java/example/EntityqlBatchUpdateTest.java @@ -1,5 +1,6 @@ package example; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -8,6 +9,7 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.seasar.doma.jdbc.BatchResult; import org.seasar.doma.jdbc.Config; import org.seasar.doma.jdbc.criteria.Entityql; @@ -28,8 +30,9 @@ void test() { entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); employees.forEach(it -> it.setEmployeeName("aaa")); - List results = entityql.update(e, employees).execute(); - assertEquals(employees, results); + BatchResult result = entityql.update(e, employees).execute(); + assertArrayEquals(new int[] {1, 1}, result.getCounts()); + assertEquals(employees, result.getEntities()); List employees2 = entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); @@ -37,11 +40,30 @@ void test() { assertTrue(employees2.stream().allMatch(it -> "aaa".equals(it.getEmployeeName()))); } + @Test + void suppressOptimisticLockException() { + Employee_ e = new Employee_(); + + List employees = + entityql.from(e).where(c -> c.in(e.employeeId, Arrays.asList(5, 6))).fetch(); + employees.forEach( + it -> { + it.setEmployeeId(100); + it.setEmployeeName("aaa"); + }); + + BatchResult result = + entityql + .update(e, employees, settings -> settings.setSuppressOptimisticLockException(true)) + .execute(); + assertArrayEquals(new int[] {0, 0}, result.getCounts()); + } + @Test void empty() { Employee_ e = new Employee_(); - List results = entityql.update(e, Collections.emptyList()).execute(); - assertTrue(results.isEmpty()); + BatchResult result = entityql.update(e, Collections.emptyList()).execute(); + assertTrue(result.getEntities().isEmpty()); } } diff --git a/test-criteria/src/test/java/example/EntityqlDeleteTest.java b/test-criteria/src/test/java/example/EntityqlDeleteTest.java index 4b5153190..ccc6e6331 100644 --- a/test-criteria/src/test/java/example/EntityqlDeleteTest.java +++ b/test-criteria/src/test/java/example/EntityqlDeleteTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.criteria.Entityql; @ExtendWith(Env.class) @@ -24,10 +25,25 @@ void test() { Employee employee = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetchOne(); - Employee result = entityql.delete(e, employee).execute(); + Result result = entityql.delete(e, employee).execute(); + assertEquals(1, result.getCount()); + assertEquals(employee, result.getEntity()); - assertEquals(employee, result); List employees = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetch(); assertTrue(employees.isEmpty()); } + + @Test + void suppressOptimisticLockException() { + Employee_ e = new Employee_(); + + Employee employee = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetchOne(); + employee.setEmployeeId(100); + + Result result = + entityql + .delete(e, employee, settings -> settings.setSuppressOptimisticLockException(true)) + .execute(); + assertEquals(0, result.getCount()); + } } diff --git a/test-criteria/src/test/java/example/EntityqlInsertTest.java b/test-criteria/src/test/java/example/EntityqlInsertTest.java index 478c70b4d..3bdba06f1 100644 --- a/test-criteria/src/test/java/example/EntityqlInsertTest.java +++ b/test-criteria/src/test/java/example/EntityqlInsertTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.criteria.Entityql; @ExtendWith(Env.class) @@ -27,8 +28,8 @@ void test() { department.setDepartmentName("aaa"); department.setLocation("bbb"); - Department result = entityql.insert(d, department).execute(); - assertEquals(department, result); + Result result = entityql.insert(d, department).execute(); + assertEquals(department, result.getEntity()); Department department2 = entityql.from(d).where(c -> c.eq(d.departmentId, department.getDepartmentId())).fetchOne(); diff --git a/test-criteria/src/test/java/example/EntityqlSelectTest.java b/test-criteria/src/test/java/example/EntityqlSelectTest.java index 1b8cd8186..af298576b 100644 --- a/test-criteria/src/test/java/example/EntityqlSelectTest.java +++ b/test-criteria/src/test/java/example/EntityqlSelectTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; @@ -12,10 +13,12 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.Sql; import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.criteria.Entityql; import org.seasar.doma.jdbc.criteria.option.AssociationOption; +import org.seasar.doma.jdbc.criteria.statement.EmptyWhereClauseException; import org.seasar.doma.jdbc.criteria.statement.Listable; @ExtendWith(Env.class) @@ -39,6 +42,7 @@ void settings() { settings.setComment("all employees"); settings.setSqlLogType(SqlLogType.RAW); settings.setQueryTimeout(1000); + settings.setAllowEmptyWhere(true); settings.setFetchSize(100); settings.setMaxRows(100); }) @@ -46,6 +50,15 @@ void settings() { assertEquals(14, list.size()); } + @Test + void allowEmptyWhere_disabled() { + Employee_ e = new Employee_(); + + assertThrows( + EmptyWhereClauseException.class, + () -> entityql.from(e, settings -> settings.setAllowEmptyWhere(false)).fetch()); + } + @Test void fetch() { Employee_ e = new Employee_(); @@ -262,9 +275,6 @@ void associate() { @Test void associate_dynamic() { - Employee_ e = new Employee_(); - Department_ d = new Department_(); - List list = associate_dynamic(true); assertEquals(14, list.size()); assertTrue(list.stream().allMatch(emp -> emp.getDepartment() != null)); @@ -295,7 +305,7 @@ private List associate_dynamic(boolean join) { employee.setDepartment(department); department.getEmployeeList().add(employee); }, - AssociationOption.OPTIONAL) + AssociationOption.optional()) .fetch(); return list; @@ -371,4 +381,29 @@ void peek() { .peek(sql -> System.out.println(sql.getFormattedSql())) .fetch(); } + + @Test + void tableName_replacement() { + Employee_ e = new Employee_(); + Department_ d = new Department_("DEPARTMENT_ARCHIVE"); + + Department department = new Department(); + department.setDepartmentId(1); + department.setDepartmentNo(1); + department.setDepartmentName("aaa"); + department.setLocation("bbb"); + + Result result = entityql.insert(d, department).execute(); + assertEquals(1, result.getCount()); + + List list = + entityql + .from(d) + .innerJoin(e, on -> on.eq(d.departmentId, e.departmentId)) + .associate(d, e, (dept, employee) -> dept.getEmployeeList().add(employee)) + .fetch(); + + assertEquals(1, list.size()); + assertEquals(3, list.get(0).getEmployeeList().size()); + } } diff --git a/test-criteria/src/test/java/example/EntityqlUpdateTest.java b/test-criteria/src/test/java/example/EntityqlUpdateTest.java index 14bdf7de6..ed4d00f7c 100644 --- a/test-criteria/src/test/java/example/EntityqlUpdateTest.java +++ b/test-criteria/src/test/java/example/EntityqlUpdateTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.Result; import org.seasar.doma.jdbc.criteria.Entityql; @ExtendWith(Env.class) @@ -26,12 +27,28 @@ void test() { employee.setEmployeeName("aaa"); employee.setSalary(new Salary("2000")); - Employee result = entityql.update(e, employee).execute(); - assertEquals(employee, result); + Result result = entityql.update(e, employee).execute(); + assertEquals(1, result.getCount()); + assertEquals(employee, result.getEntity()); Employee employee2 = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetchOne(); assertNotNull(employee2); assertEquals("aaa", employee2.getEmployeeName()); assertEquals(0, new BigDecimal("2000").compareTo(employee2.getSalary().getValue())); } + + @Test + void suppressOptimisticLockException() { + Employee_ e = new Employee_(); + + Employee employee = entityql.from(e).where(c -> c.eq(e.employeeId, 5)).fetchOne(); + employee.setEmployeeId(100); + employee.setEmployeeName("aaa"); + + Result result = + entityql + .update(e, employee, settings -> settings.setSuppressOptimisticLockException(true)) + .execute(); + assertEquals(0, result.getCount()); + } } diff --git a/test-criteria/src/test/java/example/Env.java b/test-criteria/src/test/java/example/Env.java index c04cae112..7d749faa9 100644 --- a/test-criteria/src/test/java/example/Env.java +++ b/test-criteria/src/test/java/example/Env.java @@ -103,6 +103,7 @@ public Object resolveParameter( + "CREATE SEQUENCE MY_SEQUENCE_STRATEGY_ID START WITH 1 INCREMENT BY 100;\n" + "CREATE SEQUENCE PERSON_ID_SEQUENCE START WITH 1 INCREMENT BY 100;\n" + "CREATE TABLE DEPARTMENT(DEPARTMENT_ID INTEGER NOT NULL PRIMARY KEY, DEPARTMENT_NO INTEGER NOT NULL UNIQUE,DEPARTMENT_NAME VARCHAR(20),LOCATION VARCHAR(20) DEFAULT 'TOKYO', VERSION INTEGER);\n" + + "CREATE TABLE DEPARTMENT_ARCHIVE(DEPARTMENT_ID INTEGER NOT NULL PRIMARY KEY, DEPARTMENT_NO INTEGER NOT NULL UNIQUE,DEPARTMENT_NAME VARCHAR(20),LOCATION VARCHAR(20) DEFAULT 'TOKYO', VERSION INTEGER);\n" + "CREATE TABLE ADDRESS(ADDRESS_ID INTEGER NOT NULL PRIMARY KEY, STREET VARCHAR(20) UNIQUE, VERSION INTEGER);\n" + "CREATE TABLE EMPLOYEE(EMPLOYEE_ID INTEGER NOT NULL PRIMARY KEY, EMPLOYEE_NO INTEGER NOT NULL ,EMPLOYEE_NAME VARCHAR(20),MANAGER_ID INTEGER,HIREDATE DATE,SALARY NUMERIC(7,2),DEPARTMENT_ID INTEGER,ADDRESS_ID INTEGER,VERSION INTEGER, CONSTRAINT FK_DEPARTMENT_ID FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(DEPARTMENT_ID), CONSTRAINT FK_ADDRESS_ID FOREIGN KEY(ADDRESS_ID) REFERENCES ADDRESS(ADDRESS_ID));\n" + "CREATE TABLE PERSON(PERSON_ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR(20), CREATED_AT TIMESTAMP, UPDATED_AT TIMESTAMP, VERSION INTEGER);\n" diff --git a/test-criteria/src/test/java/example/MetamodelTest.java b/test-criteria/src/test/java/example/MetamodelTest.java new file mode 100644 index 000000000..41db4b43f --- /dev/null +++ b/test-criteria/src/test/java/example/MetamodelTest.java @@ -0,0 +1,67 @@ +package example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.seasar.doma.DomaIllegalArgumentException; +import org.seasar.doma.jdbc.entity.EntityType; + +public class MetamodelTest { + + @Test + void tableName() { + Employee_ e = new Employee_("MY_EMP"); + EntityType entityType = e.asType(); + String tableName = entityType.getQualifiedTableName(null, null); + assertEquals("MY_EMP", tableName); + } + + @Test + void tableName_single_quotation() { + DomaIllegalArgumentException ex = + assertThrows( + DomaIllegalArgumentException.class, + () -> { + Employee_ e = new Employee_("ab'c"); + e.asType(); + }); + System.out.println(ex.getMessage()); + } + + @Test + void tableName_semicolon() { + DomaIllegalArgumentException ex = + assertThrows( + DomaIllegalArgumentException.class, + () -> { + Employee_ e = new Employee_("ab;c"); + e.asType(); + }); + System.out.println(ex.getMessage()); + } + + @Test + void tableName_two_hyphens() { + DomaIllegalArgumentException ex = + assertThrows( + DomaIllegalArgumentException.class, + () -> { + Employee_ e = new Employee_("ab--c"); + e.asType(); + }); + System.out.println(ex.getMessage()); + } + + @Test + void tableName_slash() { + DomaIllegalArgumentException ex = + assertThrows( + DomaIllegalArgumentException.class, + () -> { + Employee_ e = new Employee_("ab/*c"); + e.asType(); + }); + System.out.println(ex.getMessage()); + } +} diff --git a/test-criteria/src/test/java/example/NativeSqlInsertTest.java b/test-criteria/src/test/java/example/NativeSqlInsertTest.java index f10fbbe27..a69f6930b 100644 --- a/test-criteria/src/test/java/example/NativeSqlInsertTest.java +++ b/test-criteria/src/test/java/example/NativeSqlInsertTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.Arrays; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; @@ -63,4 +64,51 @@ void insert() { assertEquals(1, count); } + + @Test + void insert_select_entity() { + DepartmentArchive_ da = new DepartmentArchive_(); + Department_ d = new Department_(); + + int count = + nativeSql + .insert(da) + .select(c -> c.from(d).where(cc -> cc.in(d.departmentId, Arrays.asList(1, 2))).select()) + .execute(); + + assertEquals(2, count); + } + + @Test + void insert_select_properties() { + DepartmentArchive_ da = new DepartmentArchive_(); + Department_ d = new Department_(); + + int count = + nativeSql + .insert(da) + .select( + c -> + c.from(d) + .where(cc -> cc.in(d.departmentId, Arrays.asList(1, 2))) + .select( + d.departmentId, + d.departmentNo, + d.departmentName, + d.location, + d.version)) + .execute(); + + assertEquals(2, count); + } + + @Test + void insert_select_using_same_entityMetamodel() { + Department_ da = new Department_("DEPARTMENT_ARCHIVE"); + Department_ d = new Department_(); + + int count = nativeSql.insert(da).select(c -> c.from(d).select()).execute(); + + assertEquals(4, count); + } } diff --git a/test-criteria/src/test/java/example/NativeSqlSelectTest.java b/test-criteria/src/test/java/example/NativeSqlSelectTest.java index b669e2f3d..f6e71ece6 100644 --- a/test-criteria/src/test/java/example/NativeSqlSelectTest.java +++ b/test-criteria/src/test/java/example/NativeSqlSelectTest.java @@ -3,9 +3,21 @@ import static java.util.stream.Collectors.counting; import static java.util.stream.Collectors.groupingBy; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.count; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.min; -import static org.seasar.doma.jdbc.criteria.AggregateFunctions.sum; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.add; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.count; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.countDistinct; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.div; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.min; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.mod; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.mul; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.sub; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.sum; import java.math.BigDecimal; import java.util.List; @@ -14,9 +26,13 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.seasar.doma.jdbc.Config; +import org.seasar.doma.jdbc.SqlLogType; import org.seasar.doma.jdbc.criteria.NativeSql; -import org.seasar.doma.jdbc.criteria.def.PropertyDef; +import org.seasar.doma.jdbc.criteria.metamodel.PropertyMetamodel; +import org.seasar.doma.jdbc.criteria.statement.EmptyWhereClauseException; +import org.seasar.doma.jdbc.criteria.tuple.Row; import org.seasar.doma.jdbc.criteria.tuple.Tuple2; +import org.seasar.doma.jdbc.criteria.tuple.Tuple3; @ExtendWith(Env.class) public class NativeSqlSelectTest { @@ -27,6 +43,35 @@ public NativeSqlSelectTest(Config config) { this.nativeSql = new NativeSql(config); } + @Test + void settings() { + Employee_ e = new Employee_(); + + List list = + nativeSql + .from( + e, + settings -> { + settings.setComment("all employees"); + settings.setSqlLogType(SqlLogType.RAW); + settings.setQueryTimeout(1000); + settings.setAllowEmptyWhere(true); + settings.setFetchSize(100); + settings.setMaxRows(100); + }) + .fetch(); + assertEquals(14, list.size()); + } + + @Test + void fetch_allowEmptyWhere_disabled() { + Employee_ e = new Employee_(); + + assertThrows( + EmptyWhereClauseException.class, + () -> nativeSql.from(e, settings -> settings.setAllowEmptyWhere(false)).fetch()); + } + @Test void from() { Employee_ e = new Employee_(); @@ -62,6 +107,69 @@ void collect() { void select() { Employee_ e = new Employee_(); + List list = nativeSql.from(e).select().fetch(); + + assertEquals(14, list.size()); + Employee employee = list.get(0); + assertEquals("SMITH", employee.getEmployeeName()); + } + + @Test + void select_entity() { + Employee_ e = new Employee_(); + + List list = nativeSql.from(e).select(e).fetch(); + + assertEquals(14, list.size()); + Employee employee = list.get(0); + assertEquals("SMITH", employee.getEmployeeName()); + } + + @Test + void select_entities_tuple2() { + Employee_ e = new Employee_(); + Department_ d = new Department_(); + + List> list = + nativeSql + .from(e) + .innerJoin(d, on -> on.eq(e.departmentId, d.departmentId)) + .select(e, d) + .fetch(); + + assertEquals(14, list.size()); + Tuple2 tuple2 = list.get(0); + Employee employee = tuple2.getItem1(); + Department department = tuple2.getItem2(); + assertEquals("SMITH", employee.getEmployeeName()); + assertEquals("RESEARCH", department.getDepartmentName()); + } + + @Test + void select_entities_tuple2_emptyEntity() { + Employee_ e = new Employee_(); + Department_ d = new Department_(); + + List> list = + nativeSql + .from(d) + .leftJoin(e, on -> on.eq(d.departmentId, e.departmentId)) + .where(c -> c.eq(d.departmentId, 4)) + .select(d, e) + .fetch(); + + assertEquals(1, list.size()); + Tuple2 tuple2 = list.get(0); + Department department = tuple2.getItem1(); + assertEquals("OPERATIONS", department.getDepartmentName()); + Employee employee = tuple2.getItem2(); + assertNull(employee); + } + + @Test + void select_property() { + Employee_ e = new Employee_(); + List list = nativeSql.from(e).select(e.employeeName).fetch(); assertEquals(14, list.size()); @@ -69,7 +177,7 @@ void select() { } @Test - void select_tuple2() { + void select_properties_tuple2() { Employee_ e = new Employee_(); List> list = @@ -98,35 +206,26 @@ void select_collect() { } @Test - void selectAsList() { + void selectAsRow() { Employee_ e = new Employee_(); - List> list = + List list = nativeSql .from(e) .orderBy(c -> c.asc(e.employeeId)) - .select(new PropertyDef[] {e.employeeId, e.employeeName}) + .select(e.employeeId, new PropertyMetamodel[] {e.employeeName}) .fetch(); assertEquals(14, list.size()); - List row = list.get(0); + Row row = list.get(0); assertEquals(2, row.size()); - assertEquals(1, row.get(0)); - assertEquals("SMITH", row.get(1)); - } - - @Test - void selectAsList_emptySelect() { - Employee_ e = new Employee_(); - - List> list = nativeSql.from(e).orderBy(c -> c.asc(e.employeeId)).select().fetch(); - - assertEquals(14, list.size()); - List row = list.get(0); - assertEquals(9, row.size()); - assertEquals(1, row.get(0)); - assertEquals(7369, row.get(1)); - assertEquals("SMITH", row.get(2)); + assertTrue(row.containsKey(e.employeeId)); + assertEquals(1, row.get(e.employeeId)); + assertTrue(row.containsKey(e.employeeName)); + assertEquals("SMITH", row.get(e.employeeName)); + assertFalse(row.containsKey(e.hiredate)); + assertNotNull(row.keySet()); + assertNotNull(row.values()); } @Test @@ -147,6 +246,14 @@ void aggregate() { assertEquals(0, salary.getValue().compareTo(new BigDecimal("29025"))); } + @Test + void aggregate_countDistinct() { + Employee_ e = new Employee_(); + + Long count = nativeSql.from(e).select(countDistinct(e.departmentId)).fetchOne(); + assertEquals(3, count); + } + @Test void groupBy() { Employee_ e = new Employee_(); @@ -333,4 +440,85 @@ void peek() { .peek(sql -> System.out.println(sql.getFormattedSql())) .fetch(); } + + @Test + void expressions_add() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select(add(e.version, 1), add(1, e.version), add(e.departmentId, e.version)) + .fetch(); + + assertEquals(14, list.size()); + } + + @Test + void expressions_sub() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select(sub(e.version, 1), sub(1, e.version), sub(e.departmentId, e.version)) + .fetch(); + + assertEquals(14, list.size()); + } + + @Test + void expressions_mul() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select(mul(e.version, 1), mul(1, e.version), mul(e.departmentId, e.version)) + .fetch(); + + assertEquals(14, list.size()); + } + + @Test + void expressions_div() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select(div(e.version, 1), div(1, e.version), div(e.departmentId, e.version)) + .fetch(); + + assertEquals(14, list.size()); + } + + @Test + void expressions_mod() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select(mod(e.version, 1), mod(1, e.version), mod(e.departmentId, e.version)) + .fetch(); + + assertEquals(14, list.size()); + } + + @Test + void expressions_concat() { + Employee_ e = new Employee_(); + + List> list = + nativeSql + .from(e) + .select( + concat(e.employeeName, "a"), + concat("b", e.employeeName), + concat(e.employeeName, e.employeeName)) + .fetch(); + + assertEquals(14, list.size()); + } } diff --git a/test-criteria/src/test/java/example/NativeSqlUpdateTest.java b/test-criteria/src/test/java/example/NativeSqlUpdateTest.java index 1169ef679..33a3fe7f3 100644 --- a/test-criteria/src/test/java/example/NativeSqlUpdateTest.java +++ b/test-criteria/src/test/java/example/NativeSqlUpdateTest.java @@ -1,7 +1,11 @@ package example; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.add; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.concat; +import static org.seasar.doma.jdbc.criteria.expression.Expressions.literal; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -84,4 +88,40 @@ void where_empty_allowEmptyWhere_enabled() { assertEquals(14, count); } + + @Test + void expression_add() { + Employee_ e = new Employee_(); + + int count = + nativeSql + .update(e) + .set(c -> c.value(e.version, add(e.version, 10))) + .where(c -> c.eq(e.employeeId, 1)) + .execute(); + + assertEquals(1, count); + + Employee employee = nativeSql.from(e).where(c -> c.eq(e.employeeId, 1)).fetchOne(); + assertNotNull(employee); + assertEquals(11, employee.getVersion()); + } + + @Test + void expressions() { + Employee_ e = new Employee_(); + + int count = + nativeSql + .update(e) + .set( + c -> { + c.value(e.employeeName, concat("[", concat(e.employeeName, "]"))); + c.value(e.version, add(e.version, literal(1))); + }) + .where(c -> c.eq(e.employeeId, 1)) + .execute(); + + assertEquals(1, count); + } } diff --git a/test-criteria/src/test/kotlin/example/KotlinTest.kt b/test-criteria/src/test/kotlin/example/KotlinTest.kt index 9819975f0..8af2f302d 100644 --- a/test-criteria/src/test/kotlin/example/KotlinTest.kt +++ b/test-criteria/src/test/kotlin/example/KotlinTest.kt @@ -4,9 +4,9 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.seasar.doma.jdbc.Config -import org.seasar.doma.jdbc.criteria.AggregateFunctions.count import org.seasar.doma.jdbc.criteria.Entityql import org.seasar.doma.jdbc.criteria.NativeSql +import org.seasar.doma.jdbc.criteria.expression.Expressions.count import org.seasar.doma.jdbc.criteria.tuple.Tuple2 import org.seasar.doma.jdbc.criteria.tuple.Tuple3