diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 9755bd70284098d4721dd4304fbbc95645c6d5ac..0d58bd76a18481693fb381a5f0beb7334825b0a2 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-api diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index 7243d49739b66893a14cf22c0578287724a0664c..303c5d2bb040782bf9874aaf505fa47ed902c311 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -57,6 +57,12 @@ public @interface Aggregate { @AliasFor(annotation = Entity.class) Class factory() default Object.class; + /** + * @see Entity + */ + @AliasFor(annotation = Entity.class) + boolean aggregate() default true; + /** * @see Entity */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index 21dbba2a0d453e562cc9f57b670438d4e294559d..261c013c680c7be4b5786d1e42ad2d68d103d8ee 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -46,6 +46,11 @@ public @interface Entity { */ Class factory() default Object.class; + /** + * 是否聚合 + */ + boolean aggregate() default false; + /** * 指定仓储 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index 72f331b12dc8ff4bf1327354d2ee74e0f9be6d85..fc28e0691aa24067cccae2fe3d0af535e2e25637 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -36,7 +36,7 @@ public @interface Field { /** * 是否主键 */ - boolean isId() default false; + boolean id() default false; /** * 别名 @@ -50,6 +50,11 @@ public @interface Field { @AliasFor("value") String alias() default ""; + /** + * 是否值对象 + */ + boolean valueObj() default false; + /** * 映射表达式 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java index 169be88eddcf08a02f921ea483ae1fec6f5f9719..d1716eb10fcab550650281339cc1f203f44c9391 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -34,7 +34,7 @@ import java.lang.annotation.Target; public @interface Id { @AliasFor(annotation = Field.class) - boolean isId() default true; + boolean id() default true; @AliasFor(annotation = Field.class) String value() default "id"; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java new file mode 100644 index 0000000000000000000000000000000000000000..752f755d886166eff614276965875d7de34f0251 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.annotation; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Field +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ValueObj { + + @AliasFor(annotation = Field.class) + String value() default ""; + + @AliasFor(annotation = Field.class) + boolean valueObj() default true; + + @AliasFor(annotation = Field.class) + Class converter() default Object.class; + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java index effdf65e81573c3358d07ffd7ea2902d4bbd5b30..f95eac63e5449872ccb3f2e6d288dea9f0b3682f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java @@ -36,6 +36,7 @@ public class EntityDef { private String name; private Class source; private Class factory; + private boolean aggregate; private Class repository; public static EntityDef fromElement(AnnotatedElement element) { @@ -43,7 +44,7 @@ public class EntityDef { return attributes != null ? BeanUtil.copyProperties(attributes, EntityDef.class) : null; } - public void merge(EntityDef entityDef) { + public void mergeDef(EntityDef entityDef) { if (StringUtils.isBlank(name)) { name = entityDef.getName(); } @@ -55,8 +56,4 @@ public class EntityDef { } } - public boolean isRepositoryDef() { - return repository != Object.class; - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java index 5d077cabfeea99a089f0d54f9af1b05a06d1ec0c..c62cfa30096b8457e3f160e9a69ef067dc488887 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java @@ -32,8 +32,9 @@ import java.util.Map; @AllArgsConstructor public class FieldDef { - private boolean isId; + private boolean id; private String alias; + private boolean valueObj; private String mapExp; private Class converter; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java index 90d9db18f0dea4d8695679c006d3ec5283fb5be8..f645ef5f937d2e8aadd5d16766dc4eca2646ab63 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java @@ -17,7 +17,6 @@ package com.gitee.dorive.api.entity; -import com.gitee.dorive.api.annotation.Aggregate; import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.def.BindingDef; import com.gitee.dorive.api.def.EntityDef; @@ -39,7 +38,6 @@ public abstract class EntityEle { private AnnotatedElement element; private EntityDef entityDef; private OrderDef orderDef; - private boolean aggregated; private List bindingDefs; private PropProxy idProxy; private Map fieldAliasMapping; @@ -48,7 +46,6 @@ public abstract class EntityEle { this.element = element; this.entityDef = EntityDef.fromElement(element); this.orderDef = OrderDef.fromElement(element); - this.aggregated = (entityDef != null && entityDef.isRepositoryDef()) || isAggregateDef(); this.bindingDefs = BindingDef.fromElement(element); } @@ -56,10 +53,6 @@ public abstract class EntityEle { return entityDef != null; } - public boolean isAggregateDef() { - return element.isAnnotationPresent(Aggregate.class); - } - public void initialize() { if (entityDef != null && idProxy == null) { doInitialize(); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java index aaac3292ec55dabe881a50ccd3364752c9af8cd0..4a4ed5a8b92400a50737f5c8594bcd5594e4e98a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java @@ -69,7 +69,7 @@ public class EntityField extends EntityEle { if (entityDef != null) { EntityDef genericEntityDef = EntityDef.fromElement(genericType); if (genericEntityDef != null) { - entityDef.merge(genericEntityDef); + entityDef.mergeDef(genericEntityDef); } } if (isComplexType(genericType)) { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java index fc574bb207c459fa589431ee55d858afbc64e161..b173f83cb79f1ee1dac7465b6c029b72b459ef57 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java @@ -28,6 +28,7 @@ import com.gitee.dorive.api.util.ReflectUtils; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -100,10 +101,16 @@ public class EntityType extends EntityEle { Map fieldAliasMapping = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); for (EntityField entityField : entityFieldMap.values()) { - String fieldName = entityField.getName(); + String name = entityField.getName(); + String alias = StrUtil.toUnderlineCase(name); FieldDef fieldDef = entityField.getFieldDef(); - String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(fieldName); - fieldAliasMapping.put(fieldName, alias); + if (fieldDef != null) { + String aliasDef = fieldDef.getAlias(); + if (StringUtils.isNotBlank(aliasDef)) { + alias = aliasDef; + } + } + fieldAliasMapping.put(name, alias); } setFieldAliasMapping(fieldAliasMapping); } diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 83b2940026bed4f9ec665be29c9d4d5ee6be4a33..a612a0b4c916b51765b4b8fdf582ba6983cb647f 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java index 545275e78a3c83cff47e2d4428c5acd4c9ddd912..87fb517bd0127501d160d83128aa281cc202057d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.api.context; import com.gitee.dorive.core.entity.context.EnumOptions; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import java.util.Map; @@ -29,9 +29,9 @@ public interface Options { Map, Object> getOptions(); - void setOption(Class type, Object value); + void setOption(Class type, T value); - Object getOption(Class type); + T getOption(Class type); void removeOption(Class type); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java index 8ec59a6b75e81d17b4bca634f1b2e4f8435bc076..d19da832226e71c1eb532d59502655e4d40e2120 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.api.executor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; public interface Executor { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java index 6f85ca0b5132267adc5fdb7cc85471039846d247..d539e91ed6b668d61333b4e38a764894ed67b914 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; public interface Converter { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java index 465ed494da5d7a73518e8f51e6c646c8288aac3a..3b93dc9be005d8e19e6ac69c0bbfc797a7267fe8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java similarity index 67% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 797999132ff9a2eda9e1e27742a8a006fc9af041..5c7b4a875373c6fd44d30a1b5318d9e27d3c4bde 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -15,22 +15,23 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; -public interface EntityMapper { +import com.gitee.dorive.core.entity.factory.FieldConverter; - String fieldToAlias(String field); +import java.lang.reflect.Type; +import java.util.List; - String aliasToField(String alias); +public interface EntityMapper { - String fieldToProp(String field); + FieldConverter getField(String domain, String name); - boolean hasConverter(); + List getValueObjFields(); - Object fieldToAlias(String alias, Object value); + List getMatchedValueObjFields(); - Object aliasToField(String field, Object value); + List getUnmatchedValueObjFields(); - Object fieldToProp(String prop, Object value); + boolean isValueObjType(Type type); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 62c7b7cf0d247853e07fa8723011b7ca4ae75b50..4942b0ab607e2b3403dbdf005f4cabfdf3ea7b1c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -33,5 +33,6 @@ public class EntityStoreInfo { private String idColumn; private Map propAliasMappingWithoutPk; private Map propAliasMapping; + private Map aliasPropMapping; private String selectColumns; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 82f782a48ebb0c019070d5a25a132284cfe22a5a..9f9e444df3ecb2d7000af44544aba21a112d4028 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -47,13 +47,14 @@ public abstract class AbstractContext extends LinkedHashMap impl } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { options.put(type, value); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java index 205c50012ea2aea1dba18cb6d1880b862b6593d3..d27af132a83a48a3de61ea44257c0d9d600f9539 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java @@ -36,13 +36,14 @@ public class EnumOptions implements Options { } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { throw new UnsupportedOperationException(); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java index 89ea6fc6f1f46a8d969b62913c7f3a50d30726a7..0c614e8c5f7f19ee699af26966c0342b146e266c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum BindingType { STRONG, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java new file mode 100644 index 0000000000000000000000000000000000000000..06295ff31182c1db9a8fa582d31420ff78712160 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.enums; + +public enum Domain { + ENTITY, + DATABASE, + POJO +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java index 0be2334a482f521471e2cd49dbd2241e74185ae5..47e31d0e8e790d4abce6a2a17dd6f4455229a45f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum JoinType { UNKNOWN, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java similarity index 94% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java index 3f94c7f90023769cf2f4cfba3d2d84b330df4475..ff60dc27fb6b8e6e456a17a98ba310001689e308 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum QueryMethod { DEFAULT, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java new file mode 100644 index 0000000000000000000000000000000000000000..a4cf1a4b48b754ce3dd79e3fa5a6d8f99a6bdb14 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.enums; + +public enum RootControl { + UNCONTROLLED, + INCLUDE_ROOT, + IGNORE_ROOT +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java index 468277897a9f0d8c894b63e65981c8fcc49f2d8a..e96e7bac7b410fd16ee0391a068877c1c5f65ef4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum SelectType { NONE, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java index 1b35bcd8e892023a4deb8b9e5ed93396c4304f68..f0539660f852bf745539744d9eb6c37a660a3bb2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.executor; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..c2ef233c0c0e5182d0e249698042e89e01f1d580 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.factory; + +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +@AllArgsConstructor +public class FieldConverter implements Converter { + + private String domain; + private String name; + private boolean match; + private Map names; + private Converter converter; + + public String getName(String domain) { + return names.get(domain); + } + + @Override + public Object reconstitute(Object value) { + return converter == null ? value : converter.reconstitute(value); + } + + @Override + public Object deconstruct(Object value) { + return converter == null ? value : converter.deconstruct(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java index d16fd4b40672ddf9d6723f328cb2acdf0d8024fb..9574fffe44de0e647980e5f67b61423df157aee8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java @@ -28,8 +28,16 @@ public class Condition extends Operation { private Object primaryKey; private Example example; - public Condition(Object entity) { - super(entity); + public Condition(Object primaryKey) { + this.primaryKey = primaryKey; + } + + public Condition(Example example) { + this.example = example; + } + + public boolean isEmpty() { + return primaryKey == null && example == null; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java similarity index 84% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java index 70d02527e25f03e7b183861664a55913aa413c07..9c3996776e3bfb808a01a64992e57423159b3d92 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java @@ -20,12 +20,16 @@ package com.gitee.dorive.core.entity.operation; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class InsertOrUpdate extends Operation { +public class EntityOp extends Operation { + + private List entities; - public InsertOrUpdate(Object entity) { - super(entity); + public EntityOp(List entities) { + this.entities = entities; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index f7bb315faac9ad6618f1939056798c122f52ad3a..c153db5a2c4381c1b75756f389da5f4e5edd637d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -17,42 +17,35 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.core.entity.enums.RootControl; import lombok.Data; +/** + * 操作 + */ @Data public class Operation { - public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT} - - private RootControl rootControl = RootControl.NONE; - private Object entity; + private RootControl rootControl = RootControl.UNCONTROLLED; - public Operation(Object entity) { - this.entity = entity; + public void includeRoot() { + this.rootControl = RootControl.INCLUDE_ROOT; } - public void includeRoot() { - rootControl = RootControl.INCLUDE_ROOT; + public void switchRoot(boolean flag) { + this.rootControl = flag ? RootControl.INCLUDE_ROOT : RootControl.IGNORE_ROOT; } - public void ignoreRoot() { - rootControl = RootControl.IGNORE_ROOT; + public boolean isUncontrolled() { + return rootControl == RootControl.UNCONTROLLED; } public boolean isIncludeRoot() { return rootControl == RootControl.INCLUDE_ROOT; } - public boolean isIgnoreRoot() { - return rootControl == RootControl.IGNORE_ROOT; - } - - public void switchRoot(boolean flag) { - if (flag) { - includeRoot(); - } else { - ignoreRoot(); - } + public boolean isNotIgnoreRoot() { + return rootControl != RootControl.IGNORE_ROOT; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java new file mode 100644 index 0000000000000000000000000000000000000000..c085316e096c5a8e451cd122c8be59c96f92825d --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation.cop; + +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.Condition; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConditionDelete extends Condition { + + public ConditionDelete(Object primaryKey) { + super(primaryKey); + } + + public ConditionDelete(Example example) { + super(example); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..6e7c86923c3543f11d2efde95560a049034ab1fa --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation.cop; + +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.Condition; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConditionUpdate extends Condition { + + private Object entity; + + public ConditionUpdate(Object entity, Object primaryKey) { + super(primaryKey); + this.entity = entity; + } + + public ConditionUpdate(Object entity, Example example) { + super(example); + this.entity = entity; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java index c679a77d524928ee13f651b37fffd9cd2f908aeb..66fac2fc31491db67f988b56a2c64e5c975583dc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java @@ -15,8 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.cop; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.Condition; import lombok.Getter; import lombok.Setter; @@ -24,12 +26,12 @@ import lombok.Setter; @Setter public class Query extends Condition { - public Query(Object entity) { - super(entity); + public Query(Object primaryKey) { + super(primaryKey); } - public boolean isEmpty() { - return getPrimaryKey() == null && getExample() == null; + public Query(Example example) { + super(example); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java similarity index 78% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java index 5731ab569591f19e5c168574673f968b66195501..c12f5d847212a90cb2ff093317e25b4ae8a41098 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java @@ -15,17 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.eop; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class Delete extends Condition { +public class Delete extends EntityOp { - public Delete(Object entity) { - super(entity); + public Delete(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java similarity index 78% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java index 60a5e0c17a8d304c4f98c4f62fa58b853e56be18..e42d752603d8b1ea68282645621913c6c9ff1446 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java @@ -15,17 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.eop; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class Insert extends Operation { +public class Insert extends EntityOp { - public Insert(Object entity) { - super(entity); + public Insert(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..b6e8bcc2a3ad93813377357bc4206ac76c4022f6 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation.eop; + +import com.gitee.dorive.core.entity.operation.EntityOp; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class InsertOrUpdate extends EntityOp { + + private Insert insert; + private Update update; + + public InsertOrUpdate(List entities) { + super(entities); + } + + @Override + public void switchRoot(boolean flag) { + super.switchRoot(flag); + if (insert != null) { + insert.switchRoot(flag); + } + if (update != null) { + update.switchRoot(flag); + } + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java similarity index 80% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java index bd514cd6c7f8f58a0766534c052fa41e977fd8b0..f534ff99a429886dc991af1704e1c3d86b10e4e5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java @@ -15,22 +15,24 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.eop; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; import java.util.Collections; +import java.util.List; import java.util.Set; @Getter @Setter -public class Update extends Condition { +public class Update extends EntityOp { private Set nullableProps = Collections.emptySet(); - public Update(Object entity) { - super(entity); + public Update(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java index ce1407e8351df7d90b89ec993d734450f9e80720..9b6bff638c2624a67bfd63ae4870fda4a9d4236c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import java.util.LinkedHashMap; import java.util.Map; @@ -38,13 +38,14 @@ public abstract class AbstractSelector implements Selector { } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { throw new UnsupportedOperationException(); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index 965dda7d841547bbf4d6ce24d382c42a9bb05d96..cd22d00c3f65ae305ce9267a0c2e43b85287c607 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; import lombok.Setter; @@ -49,7 +49,7 @@ public class SelectTypeMatcher implements Matcher { @Override public boolean matches(Options options) { - SelectType selectType = (SelectType) options.getOption(SelectType.class); + SelectType selectType = options.getOption(SelectType.class); if (selectType != null) { Matcher matcher = matcherMap.get(selectType); if (matcher != null) { @@ -62,7 +62,7 @@ public class SelectTypeMatcher implements Matcher { private class SelectorMatcher implements Matcher { @Override public boolean matches(Options options) { - Selector selector = (Selector) options.getOption(Selector.class); + Selector selector = options.getOption(Selector.class); if (selector != null) { Set names = selector.getNames(); String name = repository.getName(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..9c01603bf23619960f7c31518bce0a0cd4f1660f --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class JsonArrayConverter implements Converter { + + private Class entityClass; + + @Override + public Object reconstitute(Object value) { + return JSONUtil.toList((String) value, entityClass); + } + + @Override + public Object deconstruct(Object value) { + return JSONUtil.toJsonStr(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..9384249304dd614662d436625d856ca2efda83bd --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class JsonConverter implements Converter { + + private Class entityClass; + + @Override + public Object reconstitute(Object value) { + return JSONUtil.toBean((String) value, entityClass); + } + + @Override + public Object deconstruct(Object value) { + return JSONUtil.toJsonStr(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..81b78e98a11fa9a693277fb7d037c62175d9282c --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class MapConverter implements Converter { + + private Class entityClass; + + @Override + public Object reconstitute(Object value) { + return BeanUtil.toBean(value, entityClass); + } + + @Override + public Object deconstruct(Object value) { + return BeanUtil.beanToMap(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java similarity index 93% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java index 666807e225c428043b0fcd684e0a131b52c5add2..d5325926e102929599b905fc1d46946322dc3cf7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java @@ -20,8 +20,9 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.def.FieldDef; import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.core.api.converter.Converter; -import lombok.Data; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.util.Collections; @@ -29,14 +30,15 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@Data -public class DefaultConverter implements Converter { +@Getter +@Setter +public class MapExpConverter implements Converter { private EntityField entityField; private Map reMapping = Collections.emptyMap(); private Map deMapping = Collections.emptyMap(); - public DefaultConverter(EntityField entityField) { + public MapExpConverter(EntityField entityField) { this.entityField = entityField; FieldDef fieldDef = entityField.getFieldDef(); Class genericType = entityField.getGenericType(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java index 45ee4fdae94189aa0ae530477fe7ac4e1b7dfc68..43d99ae8c415836077c27f3d19d923a93a39147d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 40af2f633a2afcbf83234795917bebf64f09863a..23830d4f46935800d20ea3f5cf87aadda9f0ded3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -18,18 +18,18 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Pair; import com.gitee.dorive.api.entity.PropChain; -import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; @@ -38,9 +38,7 @@ import com.gitee.dorive.core.util.CollectionUtils; import lombok.Getter; import lombok.Setter; -import java.util.Collection; import java.util.List; -import java.util.Map; @Getter @Setter @@ -74,18 +72,14 @@ public class ContextExecutor extends AbstractExecutor { if (!derivedResolver.hasDerived()) { entityHandler.handle(context, entities); } else { - Map, List> repositoryEntitiesMap = derivedResolver.distribute(entities); - repositoryEntitiesMap.forEach((repository, partEntities) -> { - if (repository == this.repository) { // 避免自循环 - entityHandler.handle(context, partEntities); + for (Pair, List> pair : derivedResolver.distribute(entities)) { + if (pair.getKey() == this.repository) { // 避免自循环 + entityHandler.handle(context, pair.getValue()); } else { - Executor executor = repository.getExecutor(); - if (executor instanceof ContextExecutor) { - ContextExecutor contextExecutor = (ContextExecutor) executor; - contextExecutor.populate(context, partEntities); - } + ContextExecutor contextExecutor = (ContextExecutor) pair.getKey().getExecutor(); + contextExecutor.populate(context, pair.getValue()); } - }); + } } } @@ -96,38 +90,41 @@ public class ContextExecutor extends AbstractExecutor { @Override public int execute(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); - Assert.notNull(rootEntity, "The root entity cannot be null!"); - - DerivedResolver derivedResolver = repository.getDerivedResolver(); - AbstractContextRepository repository = derivedResolver.distribute(rootEntity); + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + Assert.notEmpty(entities, "The entities cannot be empty!"); - Executor executor = repository.getExecutor(); - if (executor instanceof ContextExecutor) { - ContextExecutor contextExecutor = (ContextExecutor) executor; + int totalCount = 0; + for (Pair, List> pair : repository.getDerivedResolver().distribute(entities)) { + ContextExecutor contextExecutor = (ContextExecutor) pair.getKey().getExecutor(); if (operation instanceof Insert) { - return contextExecutor.executeInsert(context, operation); + Insert insert = new Insert(pair.getValue()); + totalCount += contextExecutor.executeInsert(context, insert); + + } else if (operation instanceof Update) { + Update update = new Update(pair.getValue()); + totalCount += contextExecutor.executeUpdateOrDelete(context, update); - } else if (operation instanceof Update || operation instanceof Delete) { - return contextExecutor.executeUpdateOrDelete(context, operation); + } else if (operation instanceof Delete) { + Delete delete = new Delete(pair.getValue()); + totalCount += contextExecutor.executeUpdateOrDelete(context, delete); } else if (operation instanceof InsertOrUpdate) { - return contextExecutor.executeInsertOrUpdate(context, operation); + OperationFactory operationFactory = repository.getOperationFactory(); + InsertOrUpdate insertOrUpdate = operationFactory.buildInsertOrUpdate(pair.getValue()); + totalCount += contextExecutor.executeInsertOrUpdate(context, insertOrUpdate); } } - return 0; + return totalCount; } - public int executeInsert(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeInsert(Context context, Insert insert) { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { - if (!operation.isIgnoreRoot()) { - if (repository.matches(context) || operation.isIncludeRoot()) { - getBoundValue(context, rootEntity, repository, rootEntity); - totalCount += repository.execute(context, operation); - setBoundId(context, rootEntity, repository, rootEntity); + if (insert.isNotIgnoreRoot()) { + if (repository.matches(context) || insert.isIncludeRoot()) { + totalCount += repository.execute(context, insert); } } } else { @@ -136,85 +133,68 @@ public class ContextExecutor extends AbstractExecutor { if (!isMatch && !isAggregated) { continue; } - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - OperationFactory operationFactory = repository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { + List rootEntities = insert.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + List entities = CollectionUtils.toList(targetEntity); if (isMatch) { - getBoundValue(context, rootEntity, repository, entity); + repository.getBoundValue(context, rootEntity, entities); + } + Operation operation = new Insert(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); + if (entities.size() == 1) { + repository.setBoundId(context, rootEntity, entities.get(0)); } - Operation newOperation = operationFactory.buildInsert(entity); - newOperation.switchRoot(isMatch); - totalCount += repository.execute(context, newOperation); - } - if (collection.size() == 1) { - setBoundId(context, rootEntity, repository, collection.iterator().next()); } } } return totalCount; } - public int executeUpdateOrDelete(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeUpdateOrDelete(Context context, EntityOp entityOp) { int totalCount = 0; - if (!operation.isIgnoreRoot()) { - CommonRepository rootRepository = this.repository.getRootRepository(); - if (rootRepository.matches(context) || operation.isIncludeRoot()) { - Object primaryKey = rootRepository.getPrimaryKey(rootEntity); - if (primaryKey != null) { - totalCount += rootRepository.execute(context, operation); + for (CommonRepository repository : this.repository.getOrderedRepositories()) { + if (repository.isRoot()) { + if (entityOp.isNotIgnoreRoot()) { + if (repository.matches(context) || entityOp.isIncludeRoot()) { + totalCount += repository.execute(context, entityOp); + } } - } - } - for (CommonRepository subRepository : this.repository.getSubRepositories()) { - boolean isMatch = subRepository.matches(context); - boolean isAggregated = subRepository.isAggregated(); - if (!isMatch && !isAggregated) { - continue; - } - PropChain anchorPoint = subRepository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - OperationFactory operationFactory = subRepository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { - Object primaryKey = subRepository.getPrimaryKey(entity); - Operation newOperation = null; - if ((isMatch && primaryKey != null) || isAggregated) { - newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); + } else { + boolean isMatch = repository.matches(context); + boolean isAggregated = repository.isAggregated(); + if (!isMatch && !isAggregated) { + continue; } - if (newOperation != null) { - newOperation.switchRoot(isMatch); - totalCount += subRepository.execute(context, newOperation); + List rootEntities = entityOp.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + List entities = CollectionUtils.toList(targetEntity); + Operation operation = entityOp instanceof Update ? new Update(entities) : new Delete(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); } } } return totalCount; } - public int executeInsertOrUpdate(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeInsertOrUpdate(Context context, InsertOrUpdate insertOrUpdate) { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { - OperationFactory operationFactory = repository.getOperationFactory(); if (repository.isRoot()) { - if (!operation.isIgnoreRoot()) { - if (repository.matches(context) || operation.isIncludeRoot()) { - Operation newOperation = operationFactory.buildInsertOrUpdate(rootEntity); - if (newOperation instanceof Insert) { - getBoundValue(context, rootEntity, repository, rootEntity); - totalCount += repository.execute(context, newOperation); - setBoundId(context, rootEntity, repository, rootEntity); - } else { - totalCount += repository.execute(context, newOperation); - } + if (insertOrUpdate.isNotIgnoreRoot()) { + if (repository.matches(context) || insertOrUpdate.isIncludeRoot()) { + totalCount += repository.execute(context, insertOrUpdate); } } } else { @@ -223,59 +203,28 @@ public class ContextExecutor extends AbstractExecutor { if (!isMatch && !isAggregated) { continue; } - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - Collection collection = CollectionUtils.toCollection(targetEntity); - Object onlyOne = collection.size() == 1 ? collection.iterator().next() : null; - boolean isOnlyOneInsert = onlyOne != null && repository.getPrimaryKey(onlyOne) == null; - for (Object entity : collection) { - Object primaryKey = repository.getPrimaryKey(entity); - if (isMatch && primaryKey == null) { - getBoundValue(context, rootEntity, repository, entity); + List rootEntities = insertOrUpdate.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; } - Operation newOperation; - if (isAggregated) { - newOperation = new InsertOrUpdate(entity); - } else { - newOperation = primaryKey == null ? operationFactory.buildInsert(entity) : operationFactory.buildUpdate(entity); + List entities = CollectionUtils.toList(targetEntity); + if (isMatch) { + repository.getBoundValue(context, rootEntity, entities); + } + OperationFactory operationFactory = repository.getOperationFactory(); + Operation operation = operationFactory.buildInsertOrUpdate(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); + if (entities.size() == 1) { + repository.setBoundId(context, rootEntity, entities.get(0)); } - newOperation.switchRoot(isMatch); - totalCount += repository.execute(context, newOperation); - } - if (isOnlyOneInsert) { - setBoundId(context, rootEntity, repository, onlyOne); } } } return totalCount; } - private void getBoundValue(Context context, Object rootEntity, CommonRepository repository, Object entity) { - for (Binder binder : repository.getBinderResolver().getStrongBinders()) { - Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue == null) { - Object boundValue = binder.getBoundValue(context, rootEntity); - if (boundValue != null) { - binder.setFieldValue(context, entity, boundValue); - } - } - } - } - - private void setBoundId(Context context, Object rootEntity, CommonRepository repository, Object entity) { - Binder binder = repository.getBinderResolver().getBoundIdBinder(); - if (binder != null) { - Object boundValue = binder.getBoundValue(context, rootEntity); - if (boundValue == null) { - Object primaryKey = binder.getFieldValue(context, entity); - if (primaryKey != null) { - binder.setBoundValue(context, rootEntity, primaryKey); - } - } - } - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 3e06d3778e6d332bc47426b812866b874154deee..574a2c4f809cd5845b08e7f47b139ce58c314f50 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -20,17 +20,19 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.Getter; import lombok.Setter; @@ -134,15 +136,16 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void doConvertCriteria(Criterion criterion) { String property = criterion.getProperty(); - String alias = entityMapper.fieldToAlias(property); - if (alias != null) { - criterion.setProperty(alias); - } else { - alias = property; + Object value = criterion.getValue(); + + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), property); + if (fieldConverter == null) { + fieldConverter = entityMapper.getField(Domain.DATABASE.name(), property); } - if (entityMapper.hasConverter()) { - Object value = criterion.getValue(); - value = entityMapper.fieldToAlias(alias, value); + if (fieldConverter != null) { + property = fieldConverter.getName(Domain.DATABASE.name()); + value = fieldConverter.deconstruct(value); + criterion.setProperty(property); criterion.setValue(value); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 33d14a0d936fa48433673ddf891fa9aa8c13df69..3a2788ced960add6a3ccd4e0c1ecdf26f2047304 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -20,16 +20,18 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Insert; import lombok.Getter; import lombok.Setter; @@ -91,21 +93,43 @@ public class FactoryExecutor extends AbstractProxyExecutor { @Override public int execute(Context context, Operation operation) { - Object entity = operation.getEntity(); - if (entity != null) { - Object persistent = entityFactory.deconstruct(context, entity); - operation.setEntity(persistent); - } - int totalCount = super.execute(context, operation); - if (operation instanceof Insert) { - Object persistent = operation.getEntity(); - Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); - if (primaryKey != null) { - entityEle.getIdProxy().setValue(entity, primaryKey); + if (operation instanceof EntityOp) { + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + List persistentObjs = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object persistent = entityFactory.deconstruct(context, entity); + persistentObjs.add(persistent); + } + + entityOp.setEntities(persistentObjs); + int totalCount = super.execute(context, operation); + entityOp.setEntities(entities); + + if (operation instanceof Insert) { + for (int index = 0; index < entities.size(); index++) { + Object entity = entities.get(index); + Object persistent = persistentObjs.get(index); + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + if (primaryKey != null) { + entityEle.getIdProxy().setValue(entity, primaryKey); + } + } + } + return totalCount; + + } else if (operation instanceof ConditionUpdate) { + ConditionUpdate conditionUpdate = (ConditionUpdate) operation; + Object entity = conditionUpdate.getEntity(); + if (entity != null) { + Object persistent = entityFactory.deconstruct(context, entity); + conditionUpdate.setEntity(persistent); + int totalCount = super.execute(context, operation); + conditionUpdate.setEntity(entity); + return totalCount; } } - operation.setEntity(entity); - return totalCount; + return super.execute(context, operation); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java similarity index 63% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index baf37f875c203e5d885425bded7fa17cd40e28ef..63658d3c2570f953abf8646847e42abf2bd1ac5a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -15,20 +15,24 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityFactory; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.enums.Domain; +import com.gitee.dorive.core.entity.factory.FieldConverter; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor public class DefaultEntityFactory implements EntityFactory { @@ -46,17 +50,25 @@ public class DefaultEntityFactory implements EntityFactory { } private void initReCopyOptions() { - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::aliasToField); - if (entityMapper.hasConverter()) { - this.reCopyOptions.setFieldValueEditor((field, value) -> entityMapper.aliasToField(field, value)); - } + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { + FieldConverter fieldConverter = entityMapper.getField(Domain.DATABASE.name(), name); + return fieldConverter != null ? fieldConverter.getName() : name; + + }).setFieldValueEditor((name, value) -> { + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); + return fieldConverter != null ? fieldConverter.reconstitute(value) : value; + }); } private void initDeCopyOptions() { - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::fieldToProp); - if (entityMapper.hasConverter()) { - this.deCopyOptions.setFieldValueEditor((prop, value) -> entityMapper.fieldToProp(prop, value)); - } + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); + return fieldConverter != null ? fieldConverter.getName(Domain.POJO.name()) : name; + + }).setFieldValueEditor((name, value) -> { + FieldConverter fieldConverter = entityMapper.getField(Domain.POJO.name(), name); + return fieldConverter != null ? fieldConverter.deconstruct(value) : value; + }); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java index 539158887830b8f7005fa54341f93824c7620c6c..01c3b233e36a387b4d459a0b89c447c2a2eadf95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java @@ -19,10 +19,21 @@ package com.gitee.dorive.core.impl.factory; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.*; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + @Data @AllArgsConstructor public class OperationFactory { @@ -30,62 +41,68 @@ public class OperationFactory { private EntityEle entityEle; public Query buildQueryByPK(Object primaryKey) { - Query query = new Query(null); - query.setPrimaryKey(primaryKey); - return query; + return new Query(primaryKey); } public Query buildQueryByExample(Example example) { - Query query = new Query(null); - query.setExample(example); - return query; + return new Query(example); } - public Insert buildInsert(Object entity) { - return new Insert(entity); + public Operation buildInsert(Object entity) { + return new Insert(Collections.singletonList(entity)); } - public Update buildUpdate(Object entity) { - Update update = new Update(entity); - Object primaryKey = entityEle.getIdProxy().getValue(entity); - update.setPrimaryKey(primaryKey); - return update; + public Operation buildUpdate(Object entity) { + return new Update(Collections.singletonList(entity)); } - public Update buildUpdateByExample(Object entity, Example example) { - Update update = new Update(entity); - update.setExample(example); - return update; + public Operation buildUpdateByExample(Object entity, Example example) { + return new ConditionUpdate(entity, example); } public Operation buildInsertOrUpdate(Object entity) { + List entities = Collections.singletonList(entity); + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); Object primaryKey = entityEle.getIdProxy().getValue(entity); if (primaryKey == null) { - return new Insert(entity); + insertOrUpdate.setInsert(new Insert(entities)); } else { - Update update = new Update(entity); - update.setPrimaryKey(primaryKey); - return update; + insertOrUpdate.setUpdate(new Update(entities)); } + return insertOrUpdate; } - public Delete buildDelete(Object entity) { - Delete delete = new Delete(entity); - Object primaryKey = entityEle.getIdProxy().getValue(entity); - delete.setPrimaryKey(primaryKey); - return delete; + public InsertOrUpdate buildInsertOrUpdate(List entities) { + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); + List insertList = new ArrayList<>(entities.size()); + List updateList = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object primaryKey = entityEle.getIdProxy().getValue(entity); + if (primaryKey == null) { + insertList.add(entity); + } else { + updateList.add(entity); + } + } + if (!insertList.isEmpty()) { + insertOrUpdate.setInsert(new Insert(insertList)); + } + if (!updateList.isEmpty()) { + insertOrUpdate.setUpdate(new Update(updateList)); + } + return insertOrUpdate; + } + + public Operation buildDelete(Object entity) { + return new Delete(Collections.singletonList(entity)); } - public Delete buildDeleteByPK(Object primaryKey) { - Delete delete = new Delete(null); - delete.setPrimaryKey(primaryKey); - return delete; + public Operation buildDeleteByPK(Object primaryKey) { + return new ConditionDelete(primaryKey); } - public Delete buildDeleteByExample(Example example) { - Delete delete = new Delete(null); - delete.setExample(example); - return delete; + public Operation buildDeleteByExample(Example example) { + return new ConditionDelete(example); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..eab468163854b49c675a9c78a69a016b2215dcc4 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.factory; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.convert.TypeConverter; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.factory.EntityMapper; +import com.gitee.dorive.core.entity.factory.FieldConverter; + +import java.lang.reflect.ParameterizedType; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class ValueObjEntityFactory extends DefaultEntityFactory { + + // 从hutool源码中拷贝 + protected TypeConverter converter = (type, value) -> { + if (null == value) { + return null; + } + final String name = value.getClass().getName(); + if (ArrayUtil.contains(new String[]{"cn.hutool.json.JSONObject", "cn.hutool.json.JSONArray"}, name)) { + return ReflectUtil.invoke(value, "toBean", ObjectUtil.defaultIfNull(type, Object.class)); + } + return Convert.convertWithCheck(type, value, null, true); + }; + + @Override + public void setEntityMapper(EntityMapper entityMapper) { + super.setEntityMapper(entityMapper); + List matchedValueObjFields = entityMapper.getMatchedValueObjFields(); + if (!matchedValueObjFields.isEmpty()) { + setReCopyOptions(); + setDeCopyOptions(); + } + } + + private void setReCopyOptions() { + // 如果是值对象,则跳过hutool的类型转换 + EntityMapper entityMapper = getEntityMapper(); + getReCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; + } + if (value instanceof String) { + if (targetType instanceof ParameterizedType) { + targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; + } + if (entityMapper.isValueObjType(targetType)) { + return value; + } + } + return converter.convert(targetType, value); + })); + } + + private void setDeCopyOptions() { + // 如果是值对象,则跳过hutool的类型转换 + EntityMapper entityMapper = getEntityMapper(); + getDeCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; + } + if (targetType == String.class) { + // 运行时类型擦除,若优化需重写hutool逻辑 + if (value instanceof Collection) { + return JSONUtil.toJsonStr(value); + } + if (entityMapper.isValueObjType(value.getClass())) { + return value; + } + } + return converter.convert(targetType, value); + })); + } + + @Override + @SuppressWarnings("unchecked") + public Object reconstitute(Context context, Object persistent) { + Object entity = super.reconstitute(context, persistent); + Map resultMap = (Map) persistent; + EntityMapper entityMapper = getEntityMapper(); + List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); + for (FieldConverter fieldConverter : unmatchedValueObjFields) { + Object valueObj = fieldConverter.reconstitute(resultMap); + if (valueObj != null) { + BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); + } + } + return entity; + } + + @Override + public Object deconstruct(Context context, Object entity) { + Object pojo = super.deconstruct(context, entity); + EntityMapper entityMapper = getEntityMapper(); + List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); + for (FieldConverter fieldConverter : unmatchedValueObjFields) { + Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); + valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; + if (valueObj != null) { + BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); + } + } + return pojo; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index 4a690ef8ade480157378b320de139e50f957d463..1b4f30f74c036027e66cd596042decd1d9b57c55 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -22,8 +22,8 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.ValueBinder; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.joiner.MultiEntityJoiner; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java index f9551a961093ca11a73c9036bc9910da1e87d210..f353efe9d0832d6c436c6a3cb8ebbc48e0b1ecef 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java @@ -30,8 +30,8 @@ import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.api.resolver.PropChainResolver; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; -import com.gitee.dorive.core.entity.option.BindingType; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.enums.BindingType; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.BoundBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueBinder; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java index 4a788e29968642a248da10d9f8766d7996efc5be..76432c751c387ccb220ce2cee6051fd5a2bd1b02 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java @@ -17,12 +17,15 @@ package com.gitee.dorive.core.impl.resolver; +import cn.hutool.core.lang.Pair; import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.Data; import org.springframework.context.ApplicationContext; import org.springframework.util.ReflectionUtils; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -57,19 +60,20 @@ public class DerivedResolver { return !classRepositoryMap.isEmpty(); } - public AbstractContextRepository distribute(Object entity) { - return classRepositoryMap.getOrDefault(entity.getClass(), repository); - } - - public Map, List> distribute(List entities) { + public Collection, List>> distribute(List entities) { int size = classRepositoryMap.size() + 1; - Map, List> repositoryEntitiesMap = new LinkedHashMap<>(size * 4 / 3 + 1); + Map, Pair, List>> classRepoEntitiesPairMap = new HashMap<>(size * 4 / 3 + 1); for (Object entity : entities) { - AbstractContextRepository repository = distribute(entity); - List existEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(entities.size())); - existEntities.add(entity); + Class clazz = entity.getClass(); + Pair, List> repoEntitiesPair = classRepoEntitiesPairMap.computeIfAbsent(clazz, key -> { + AbstractContextRepository repository = classRepositoryMap.getOrDefault(key, this.repository); + List partEntities = new ArrayList<>(entities.size()); + return new Pair<>(repository, partEntities); + }); + List partEntities = repoEntitiesPair.getValue(); + partEntities.add(entity); } - return repositoryEntitiesMap; + return classRepoEntitiesPairMap.values(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 9675447610849360d11290c02edcef660be25a8f..d08c52b2228db13b7abdb8f841b181716355a53b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -21,17 +21,27 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.def.FieldDef; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.core.api.converter.Converter; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.impl.converter.DefaultConverter; -import com.gitee.dorive.core.impl.converter.DefaultEntityMapper; +import com.gitee.dorive.core.entity.enums.Domain; +import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.impl.converter.JsonArrayConverter; +import com.gitee.dorive.core.impl.converter.JsonConverter; +import com.gitee.dorive.core.impl.converter.MapConverter; +import com.gitee.dorive.core.impl.converter.MapExpConverter; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.Set; @Data @AllArgsConstructor @@ -40,78 +50,97 @@ public class EntityMapperResolver { private EntityEle entityEle; private EntityStoreInfo entityStoreInfo; - public EntityMapper resolve() { - Map fieldAliasMapping = entityEle.getFieldAliasMapping(); - Map aliasFieldMapping = newAliasFieldMapping(fieldAliasMapping); - Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); + public EntityMapper newEntityMapper() { + Map entityFieldMap = entityEle.getEntityFieldMap(); + Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); - Map fieldConverterMap = newFieldConverterMap(); - Map aliasConverterMap = newAliasConverterMap(fieldAliasMapping, fieldConverterMap); - Map propConverterMap = newPropConverterMap(fieldPropMapping, fieldConverterMap); + Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); + List valueObjFields = new ArrayList<>(4); + List matchedValueObjFields = new ArrayList<>(4); + List unmatchedValueObjFields = new ArrayList<>(4); + Set valueObjTypes = new HashSet<>(6); - return new DefaultEntityMapper(fieldAliasMapping, aliasFieldMapping, fieldPropMapping, - fieldConverterMap, aliasConverterMap, propConverterMap); - } + entityFieldMap.forEach((name, field) -> { + String expected = entityEle.toAlias(name); + boolean isMatch = aliasPropMapping.containsKey(expected); + String alias = isMatch ? expected : null; + String prop = isMatch ? aliasPropMapping.get(alias) : null; - private Map newAliasFieldMapping(Map fieldAliasMapping) { - Map aliasFieldMapping = new LinkedHashMap<>(); - fieldAliasMapping.forEach((field, alias) -> aliasFieldMapping.put(alias, field)); - return aliasFieldMapping; - } + Map names = new LinkedHashMap<>(5); + names.put(Domain.ENTITY.name(), name); + if (alias != null) { + names.put(Domain.DATABASE.name(), alias); + } + if (prop != null) { + names.put(Domain.POJO.name(), prop); + } - private Map newFieldPropMapping(Map aliasFieldMapping) { - Map fieldPropMapping = new LinkedHashMap<>(); - Map propAliasMapping = entityStoreInfo.getPropAliasMapping(); - propAliasMapping.forEach((prop, alias) -> { - String field = aliasFieldMapping.get(alias); - if (field != null) { - fieldPropMapping.put(field, prop); + FieldDef fieldDef = field.getFieldDef(); + boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); + Converter converter = newConverter(field, isMatch, isValueObj); + FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, isMatch, names, converter); + + names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); + if (isValueObj) { + valueObjFields.add(fieldConverter); + if (isMatch) { + matchedValueObjFields.add(fieldConverter); + } else { + unmatchedValueObjFields.add(fieldConverter); + } + valueObjTypes.add(field.getGenericType()); } }); - return fieldPropMapping; + + return new DefaultEntityMapper(fieldConverterMap, valueObjFields, matchedValueObjFields, unmatchedValueObjFields, valueObjTypes); } - private Map newFieldConverterMap() { - Map fieldConverterMap = new LinkedHashMap<>(8); - Map entityFieldMap = entityEle.getEntityFieldMap(); - if (entityFieldMap != null) { - entityFieldMap.forEach((field, entityField) -> { - FieldDef fieldDef = entityField.getFieldDef(); - if (fieldDef != null) { - Class converterClass = fieldDef.getConverter(); - String mapExp = fieldDef.getMapExp(); - Converter converter = null; - if (converterClass != Object.class) { - converter = (Converter) ReflectUtil.newInstance(converterClass); - - } else if (StringUtils.isNotBlank(mapExp)) { - converter = new DefaultConverter(entityField); - } - if (converter != null) { - fieldConverterMap.put(field, converter); - } + private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { + FieldDef fieldDef = entityField.getFieldDef(); + if (fieldDef != null) { + Class converterClass = fieldDef.getConverter(); + if (converterClass != Object.class) { + return (Converter) ReflectUtil.newInstance(converterClass); + + } else if (isValueObj) { + Class genericType = entityField.getGenericType(); + if (isMatch) { + return !entityField.isCollection() ? new JsonConverter(genericType) : new JsonArrayConverter(genericType); + } else { + return new MapConverter(genericType); } - }); + + } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { + return new MapExpConverter(entityField); + } } - return fieldConverterMap; + return null; } - private Map newAliasConverterMap(Map fieldAliasMapping, Map fieldConverterMap) { - Map aliasConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); - fieldConverterMap.forEach((field, converter) -> { - String alias = fieldAliasMapping.get(field); - aliasConverterMap.put(alias, converter); - }); - return aliasConverterMap; + private String getKey(String domain, String name) { + return domain + ":" + name; } - private Map newPropConverterMap(Map fieldPropMapping, Map fieldConverterMap) { - Map propConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); - fieldConverterMap.forEach((field, converter) -> { - String prop = fieldPropMapping.get(field); - propConverterMap.put(prop, converter); - }); - return propConverterMap; + @Getter + @AllArgsConstructor + private class DefaultEntityMapper implements EntityMapper { + + private final Map fieldConverterMap; + private final List valueObjFields; + private final List matchedValueObjFields; + private final List unmatchedValueObjFields; + private final Set valueObjTypes; + + @Override + public FieldConverter getField(String domain, String name) { + return fieldConverterMap.get(getKey(domain, name)); + } + + @Override + public boolean isValueObjType(Type type) { + return valueObjTypes.contains(type); + } + } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index e5d66442b573b694cc1e12b5a31445c383f98f2b..281e2010ca80d0991b76c097586df33162ea3290 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -28,19 +28,21 @@ import com.gitee.dorive.api.entity.EntityType; import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.api.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; -import com.gitee.dorive.core.api.converter.EntityFactory; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.impl.context.SelectTypeMatcher; -import com.gitee.dorive.core.impl.converter.DefaultEntityFactory; +import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; @@ -136,7 +138,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor AbstractRepository proxyRepository = processRepository(actualRepository); boolean isRoot = "/".equals(accessPath); - boolean isAggregated = entityEle.isAggregated(); + boolean isAggregated = entityDef.getRepository() != Object.class; OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); Map propChainMap = propChainResolver.getPropChainMap(); @@ -167,7 +169,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor private EntityDef renewEntityDef(EntityEle entityEle) { EntityDef entityDef = entityEle.getEntityDef(); entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); - if (entityEle.isAggregateDef()) { + if (entityDef.isAggregate()) { Class entityClass = entityEle.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); @@ -199,7 +201,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityEle); ENTITY_STORE_INFO_MAP.put(entityEle, entityStoreInfo); - EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).resolve(); + EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityEle, entityStoreInfo); + EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); @@ -215,7 +218,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { - entityFactory = new DefaultEntityFactory(); + List valueObjFields = entityMapper.getValueObjFields(); + entityFactory = valueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); } else { entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index dc12acfcb8ec1c4b9db2cb80e41e75471ffa468b..7dbbfa901cf94d6865ee5c097ba16e92278fd585 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,8 +22,11 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.util.ExampleUtils; import java.util.List; @@ -50,13 +53,6 @@ public abstract class AbstractGenericRepository extends AbstractContextRe return totalCount; } - @Override - public int insertOrUpdate(Options options, E entity) { - Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new InsertOrUpdate(entity); - return execute((Context) options, operation); - } - @Override public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); @@ -78,22 +74,31 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertList(Options options, List entities) { - return entities.stream().mapToInt(entity -> insert(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Operation operation = new Insert(entities); + return execute((Context) options, operation); } @Override public int updateList(Options options, List entities) { - return entities.stream().mapToInt(entity -> update(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Operation operation = new Update(entities); + return execute((Context) options, operation); } @Override public int insertOrUpdateList(Options options, List entities) { - return entities.stream().mapToInt(entity -> insertOrUpdate(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + OperationFactory operationFactory = getOperationFactory(); + Operation operation = operationFactory.buildInsertOrUpdate(entities); + return execute((Context) options, operation); } @Override public int deleteList(Options options, List entities) { - return entities.stream().mapToInt(entity -> delete(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Operation operation = new Delete(entities); + return execute((Context) options, operation); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index f13a3b5e808a1584f278e288a64c8c0b86fb135b..1bdf7abb92979b8e83174b281a1347b59fee41b2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -23,7 +23,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java index 146d4047704a4b8d27f115931b995df489e539c9..a1cf236130ba4d824d4ab0f329333d56a33cfd2f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java @@ -28,11 +28,8 @@ import com.gitee.dorive.core.api.repository.Repository; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.factory.OperationFactory; import lombok.Getter; import lombok.Setter; @@ -97,23 +94,23 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int insert(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Insert insert = operationFactory.buildInsert(entity); - return execute((Context) options, insert); + Operation operation = operationFactory.buildInsert(entity); + return execute((Context) options, operation); } @Override public int update(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Update update = operationFactory.buildUpdate(entity); - return execute((Context) options, update); + Operation operation = operationFactory.buildUpdate(entity); + return execute((Context) options, operation); } @Override public int updateByExample(Options options, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); - Update update = operationFactory.buildUpdateByExample(entity, example); - return execute((Context) options, update); + Operation operation = operationFactory.buildUpdateByExample(entity, example); + return execute((Context) options, operation); } @Override @@ -126,22 +123,22 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int delete(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Delete delete = operationFactory.buildDelete(entity); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDelete(entity); + return execute((Context) options, operation); } @Override public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); - Delete delete = operationFactory.buildDeleteByPK(primaryKey); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDeleteByPK(primaryKey); + return execute((Context) options, operation); } @Override public int deleteByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); - Delete delete = operationFactory.buildDeleteByExample(example); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDeleteByExample(example); + return execute((Context) options, operation); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 75ddbb5e70314d59bc0f4afbbf0e936925eb101f..81260c3e6a4cd571e725a54ff33323f452399024 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -18,22 +18,28 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.util.ExampleUtils; import lombok.Getter; import lombok.Setter; +import java.util.Collection; import java.util.List; @Getter @@ -80,7 +86,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher @Override public Result executeQuery(Context context, Query query) { - Selector selector = (Selector) context.getOption(Selector.class); + Selector selector = context.getOption(Selector.class); if (selector != null) { List properties = selector.select(getName()); if (properties != null && !properties.isEmpty()) { @@ -105,4 +111,49 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return super.executeQuery(context, query); } + @Override + public int execute(Context context, Operation operation) { + if (!isAggregated() && operation instanceof InsertOrUpdate) { + InsertOrUpdate insertOrUpdate = (InsertOrUpdate) operation; + Insert insert = insertOrUpdate.getInsert(); + Update update = insertOrUpdate.getUpdate(); + int totalCount = 0; + if (insert != null) { + totalCount += super.execute(context, insert); + } + if (update != null) { + totalCount += super.execute(context, update); + } + return totalCount; + } + return super.execute(context, operation); + } + + public void getBoundValue(Context context, Object rootEntity, Collection entities) { + for (Object entity : entities) { + for (Binder binder : binderResolver.getStrongBinders()) { + Object fieldValue = binder.getFieldValue(context, entity); + if (fieldValue == null) { + Object boundValue = binder.getBoundValue(context, rootEntity); + if (boundValue != null) { + binder.setFieldValue(context, entity, boundValue); + } + } + } + } + } + + public void setBoundId(Context context, Object rootEntity, Object entity) { + Binder binder = binderResolver.getBoundIdBinder(); + if (binder != null) { + Object boundValue = binder.getBoundValue(context, rootEntity); + if (boundValue == null) { + Object primaryKey = binder.getFieldValue(context, entity); + if (primaryKey != null) { + binder.setBoundValue(context, rootEntity, primaryKey); + } + } + } + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java index 7ae8769267619d45182898f1be2a1970372b2af8..ca16d4b508115f00680f5062f34b798edfbfd95b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java @@ -17,19 +17,23 @@ package com.gitee.dorive.core.util; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; public class CollectionUtils { - public static Collection toCollection(Object object) { - Collection collection; - if (object instanceof Collection) { - collection = (Collection) object; + public static List toList(Object object) { + if (object instanceof List) { + return (List) object; + + } else if (object instanceof Collection) { + return new ArrayList<>((Collection) object); + } else { - collection = Collections.singletonList(object); + return Collections.singletonList(object); } - return collection; } } diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index 64f097ee16dc0590afeb67bada52090e65356d9b..20666fd6f473d2933dd04469653232c4ffefa32e 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 297735c67547ba7a5f1e2fa525f96b0c4e0c8349..9bfea9696c27c606bd995c8c577344924bb1ee21 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-event diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java index 249fae23da6f72623ba7034686ea928b42f1b473..631ff53964ae80124c128eb4c1ac272bf758d85b 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.annotation; -import com.gitee.dorive.event.entity.OperationType; +import com.gitee.dorive.event.enums.OperationType; import org.springframework.stereotype.Component; import java.lang.annotation.Documented; @@ -27,9 +27,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import static com.gitee.dorive.event.entity.OperationType.DELETE; -import static com.gitee.dorive.event.entity.OperationType.INSERT; -import static com.gitee.dorive.event.entity.OperationType.UPDATE; +import static com.gitee.dorive.event.enums.OperationType.DELETE; +import static com.gitee.dorive.event.enums.OperationType.INSERT; +import static com.gitee.dorive.event.enums.OperationType.UPDATE; @Component @Inherited diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..f265c71c0d0eef9f0f96d1ce871b1af5ca1f8cb9 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.AggregateEvent; + +public interface AggregateEventListener { + + void onAggregateEvent(AggregateEvent aggregateEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..dd76ee6b20bf4556d6975a0c4b2aa86bc49cc25c --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.AggregateRootEvent; + +public interface AggregateRootEventListener { + + void onAggregateRootEvent(AggregateRootEvent aggregateRootEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..33998172094c92f352b8c4ad5292947d1af22c27 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.EntityBatchEvent; + +public interface EntityBatchEventListener { + + void onEntityBatchEvent(EntityBatchEvent entityBatchEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java index 722cbf933f85b4bb84ec8160f7ee88f4bcbd01a2..61480008502d883a50a2239597fa58ac5a597b80 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java @@ -17,7 +17,10 @@ package com.gitee.dorive.event.config; -import com.gitee.dorive.event.impl.ExecutorEventListener; +import com.gitee.dorive.event.listener.ExecutorBatchEventListener; +import com.gitee.dorive.event.listener.ExecutorEventListener; +import com.gitee.dorive.event.listener.RepositoryEventListener; +import com.gitee.dorive.event.listener.RepositoryRootEventListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -31,4 +34,19 @@ public class DoriveEventConfiguration { return new ExecutorEventListener(); } + @Bean("executorBatchEventListenerV3") + public ExecutorBatchEventListener executorBatchEventListener() { + return new ExecutorBatchEventListener(); + } + + @Bean("repositoryEventListenerV3") + public RepositoryEventListener repositoryEventListener() { + return new RepositoryEventListener(); + } + + @Bean("repositoryRootEventListenerV3") + public RepositoryRootEventListener repositoryRootEventListener() { + return new RepositoryRootEventListener(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java similarity index 95% rename from dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java rename to dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java index c87d14ca1280e5dafd6eb983ad8fd189cd092f67..323bacbd1d960d9a0df2889265dc64b84a962f5d 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java @@ -15,10 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.event.entity; +package com.gitee.dorive.event.def; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.event.annotation.EntityListener; +import com.gitee.dorive.event.enums.OperationType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..0b9f85825ff7f4a9bc0244c9fd1aa1b206f0a691 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AggregateEvent extends RepositoryEvent { + + private List entities; + + public AggregateEvent(AbstractEventRepository repository) { + super(repository); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..89421f70e44a37d9942880bc52378eaa6a11d6f2 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AggregateRootEvent extends AggregateEvent { + + public AggregateRootEvent(AbstractEventRepository repository) { + super(repository); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..653f2ba554f4a6d6926bddb1de538c0f0394d66f --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.EntityOp; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.event.enums.OperationType; +import lombok.Getter; +import lombok.Setter; +import org.springframework.context.ApplicationEvent; + +import java.util.List; + +@Getter +@Setter +public class CommonEvent extends ApplicationEvent { + + private Context context; + private Operation operation; + private OperationType operationType; + + public CommonEvent(Object source) { + super(source); + } + + public void setOperation(Operation operation) { + this.operation = operation; + if (operation instanceof EntityOp) { + this.operationType = OperationType.UNKNOWN; + if (operation instanceof Insert) { + this.operationType = OperationType.INSERT; + + } else if (operation instanceof Update) { + this.operationType = OperationType.UPDATE; + + } else if (operation instanceof Delete) { + this.operationType = OperationType.DELETE; + } + } + } + + public List getEntities() { + EntityOp entityOp = (EntityOp) operation; + return entityOp.getEntities(); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..4e153276c38969c8e882e298844598a9a2baedb1 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.event.executor.EventExecutor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class EntityBatchEvent extends ExecutorEvent { + + private List entities; + + public EntityBatchEvent(EventExecutor eventExecutor) { + super(eventExecutor); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java index 1c080e1b5dd98f562179732aabc218be9496c0df..2461630870a7ae282820aeaf468fb0257111ca79 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java @@ -17,17 +17,18 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.core.api.context.Context; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import com.gitee.dorive.event.executor.EventExecutor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class EntityEvent extends ExecutorEvent { -@Data -@NoArgsConstructor -@AllArgsConstructor -public class EntityEvent { - private ExecutorEvent executorEvent; - private Context context; - private OperationType operationType; private Object entity; + + public EntityEvent(EventExecutor eventExecutor) { + super(eventExecutor); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 09185077064e899dc63befc3dc88b43d4bbb8112..9a0da4977ef4e47ac71413f316ea79e710aa51b9 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -17,22 +17,23 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.event.impl.EventExecutor; +import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; import lombok.Setter; -import org.springframework.context.ApplicationEvent; @Getter @Setter -public class ExecutorEvent extends ApplicationEvent { - - private Context context; - private Operation operation; +public class ExecutorEvent extends CommonEvent { public ExecutorEvent(EventExecutor eventExecutor) { super(eventExecutor); } + public Class getEntityClass() { + EventExecutor eventExecutor = (EventExecutor) getSource(); + EntityEle entityEle = eventExecutor.getEntityEle(); + return entityEle.getGenericType(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..bceb11825fecb5232b8fc9e210dc59eb50ada833 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RepositoryEvent extends CommonEvent { + + public RepositoryEvent(AbstractEventRepository repository) { + super(repository); + } + + public Class getEntityClass() { + AbstractEventRepository repository = (AbstractEventRepository) getSource(); + EntityEle entityEle = repository.getEntityEle(); + return entityEle.getGenericType(); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java b/dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java similarity index 94% rename from dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java rename to dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java index a4f859471d647ff80704ec58268f52496376f301..aa71e6d62683ed5e6491cb7803f9568ae5683f06 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.event.entity; +package com.gitee.dorive.event.enums; public enum OperationType { UNKNOWN, INSERT, UPDATE, - DELETE, + DELETE } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java similarity index 88% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java rename to dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java index 2188f3f56163dc974a13339aa75f76b49d105119..e04bdada95ebd8fc034fd191708a261e03281ece 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.executor; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; @@ -23,12 +23,12 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; import com.gitee.dorive.event.entity.ExecutorEvent; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.springframework.context.ApplicationContext; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class EventExecutor extends AbstractProxyExecutor { private ApplicationContext applicationContext; @@ -42,14 +42,14 @@ public class EventExecutor extends AbstractProxyExecutor { @Override public int execute(Context context, Operation operation) { - int count = super.execute(context, operation); - if (count != 0) { + int totalCount = super.execute(context, operation); + if (totalCount != 0) { ExecutorEvent executorEvent = new ExecutorEvent(this); executorEvent.setContext(context); executorEvent.setOperation(operation); applicationContext.publishEvent(executorEvent); } - return count; + return totalCount; } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java similarity index 33% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java index dd22a9a9bb268d3dfe84ef7bd412044ad2408347..d1a26fb499dc4a60984e56f462786e1b1a94b506 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java @@ -15,26 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.listener; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Update; -import com.gitee.dorive.event.api.EntityEventListener; -import com.gitee.dorive.event.entity.EntityEvent; -import com.gitee.dorive.event.entity.EntityListenerDef; -import com.gitee.dorive.event.entity.ExecutorEvent; -import com.gitee.dorive.event.entity.OperationType; -import lombok.extern.slf4j.Slf4j; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import lombok.Data; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationListener; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.OrderUtils; @@ -45,11 +37,11 @@ import java.util.concurrent.ConcurrentHashMap; import static org.springframework.core.Ordered.LOWEST_PRECEDENCE; -@Slf4j -public class ExecutorEventListener implements ApplicationListener, ApplicationContextAware, InitializingBean { +@Data +public abstract class AbstractEventListener implements ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; - private final Map, List> classEntityEventListenersMap = new ConcurrentHashMap<>(); + private final Map, List> classEntityListenerAdaptersMap = new ConcurrentHashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { @@ -58,19 +50,18 @@ public class ExecutorEventListener implements ApplicationListener @Override public void afterPropertiesSet() { - Map entityEventListenerMap = applicationContext.getBeansOfType(EntityEventListener.class); - List entityEventListeners = new ArrayList<>(entityEventListenerMap.values()); - AnnotationAwareOrderComparator.sort(entityEventListeners); - - for (EntityEventListener entityEventListener : entityEventListeners) { - Class listenerType = entityEventListener.getClass(); + Map beanMap = applicationContext.getBeansOfType(getBeanType()); + List beans = new ArrayList<>(beanMap.values()); + AnnotationAwareOrderComparator.sort(beans); + for (Object bean : beans) { + Class listenerType = bean.getClass(); Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); - registry(order, entityListenerDef, entityEventListener); + registry(order, entityListenerDef, bean); } } - public void registry(Integer order, EntityListenerDef entityListenerDef, EntityEventListener entityEventListener) { + public void registry(Integer order, EntityListenerDef entityListenerDef, Object bean) { if (entityListenerDef == null) { return; } @@ -78,66 +69,29 @@ public class ExecutorEventListener implements ApplicationListener if (entityClass == null) { return; } - if (entityEventListener instanceof EntityEventListenerAdapter) { - EntityEventListenerAdapter entityEventListenerAdapter = (EntityEventListenerAdapter) entityEventListener; - entityEventListenerAdapter.setOrder(order); - entityEventListenerAdapter.setEntityListenerDef(entityListenerDef); - - } else { - entityEventListener = new EntityEventListenerAdapter(order, entityListenerDef, entityEventListener); - } - List existEntityEventListeners = classEntityEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); - existEntityEventListeners.add(entityEventListener); + EntityListenerAdapter adapter = newAdapter(order, entityListenerDef, bean); + List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); + existAdapters.add(adapter); } - public void cancel(Class entityClass, EntityEventListener entityEventListener) { - List existEntityEventListeners = classEntityEventListenersMap.get(entityClass); - if (existEntityEventListeners == null) { + public void cancel(Class entityClass, Object bean) { + List existAdapters = classEntityListenerAdaptersMap.get(entityClass); + if (existAdapters == null) { return; } - EntityEventListener existEntityEventListener = CollUtil.findOne(existEntityEventListeners, - listener -> entityEventListener == getRealListener(listener)); - if (existEntityEventListener != null) { - existEntityEventListeners.remove(existEntityEventListener); + EntityListenerAdapter adapter = CollUtil.findOne(existAdapters, a -> a.getBean() == bean); + if (adapter != null) { + existAdapters.remove(adapter); } } - private EntityEventListener getRealListener(EntityEventListener entityEventListener) { - if (entityEventListener instanceof EntityEventListenerAdapter) { - return ((EntityEventListenerAdapter) entityEventListener).getEntityEventListener(); - } - return entityEventListener; + public boolean isHandle(CommonEvent commonEvent) { + Operation operation = commonEvent.getOperation(); + return operation instanceof EntityOp; } - @Override - public void onApplicationEvent(ExecutorEvent executorEvent) { - EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); - EntityEle entityEle = eventExecutor.getEntityEle(); - Class entityClass = entityEle.getGenericType(); - List entityEventListeners = classEntityEventListenersMap.get(entityClass); - if (entityEventListeners != null && !entityEventListeners.isEmpty()) { - EntityEvent entityEvent = newEntityEvent(executorEvent); - for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityEvent(entityEvent); - } - } - } - - private EntityEvent newEntityEvent(ExecutorEvent executorEvent) { - Context context = executorEvent.getContext(); - Operation operation = executorEvent.getOperation(); - OperationType operationType = OperationType.UNKNOWN; - if (operation instanceof Insert) { - operationType = OperationType.INSERT; - - } else if (operation instanceof Update) { - operationType = OperationType.UPDATE; + protected abstract Class getBeanType(); - } else if (operation instanceof Delete) { - operationType = OperationType.DELETE; - } - Object entity = operation.getEntity(); - return new EntityEvent(executorEvent, context, operationType, entity); - } + protected abstract EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java similarity index 76% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java rename to dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java index a403fe556213fac5b593e0181b734ce0cd6bbe6d..6c4a048aeb1c76d3c201f00e2526d60a8301c713 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java @@ -15,12 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.listener; import cn.hutool.core.util.ArrayUtil; -import com.gitee.dorive.event.api.EntityEventListener; -import com.gitee.dorive.event.entity.EntityEvent; -import com.gitee.dorive.event.entity.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.def.EntityListenerDef; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -29,32 +28,35 @@ import org.springframework.core.Ordered; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; +import java.util.function.Consumer; + @Data @Slf4j @NoArgsConstructor @AllArgsConstructor -public class EntityEventListenerAdapter implements EntityEventListener { +public class EntityListenerAdapter { private Integer order; private EntityListenerDef entityListenerDef; - private EntityEventListener entityEventListener; + private Object bean; + private Consumer consumer; - @Override - public void onEntityEvent(EntityEvent entityEvent) { - boolean isSubscribe = ArrayUtil.contains(entityListenerDef.getSubscribeTo(), entityEvent.getOperationType()); + public void onCommonEvent(CommonEvent commonEvent) { + boolean isSubscribe = ArrayUtil.contains(entityListenerDef.getSubscribeTo(), commonEvent.getOperationType()); if (isSubscribe) { boolean isTxActive = entityListenerDef.isAfterCommit() && TransactionSynchronizationManager.isActualTransactionActive(); if (!isTxActive) { - handleEntityEvent(entityEvent, true); + handleEntityEvent(commonEvent, true); } else { - handleEntityEventWhenTxActive(entityEvent); + handleEntityEventWhenTxActive(commonEvent); } } } - private void handleEntityEvent(EntityEvent entityEvent, boolean canRollback) { + private void handleEntityEvent(CommonEvent commonEvent, boolean canRollback) { try { - entityEventListener.onEntityEvent(entityEvent); + consumer.accept(commonEvent); + } catch (Throwable throwable) { if (canRollback && matchRollbackFor(throwable)) { throw throwable; @@ -76,9 +78,9 @@ public class EntityEventListenerAdapter implements EntityEventListener { return false; } - private void handleEntityEventWhenTxActive(EntityEvent entityEvent) { + private void handleEntityEventWhenTxActive(CommonEvent commonEvent) { try { - TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); + TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(commonEvent)); } catch (Exception e) { log.error("Transaction registration failed: " + e.getMessage(), e); } @@ -90,7 +92,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @AllArgsConstructor private class TransactionInvoker implements TransactionSynchronization, Ordered { - private final EntityEvent entityEvent; + private final CommonEvent commonEvent; @Override public int getOrder() { @@ -99,7 +101,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @Override public void afterCommit() { - handleEntityEvent(entityEvent, false); + handleEntityEvent(commonEvent, false); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..cd1729bc628116e63a8795f2eecf313910f84e13 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.EntityBatchEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.EntityBatchEvent; +import com.gitee.dorive.event.entity.ExecutorEvent; +import com.gitee.dorive.event.executor.EventExecutor; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class ExecutorBatchEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return EntityBatchEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + EntityBatchEventListener listener = (EntityBatchEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onEntityBatchEvent((EntityBatchEvent) event)); + } + + @Override + public void onApplicationEvent(ExecutorEvent executorEvent) { + if (isHandle(executorEvent)) { + Class entityClass = executorEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(executorEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + private CommonEvent convert(ExecutorEvent executorEvent) { + EntityBatchEvent entityBatchEvent = new EntityBatchEvent((EventExecutor) executorEvent.getSource()); + BeanUtil.copyProperties(executorEvent, entityBatchEvent); + entityBatchEvent.setEntities(executorEvent.getEntities()); + return entityBatchEvent; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java similarity index 30% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java rename to dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java index a453e57354f27da14a209da387144c5e89600cc9..73796c4981a94590d115dd1014ca9ae587b992dd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java @@ -15,85 +15,59 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.event.listener; -import com.gitee.dorive.core.api.converter.Converter; -import com.gitee.dorive.core.api.converter.EntityMapper; -import lombok.AllArgsConstructor; -import lombok.Data; +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.EntityEvent; +import com.gitee.dorive.event.entity.ExecutorEvent; +import com.gitee.dorive.event.executor.EventExecutor; +import org.springframework.context.ApplicationListener; import java.util.ArrayList; import java.util.List; -import java.util.Map; -@Data -@AllArgsConstructor -public class DefaultEntityMapper implements EntityMapper { - - private Map fieldAliasMapping; - private Map aliasFieldMapping; - private Map fieldPropMapping; - private Map fieldConverterMap; - private Map aliasConverterMap; - private Map propConverterMap; - - @Override - public String fieldToAlias(String field) { - return fieldAliasMapping.get(field); - } - - @Override - public String aliasToField(String alias) { - return aliasFieldMapping.get(alias); - } +public class ExecutorEventListener extends AbstractEventListener implements ApplicationListener { @Override - public String fieldToProp(String field) { - return fieldPropMapping.get(field); + protected Class getBeanType() { + return EntityEventListener.class; } @Override - public boolean hasConverter() { - return fieldConverterMap != null && !fieldConverterMap.isEmpty(); + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + EntityEventListener listener = (EntityEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onEntityEvent((EntityEvent) event)); } @Override - public Object fieldToAlias(String alias, Object value) { - Converter converter = aliasConverterMap.get(alias); - if (converter != null) { - if (value instanceof List) { - List list = (List) value; - List newList = new ArrayList<>(list.size()); - for (Object item : list) { - Object mapValue = converter.deconstruct(item); - if (mapValue != null) { - newList.add(mapValue); - } else { - newList.add(item); + public void onApplicationEvent(ExecutorEvent executorEvent) { + if (isHandle(executorEvent)) { + Class entityClass = executorEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + List commonEvents = convert(executorEvent); + for (EntityListenerAdapter adapter : existAdapters) { + for (CommonEvent commonEvent : commonEvents) { + adapter.onCommonEvent(commonEvent); } } - return newList; - - } else { - Object mapValue = converter.deconstruct(value); - if (mapValue != null) { - return mapValue; - } } } - return value; } - @Override - public Object aliasToField(String field, Object value) { - Converter converter = fieldConverterMap.get(field); - return converter != null ? converter.reconstitute(value) : value; - } - - @Override - public Object fieldToProp(String prop, Object value) { - Converter converter = propConverterMap.get(prop); - return converter != null ? converter.deconstruct(value) : value; + private List convert(ExecutorEvent executorEvent) { + List entities = executorEvent.getEntities(); + List commonEvents = new ArrayList<>(entities.size()); + for (Object entity : entities) { + EntityEvent entityEvent = new EntityEvent((EventExecutor) executorEvent.getSource()); + BeanUtil.copyProperties(executorEvent, entityEvent); + entityEvent.setEntity(entity); + commonEvents.add(entityEvent); + } + return commonEvents; } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..f1f9dcdd679320155e910cbf9bb1cba90d1594e3 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.AggregateEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.AggregateEvent; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class RepositoryEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return AggregateEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + AggregateEventListener listener = (AggregateEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onAggregateEvent((AggregateEvent) event)); + } + + @Override + public void onApplicationEvent(RepositoryEvent repositoryEvent) { + if (isHandle(repositoryEvent)) { + Class entityClass = repositoryEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(repositoryEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + private CommonEvent convert(RepositoryEvent repositoryEvent) { + AggregateEvent aggregateEvent = new AggregateEvent((AbstractEventRepository) repositoryEvent.getSource()); + BeanUtil.copyProperties(repositoryEvent, aggregateEvent); + aggregateEvent.setEntities(repositoryEvent.getEntities()); + return aggregateEvent; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..d29e232375d71009c1aaf1de7bef241411bb3094 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.event.api.AggregateRootEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.AggregateRootEvent; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class RepositoryRootEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return AggregateRootEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + AggregateRootEventListener listener = (AggregateRootEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onAggregateRootEvent((AggregateRootEvent) event)); + } + + @Override + public void onApplicationEvent(RepositoryEvent repositoryEvent) { + if (isHandle(repositoryEvent)) { + Class entityClass = repositoryEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(repositoryEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + @Override + public boolean isHandle(CommonEvent commonEvent) { + Operation operation = commonEvent.getOperation(); + return super.isHandle(commonEvent) && operation.isUncontrolled(); + } + + private CommonEvent convert(RepositoryEvent repositoryEvent) { + AggregateRootEvent aggregateRootEvent = new AggregateRootEvent((AbstractEventRepository) repositoryEvent.getSource()); + BeanUtil.copyProperties(repositoryEvent, aggregateRootEvent); + aggregateRootEvent.setEntities(repositoryEvent.getEntities()); + return aggregateRootEvent; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java index d89359980d4303ffda45f177a8ddde30348a8c85..5d76d38e505e815e9c6d477a7b5dc08b74b38907 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -18,13 +18,19 @@ package com.gitee.dorive.event.repository; import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.repository.AbstractGenericRepository; import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.DefaultRepository; import com.gitee.dorive.event.annotation.EnableEvent; -import com.gitee.dorive.event.impl.EventExecutor; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.executor.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; public abstract class AbstractEventRepository extends AbstractGenericRepository { @@ -56,4 +62,32 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo return repository; } + @Override + public int execute(Context context, Operation operation) { + int totalCount = super.execute(context, operation); + if (enableEvent && totalCount != 0) { + if (operation instanceof InsertOrUpdate) { + InsertOrUpdate insertOrUpdate = (InsertOrUpdate) operation; + Insert insert = insertOrUpdate.getInsert(); + Update update = insertOrUpdate.getUpdate(); + if (insert != null) { + publishEvent(context, insert); + } + if (update != null) { + publishEvent(context, update); + } + } else { + publishEvent(context, operation); + } + } + return totalCount; + } + + private void publishEvent(Context context, Operation operation) { + RepositoryEvent repositoryEvent = new RepositoryEvent(this); + repositoryEvent.setContext(context); + repositoryEvent.setOperation(operation); + getApplicationContext().publishEvent(repositoryEvent); + } + } diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index b46ff43d9fea04b08db202645724f9660bde3720..31be841ce83a9535ac002fad342975709b928aca 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index 49c9b84a95790e630a47b038eaa02fd62082777c..ddb5eddeecaa37a52164227b017cd0f519feabe0 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-mybatis-plus diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..7e9db1e327c707db0a82fd49a2c160d7f8ee659d --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.mybatis.plus.api; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.Collection; + +public interface EasyBaseMapper extends BaseMapper { + + Integer insertBatchSomeColumn(Collection entityList); + +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java index 43f64b04fc81d843610270c2ad16a042090668b6..43e23e94e2f7f02d38e110419ccb3bff538b8922 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java @@ -23,16 +23,18 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept import com.gitee.dorive.env.annotation.Key; import com.gitee.dorive.env.annotation.Value; import com.gitee.dorive.env.spring.DynamicConfiguration; -import lombok.Data; -import lombok.EqualsAndHashCode; +import com.gitee.dorive.mybatis.plus.injector.EasySqlInjector; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -@Data +@Getter +@Setter @Order(-100) @Configuration -@EqualsAndHashCode(callSuper = false) public class MybatisPlusConfiguration extends DynamicConfiguration { @Key("mybatis-plus.global-config.enable-sql-runner") @@ -40,10 +42,17 @@ public class MybatisPlusConfiguration extends DynamicConfiguration { private Boolean enableSqlRunner; @Bean + @ConditionalOnMissingBean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } + @Bean + @ConditionalOnMissingBean + public EasySqlInjector easySqlInjector() { + return new EasySqlInjector(); + } + } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java new file mode 100644 index 0000000000000000000000000000000000000000..e1a8ca62073731cbe59ae21bb13b24f9392ff7a2 --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.mybatis.plus.enums; + +public enum InsertMethod { + BATCH +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java similarity index 60% rename from dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java index 30705b4f1b92e308d5c9063bf918bfaa0507f0b6..c0a017c3fa002c1606e4781aa3efd284790f9334 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.mybatis.plus.impl; +package com.gitee.dorive.mybatis.plus.executor; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -31,18 +31,26 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.Condition; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; +import com.gitee.dorive.mybatis.plus.api.EasyBaseMapper; +import com.gitee.dorive.mybatis.plus.enums.InsertMethod; +import com.gitee.dorive.mybatis.plus.impl.AppenderContext; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -58,6 +66,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { private EntityStoreInfo entityStoreInfo; private BaseMapper baseMapper; private Class pojoClass; + private boolean canInsertBatch; @SuppressWarnings("unchecked") public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { @@ -66,6 +75,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { this.entityStoreInfo = entityStoreInfo; this.baseMapper = (BaseMapper) entityStoreInfo.getMapper(); this.pojoClass = (Class) entityStoreInfo.getPojoClass(); + this.canInsertBatch = baseMapper instanceof EasyBaseMapper; } @Override @@ -140,54 +150,74 @@ public class MybatisPlusExecutor extends AbstractExecutor { } @Override + @SuppressWarnings("unchecked") public int execute(Context context, Operation operation) { - Object persistent = operation.getEntity(); - - if (operation instanceof Insert) { - return baseMapper.insert(persistent); - - } else if (operation instanceof Update) { - Update update = (Update) operation; - Object primaryKey = update.getPrimaryKey(); - Example example = update.getExample(); - - Set nullableProps = update.getNullableProps(); - if (nullableProps != null && !nullableProps.isEmpty()) { - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey, example); - return baseMapper.update(null, updateWrapper); + int totalCount = 0; + if (operation instanceof EntityOp) { + EntityOp entityOp = (EntityOp) operation; + List persistentObjs = entityOp.getEntities(); + if (entityOp instanceof Insert) { + InsertMethod insertMethod = context.getOption(InsertMethod.class); + boolean isBatch = insertMethod == null ? persistentObjs.size() >= 100 : insertMethod == InsertMethod.BATCH; + if (canInsertBatch && isBatch) { + totalCount += ((EasyBaseMapper) baseMapper).insertBatchSomeColumn((Collection) persistentObjs); + } else { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.insert(persistent); + } + } + + } else if (operation instanceof Update) { + Update update = (Update) operation; + Set nullableProps = update.getNullableProps(); + if (nullableProps != null && !nullableProps.isEmpty()) { + for (Object persistent : persistentObjs) { + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey); + totalCount += baseMapper.update(null, updateWrapper); + } + } else { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.updateById(persistent); + } + } + + } else if (operation instanceof Delete) { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.deleteById(persistent); + } } - if (primaryKey != null) { - return baseMapper.updateById(persistent); - - } else if (example != null) { - return baseMapper.update(persistent, buildUpdateWrapper(example)); - } - - } else if (operation instanceof Delete) { - Delete delete = (Delete) operation; - Object primaryKey = delete.getPrimaryKey(); - Example example = delete.getExample(); - - if (primaryKey != null) { - return baseMapper.deleteById((Serializable) primaryKey); - - } else if (example != null) { - return baseMapper.delete(buildUpdateWrapper(example)); + } else if (operation instanceof Condition) { + if (operation instanceof ConditionUpdate) { + ConditionUpdate conditionUpdate = (ConditionUpdate) operation; + Object entity = conditionUpdate.getEntity(); + Object primaryKey = conditionUpdate.getPrimaryKey(); + Example example = conditionUpdate.getExample(); + if (primaryKey != null) { + totalCount += baseMapper.update(entity, buildUpdateWrapper(primaryKey)); + + } else if (example != null) { + totalCount += baseMapper.update(entity, buildUpdateWrapper(example)); + } + + } else if (operation instanceof ConditionDelete) { + ConditionDelete conditionDelete = (ConditionDelete) operation; + Object primaryKey = conditionDelete.getPrimaryKey(); + Example example = conditionDelete.getExample(); + if (primaryKey != null) { + totalCount += baseMapper.deleteById((Serializable) primaryKey); + + } else if (example != null) { + totalCount += baseMapper.delete(buildUpdateWrapper(example)); + } } } - return 0; - } - - private UpdateWrapper buildUpdateWrapper(Example example) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - AppenderContext.appendCriterion(updateWrapper, example); - return updateWrapper; + return totalCount; } - private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableProps, Object primaryKey, Example example) { + private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableProps, Object primaryKey) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - Map propAliasMappingWithoutPk = entityStoreInfo.getPropAliasMappingWithoutPk(); propAliasMappingWithoutPk.forEach((prop, alias) -> { Object value = BeanUtil.getFieldValue(persistent, prop); @@ -195,13 +225,21 @@ public class MybatisPlusExecutor extends AbstractExecutor { updateWrapper.set(true, alias, value); } }); - if (primaryKey != null) { updateWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); } - if (example != null) { - AppenderContext.appendCriterion(updateWrapper, example); - } + return updateWrapper; + } + + private UpdateWrapper buildUpdateWrapper(Object primaryKey) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); + return updateWrapper; + } + + private UpdateWrapper buildUpdateWrapper(Example example) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + AppenderContext.appendCriterion(updateWrapper, example); return updateWrapper; } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java new file mode 100644 index 0000000000000000000000000000000000000000..20b3b9bf770b4b7a8306d37f9eed4fcd9cae913c --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java @@ -0,0 +1,20 @@ +package com.gitee.dorive.mybatis.plus.injector; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; + +import java.util.List; + +public class EasySqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); + return methodList; + } + +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index b9a9375dec1bb20d0063f518ee90bccec24aeea5..44712dff94dce958fbea08623bb47d6ed467ee71 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; @@ -28,8 +29,8 @@ import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.option.QueryMethod; -import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; +import com.gitee.dorive.core.entity.enums.QueryMethod; +import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryWrapper; @@ -40,8 +41,8 @@ import com.gitee.dorive.sql.entity.common.CountQuery; import com.gitee.dorive.sql.impl.count.DefaultCountQuerier; import com.gitee.dorive.sql.impl.executor.SqlQueryExecutor; import com.gitee.dorive.sql.impl.executor.UnionExecutor; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.ParameterizedType; @@ -51,8 +52,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier { private SqlRunner sqlRunner; @@ -97,13 +98,13 @@ public class MybatisPlusRepository extends AbstractRefRepository i private EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { String tableName = tableInfo.getTableName(); String keyProperty = tableInfo.getKeyProperty(); - String keyColumn = tableInfo.getKeyColumn(); + String keyColumn = clearColumn(tableInfo.getKeyColumn()); List tableFieldInfos = tableInfo.getFieldList(); int size = tableFieldInfos.size() + 1; Map propAliasMappingWithoutPk = new LinkedHashMap<>(size * 4 / 3 + 1); for (TableFieldInfo tableFieldInfo : tableFieldInfos) { - propAliasMappingWithoutPk.put(tableFieldInfo.getProperty(), tableFieldInfo.getColumn()); + propAliasMappingWithoutPk.put(tableFieldInfo.getProperty(), clearColumn(tableFieldInfo.getColumn())); } Map propAliasMapping = new LinkedHashMap<>(size * 4 / 3 + 1); @@ -112,11 +113,17 @@ public class MybatisPlusRepository extends AbstractRefRepository i } propAliasMapping.putAll(propAliasMappingWithoutPk); + Map aliasPropMapping = MapUtil.reverse(propAliasMapping); + List columns = new ArrayList<>(propAliasMapping.values()); String selectColumns = StrUtil.join(",", columns); - return new EntityStoreInfo(mapperClass, mapper, pojoClass, - tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, selectColumns); + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, + propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns); + } + + private String clearColumn(String column) { + return StrUtil.removeAll(column, "`").trim(); } @Override @@ -128,7 +135,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i @Override protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { Context context = queryContext.getContext(); - QueryMethod queryMethod = (QueryMethod) context.getOption(QueryMethod.class); + QueryMethod queryMethod = context.getOption(QueryMethod.class); if (queryMethod == null || queryMethod == QueryMethod.SQL) { return sqlQueryExecutor; } diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index 52aebc36577608547f38828f1f745090cebac8ff..6f6acb1e00e79e27b8290692b4823f0a6ebfff94 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-proxy diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 9da0aa6dad696d3fd9e8f2ec89c133b2231d31fa..a82d94c19edab5f9b86f05200733f2bdfb93eb07 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-query diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index ea1784a893efca4b42f75a39e7cfba35bc0b66de..f598e6343a6a96036d86627eb076e86cdc5aa555 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -36,8 +36,8 @@ import com.gitee.dorive.query.impl.executor.StepwiseQueryExecutor; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; @@ -45,8 +45,8 @@ import org.springframework.core.annotation.AnnotatedElementUtils; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryRepository, QueryExecutor { private QueryScanDef queryScanDef; diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 8281b7ddeebde7e3652c299ab5d7b23b6c473a2a..f25157856c2cb27875227f525150167798cbf8ab 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 6605196a9016378f349b5b91801fc2e920f1dc98..e8ef45fc32813088d5088e703769afc0fd2d6436 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 739265873dfa74d6d3d617003236eb00f98bbb87..52670242ef1f24c9a2fa01e15b997ed2822f446d 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-sql diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java index a6122243e2411acfc4f436390e4d2aa65f1c7a47..26f4ef3bacd82c4eff00a3af3a5a6f06a40f21aa 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java @@ -28,7 +28,7 @@ import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; import com.gitee.dorive.sql.api.SqlRunner; import lombok.Getter; diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index e0ee277b656d2707a7c6f4b677944bb1238fdbb2..a36d2e398f0c2cdf98fa044c5283d2091064f7a8 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-web diff --git a/pom.xml b/pom.xml index 0ab8cb4cf08326dfa2055a191a4549d39cd732e6..030ee8709fc01fe3a756e4cc1f3b82409f4a1326 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 pom