diff --git a/README.md b/README.md index 20b78b724acd2d6905c661f73d23e47f2746b0e0..95e1c07172f6a5386352ab7f462d541ab15781d9 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ stars


-🔥🔥🔥轻量的级领域驱动式ORM框架,帮助开发者通过建模,快速构建具有可维护性、可拓展性的应用程序。 +🔥🔥🔥轻量的领域驱动的ORM框架,帮助开发者通过建模,快速构建具有可维护性、可拓展性的应用程序。 ### 👍推荐理由 diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 9e38d8c6a04627fd4266714f7289af7bf34b75c9..dbc29289910e5e802e58acdb8ea89b676a94689f 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-api diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java index 88254fa04bcb1e89673342b61a5dd85c6980787b..4a482035af22016fcff5f00275af953284943975 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java @@ -17,14 +17,23 @@ package com.gitee.dorive.api.annotation; -import java.lang.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 Alias { + @AliasFor(annotation = Field.class) String value() default ""; } 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 new file mode 100644 index 0000000000000000000000000000000000000000..ff42c494c8ab2504f78497388a1efa33f899e9af --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -0,0 +1,40 @@ +/* + * 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.*; + +@Inherited +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD}) +public @interface Field { + + @AliasFor("alias") + String value() default ""; + + @AliasFor("value") + String alias() default ""; + + Class converter() default Object.class; + + String mapExp() default ""; + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java similarity index 90% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java rename to dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java index c7b892f29edc8d2d52af698149e8ce66546195c0..75e0b5a498039c6719f78ad1b25624184884ea80 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.api; +package com.gitee.dorive.api.constant; public interface Keys { + String FIELD_EXECUTOR = "FIELD_EXECUTOR"; String QUERIER = "QUERIER"; String TABLE_INFO = "TABLE_INFO"; - String ALIAS_EXECUTOR = "ALIAS_EXECUTOR"; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java index c240e48dc059add004286650088fce04b0b72a0b..a0a03fbb5729eea215d0a8b64906c44de488149a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java @@ -26,8 +26,5 @@ public interface OperationType { int DELETE = 0x00000008; int UPDATE_OR_DELETE = UPDATE | DELETE; int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; - int FORCE_IGNORE = 0x00000010; int FORCE_INSERT = 0x00000010 | INSERT; - int IGNORE_ROOT = 0x00000020; - int INCLUDE_ROOT = 0x00000040; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java index 9ff30c646e548f5726d5d1307d6fd331255c88c0..d2dac55d01287d15ccc11505d505d06182f5eaae 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java @@ -58,7 +58,7 @@ public class EntityDef { } } - public boolean isAggregated() { + public boolean isRepositoryDef() { return repository != Object.class; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java similarity index 72% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java index 10605c486f5e61a8a555598c922b7ccac93d0b6a..0bcde9f33652aabbc0580379641fa7e32286c830 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/AliasDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java @@ -18,7 +18,7 @@ package com.gitee.dorive.api.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.Alias; +import com.gitee.dorive.api.annotation.Field; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -30,16 +30,15 @@ import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor -public class AliasDef { +public class FieldDef { - private String value; + private String alias; + private Class converter; + private String mapExp; - public static AliasDef fromElement(AnnotatedElement element) { - if (element.isAnnotationPresent(Alias.class)) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Alias.class); - return BeanUtil.copyProperties(attributes, AliasDef.class); - } - return null; + public static FieldDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Field.class); + return attributes != null ? BeanUtil.copyProperties(attributes, FieldDef.class) : null; } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java index 09d257f861f65a1b57b68a6ba9983160c214eb24..3a89c4287ce271908f1d63d08488fe837cb48b47 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java @@ -38,21 +38,21 @@ public abstract class EntityEle { private boolean aggregated; private List bindingDefs; private PropProxy pkProxy; - private Map propAliasMap; + private Map fieldAliasMap; public EntityEle(AnnotatedElement element) { this.element = element; this.entityDef = EntityDef.fromElement(element); - this.aggregated = (entityDef != null && entityDef.isAggregated()) || element.isAnnotationPresent(Aggregate.class); + this.aggregated = (entityDef != null && entityDef.isRepositoryDef()) || isAggregateDef(); this.bindingDefs = BindingDef.fromElement(element); } - public boolean isAnnotatedEntity() { + public boolean isEntityDef() { return entityDef != null; } - public boolean isAggregated() { - return aggregated; + public boolean isAggregateDef() { + return element.isAnnotationPresent(Aggregate.class); } public void initialize() { @@ -61,20 +61,24 @@ public abstract class EntityEle { } } - public String toAlias(String property) { - return propAliasMap.getOrDefault(property, property); + public boolean hasField(String field) { + return fieldAliasMap.containsKey(field); } - public List toAliases(List properties) { - if (properties != null && !properties.isEmpty()) { - List aliases = new ArrayList<>(properties.size()); - for (String property : properties) { - String alias = toAlias(property); + public String toAlias(String field) { + return fieldAliasMap.getOrDefault(field, field); + } + + public List toAliases(List fields) { + if (fields != null && !fields.isEmpty()) { + List aliases = new ArrayList<>(fields.size()); + for (String field : fields) { + String alias = toAlias(field); aliases.add(alias); } return aliases; } - return properties; + return fields; } protected abstract void doInitialize(); @@ -85,4 +89,6 @@ public abstract class EntityEle { public abstract EntityType getEntityType(); + public abstract Map getEntityFieldMap(); + } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java index 5ee1fee02e5fcc92a690b8ff4ef2301962709efb..03eca7dc683140ec56359a2541762209f4c9d9f8 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java @@ -18,7 +18,7 @@ package com.gitee.dorive.api.entity.element; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.entity.def.AliasDef; +import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.def.EntityDef; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,6 +27,7 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; +import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) @@ -37,7 +38,7 @@ public class EntityField extends EntityEle { private boolean collection; private Class genericType; private String name; - private AliasDef aliasDef; + private FieldDef fieldDef; private EntityType entityType; public static boolean isComplexType(Class type) { @@ -58,11 +59,12 @@ public class EntityField extends EntityEle { Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; this.genericType = (Class) actualTypeArgument; } - resolve(field); + this.fieldDef = FieldDef.fromElement(field); + resolveGenericType(this.genericType); initialize(); } - private void resolve(Field field) { + private void resolveGenericType(Class genericType) { EntityDef entityDef = getEntityDef(); if (entityDef != null) { EntityDef genericEntityDef = EntityDef.fromElement(genericType); @@ -70,7 +72,6 @@ public class EntityField extends EntityEle { entityDef.merge(genericEntityDef); } } - aliasDef = AliasDef.fromElement(field); if (isComplexType(genericType)) { entityType = EntityType.getInstance(genericType); } @@ -81,10 +82,15 @@ public class EntityField extends EntityEle { if (entityType != null) { entityType.initialize(); setPkProxy(entityType.getPkProxy()); - setPropAliasMap(entityType.getPropAliasMap()); + setFieldAliasMap(entityType.getFieldAliasMap()); } } + @Override + public Map getEntityFieldMap() { + return entityType != null ? entityType.getEntityFieldMap() : null; + } + public boolean isSameType(EntityField entityField) { return type == entityField.getType() && genericType == entityField.getGenericType(); } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java index 7aacd48491cd0ac3c4b68c4cce02dbdab16ff72b..e1bdeebe473562cba2609c6af4a150c9ce84d316 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java @@ -19,10 +19,9 @@ package com.gitee.dorive.api.entity.element; import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.entity.def.AliasDef; +import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.exception.CircularDependencyException; import com.gitee.dorive.api.impl.factory.PropProxyFactory; import com.gitee.dorive.api.util.ReflectUtils; @@ -48,15 +47,15 @@ public class EntityType extends EntityEle { private Class type; private String name; - private Map entityFields; + private Map entityFieldMap; public static synchronized EntityType getInstance(Class type) { EntityType entityType = CACHE.get(type); if (entityType == null) { if (LOCK.add(type)) { entityType = new EntityType(type); - LOCK.remove(type); CACHE.put(type, entityType); + LOCK.remove(type); } else { throw new CircularDependencyException("Circular Dependency! type: " + type.getName()); } @@ -70,38 +69,43 @@ public class EntityType extends EntityEle { this.name = type.getName(); List fields = ReflectUtils.getAllFields(type); - this.entityFields = new LinkedHashMap<>(fields.size() * 4 / 3 + 1); + this.entityFieldMap = new LinkedHashMap<>(fields.size() * 4 / 3 + 1); for (Field field : fields) { if (!Modifier.isStatic(field.getModifiers())) { try { EntityField entityField = new EntityField(field); - entityFields.put(entityField.getName(), entityField); + entityFieldMap.put(entityField.getName(), entityField); } catch (CircularDependencyException e) { log.warn(e.getMessage()); } } } + initialize(); } @Override protected void doInitialize() { Class genericType = getGenericType(); - boolean hasField = ReflectUtil.hasField(genericType, "id"); - Assert.isTrue(hasField, "The primary key not found! type: {}", genericType.getName()); - PropProxy pkProxy = PropProxyFactory.newPropProxy(genericType, "id"); - setPkProxy(pkProxy); + int initialCapacity = entityFieldMap.size() * 4 / 3 + 1; + PropProxy pkProxy = null; + Map propAliasMap = new LinkedHashMap<>(initialCapacity); - Map propAliasMap = new LinkedHashMap<>(entityFields.size() * 4 / 3 + 1); - for (EntityField entityField : entityFields.values()) { + for (EntityField entityField : entityFieldMap.values()) { String name = entityField.getName(); - AliasDef aliasDef = entityField.getAliasDef(); - String alias = aliasDef != null ? aliasDef.getValue() : StrUtil.toUnderlineCase(name); + FieldDef fieldDef = entityField.getFieldDef(); + if ("id".equals(name)) { + pkProxy = PropProxyFactory.newPropProxy(genericType, "id"); + } + String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(name); propAliasMap.put(name, alias); } - setPropAliasMap(propAliasMap); + + Assert.notNull(pkProxy, "The primary key not found! type: {}", genericType.getName()); + setPkProxy(pkProxy); + setFieldAliasMap(propAliasMap); } @Override @@ -119,4 +123,9 @@ public class EntityType extends EntityEle { return this; } + @Override + public Map getEntityFieldMap() { + return entityFieldMap; + } + } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java index f3dbf6bbc1a496985037cbe700a6a1b2660be930..4f8efb07fcac51d082e53e3838e393003d9cfda5 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/PropChain.java @@ -39,7 +39,7 @@ public class PropChain implements PropProxy { this.entityType = entityType; this.accessPath = accessPath; this.entityField = entityField; - if (entityField.isAnnotatedEntity()) { + if (entityField.isEntityDef()) { newPropProxy(); } } @@ -53,8 +53,8 @@ public class PropChain implements PropProxy { } } - public boolean isAnnotatedEntity() { - return entityField.isAnnotatedEntity(); + public boolean isEntityDef() { + return entityField.isEntityDef(); } public boolean isSameType(PropChain propChain) { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java similarity index 94% rename from dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java rename to dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java index 84f9b08d906ef337952c27163adfa6f69dcf5436..c29aa546a3461b93fc3e3f0882ee22998d1ba2c0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/EntityResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/ElementResolver.java @@ -26,17 +26,17 @@ import java.util.LinkedHashMap; import java.util.Map; @Data -public class EntityResolver { +public class ElementResolver { private Map entityEleMap = new LinkedHashMap<>(); - public EntityResolver(EntityType entityType) { + public ElementResolver(EntityType entityType) { this.entityEleMap.put("/", entityType); resolve("", entityType); } private void resolve(String lastAccessPath, EntityType entityType) { - for (EntityField entityField : entityType.getEntityFields().values()) { + for (EntityField entityField : entityType.getEntityFieldMap().values()) { String accessPath = lastAccessPath + "/" + entityField.getName(); entityEleMap.put(accessPath, entityField); EntityType fieldEntityType = entityField.getEntityType(); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java index 426bcc509c6bcaae2a6c2fe46190a923547bfbbb..d891667baabffa95a06ccfb63924f58dbee36732 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/resolver/PropChainResolver.java @@ -36,11 +36,11 @@ public class PropChainResolver { private void resolve(String lastAccessPath, EntityType entityType) { PropChain lastPropChain = propChainMap.get(lastAccessPath); - for (EntityField entityField : entityType.getEntityFields().values()) { + for (EntityField entityField : entityType.getEntityFieldMap().values()) { String accessPath = lastAccessPath + "/" + entityField.getName(); PropChain propChain = new PropChain(lastPropChain, entityType, accessPath, entityField); propChainMap.put(accessPath, propChain); - if (EntityField.isComplexType(entityField.getType()) && !entityField.isAnnotatedEntity()) { + if (EntityField.isComplexType(entityField.getType()) && !entityField.isEntityDef()) { resolve(accessPath, entityField.getEntityType()); } } diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index e5f54ec32f58391898d4cf8c36c4f093336a9ae6..cd0dd2e769284e0f5f64d41cfb825fcd1277adf1 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-coating diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java index 3cd2fa7cbd2f06d1703cc3106f3b535f5962cf41..8c1c8c5a7d43e243ac8b2797f3feb4383501d3e9 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java @@ -34,4 +34,6 @@ public @interface CoatingScan { String regex() default ""; + Class[] queries() default {}; + } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java index f5d11ba773c58bc02c040cd36776ad2558198592..350ebf7233f45dbd08fbfe1b8e66f47075a02065 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java @@ -17,11 +17,11 @@ package com.gitee.dorive.coating.api; +import com.gitee.dorive.coating.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Example; public interface ExampleBuilder { - Example buildExample(Context context, Object coating); + BuildExample buildExample(Context context, Object coating); } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java new file mode 100644 index 0000000000000000000000000000000000000000..1f96fbc1d8a5b189c2faec3d9e1bf0b7d648b4d2 --- /dev/null +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java @@ -0,0 +1,44 @@ +/* + * 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.coating.entity; + +import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.InnerExample; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class BuildExample extends InnerExample { + + private boolean abandoned = false; + private boolean countQueried = false; + + public BuildExample(List criteria) { + super(criteria); + } + + public boolean isQueryAll() { + return !abandoned && isEmpty(); + } + +} diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java index 3a15ca0da87925f9339748466e14fd9649a9c26a..05ce86d9503b34ad8482b004d905f774c346a72b 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java @@ -31,10 +31,10 @@ public class MergedRepository { private String lastAccessPath; private String absoluteAccessPath; - private boolean merged; - private String relativeAccessPath; private CommonRepository definedRepository; private Map> mergedBindersMap; + private boolean merged; + private String relativeAccessPath; private CommonRepository executedRepository; private Integer order; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java index 56b581a8e0f4ab181e52e88b73aced9dc8f628eb..2e393137416836376866ccb5665548b1005908a1 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java @@ -34,7 +34,7 @@ public class SpecificFields { private CoatingField pageField; private CoatingField limitField; - public boolean addProperty(CoatingField coatingField) { + public boolean tryAddField(CoatingField coatingField) { String fieldName = coatingField.getName(); if ("sortBy".equals(fieldName)) { sortByField = coatingField; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java new file mode 100644 index 0000000000000000000000000000000000000000..05d9ff044109ac14094fe0fdb417e6bede8035c5 --- /dev/null +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java @@ -0,0 +1,44 @@ +/* + * 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.coating.entity.def; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.coating.annotation.CoatingScan; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.core.annotation.AnnotatedElementUtils; + +import java.lang.reflect.AnnotatedElement; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CoatingScanDef { + + private String[] value; + private String regex; + private Class[] queries; + + public static CoatingScanDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, CoatingScan.class); + return attributes != null ? BeanUtil.copyProperties(attributes, CoatingScanDef.class) : null; + } + +} diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java index c764018641f1923b351a45fac0d79b881cba53f6..6970a7dcd9ce3e6c98ef0299bb01583c7ed81677 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java @@ -28,7 +28,7 @@ public class ExampleDef { public static ExampleDef fromElement(AnnotatedElement element) { Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Example.class); - return BeanUtil.copyProperties(attributes, ExampleDef.class); + return attributes != null ? BeanUtil.copyProperties(attributes, ExampleDef.class) : null; } } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java index a8bf57e787b377a126fb85fcc4d882f05240956d..76fb485566b43d6af12b84d31216b63e309ca14a 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java @@ -19,13 +19,13 @@ package com.gitee.dorive.coating.impl; import cn.hutool.core.lang.Assert; import com.gitee.dorive.coating.api.ExampleBuilder; +import com.gitee.dorive.coating.entity.BuildExample; import com.gitee.dorive.coating.entity.CoatingCriteria; import com.gitee.dorive.coating.entity.CoatingType; import com.gitee.dorive.coating.entity.MergedRepository; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; @@ -51,7 +51,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { } @Override - public Example buildExample(Context context, Object coating) { + public BuildExample buildExample(Context context, Object coating) { CoatingType coatingType = repository.getCoatingType(coating); CoatingCriteria coatingCriteria = coatingType.newCriteria(coating); Map> criteriaMap = coatingCriteria.getCriteriaMap(); @@ -63,8 +63,8 @@ public class DefaultExampleBuilder implements ExampleBuilder { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); - Example example = new Example(criteria); - repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, example)); + BuildExample buildExample = new BuildExample(criteria); + repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, buildExample)); } executeQuery(context, repoExampleMap); @@ -72,10 +72,10 @@ public class DefaultExampleBuilder implements ExampleBuilder { RepoExample repoExample = repoExampleMap.get("/"); Assert.notNull(repoExample, "The criterion cannot be null!"); - Example example = repoExample.getExample(); - example.setOrderBy(orderBy); - example.setPage(page); - return example; + BuildExample buildExample = repoExample.getBuildExample(); + buildExample.setOrderBy(orderBy); + buildExample.setPage(page); + return buildExample; } private void executeQuery(Context context, Map repoExampleMap) { @@ -83,7 +83,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { if ("/".equals(accessPath)) return; MergedRepository mergedRepository = repoExample.getMergedRepository(); - Example example = repoExample.getExample(); + BuildExample buildExample = repoExample.getBuildExample(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedBindersMap = mergedRepository.getMergedBindersMap(); @@ -94,22 +94,22 @@ public class DefaultExampleBuilder implements ExampleBuilder { for (String relativeAccessPath : mergedBindersMap.keySet()) { RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); if (targetRepoExample != null) { - Example targetExample = targetRepoExample.getExample(); - if (targetExample.isEmptyQuery()) { - example.setEmptyQuery(true); + BuildExample targetExample = targetRepoExample.getBuildExample(); + if (targetExample.isAbandoned()) { + buildExample.setAbandoned(true); break; } } } - if (example.isQueryAll()) { + if (buildExample.isQueryAll()) { return; } List entities = Collections.emptyList(); - if (!example.isEmptyQuery() && example.isDirtyQuery()) { - example.select(binderResolver.getSelfFields()); - entities = executedRepository.selectByExample(context, example); + if (!buildExample.isAbandoned() && buildExample.isNotEmpty()) { + buildExample.select(binderResolver.getSelfFields()); + entities = executedRepository.selectByExample(context, buildExample); } for (Map.Entry> entry : mergedBindersMap.entrySet()) { @@ -117,9 +117,9 @@ public class DefaultExampleBuilder implements ExampleBuilder { List binders = entry.getValue(); RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); if (targetRepoExample != null) { - Example targetExample = targetRepoExample.getExample(); + BuildExample targetExample = targetRepoExample.getBuildExample(); if (entities.isEmpty()) { - targetExample.setEmptyQuery(true); + targetExample.setAbandoned(true); return; } if (binders.size() == 1) { @@ -133,7 +133,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { targetExample.in(boundName, fieldValues); } } else { - targetExample.setEmptyQuery(true); + targetExample.setAbandoned(true); } } else { @@ -143,7 +143,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.build()); } else { - targetExample.setEmptyQuery(true); + targetExample.setAbandoned(true); } } } @@ -170,7 +170,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { @AllArgsConstructor public static class RepoExample { private MergedRepository mergedRepository; - private Example example; + private BuildExample buildExample; } } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java index 3771d7645206fb3cb8228cfbc11a036f25e8c5de..998cd5c17f89bd4c095fabd2ab634b59bed6bd0a 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java @@ -18,19 +18,17 @@ package com.gitee.dorive.coating.impl.resolver; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.coating.annotation.Example; import com.gitee.dorive.coating.entity.CoatingField; import com.gitee.dorive.coating.entity.CoatingType; import com.gitee.dorive.coating.entity.MergedRepository; import com.gitee.dorive.coating.entity.SpecificFields; -import com.gitee.dorive.coating.entity.def.ExampleDef; +import com.gitee.dorive.coating.entity.def.CoatingScanDef; import com.gitee.dorive.coating.entity.def.CriterionDef; +import com.gitee.dorive.coating.entity.def.ExampleDef; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.coating.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Data; -import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.ReflectionUtils; import java.util.ArrayList; @@ -58,51 +56,57 @@ public class CoatingTypeResolver { } public void resolve() throws Exception { - String[] scanPackages = repository.getScanPackages(); - String regex = repository.getRegex(); - Pattern pattern = Pattern.compile(regex); + CoatingScanDef coatingScanDef = repository.getCoatingScanDef(); + String[] scanPackages = coatingScanDef.getValue(); + String regex = coatingScanDef.getRegex(); + Class[] queries = coatingScanDef.getQueries(); + Pattern pattern = Pattern.compile(regex); for (String scanPackage : scanPackages) { List> classes = scannedClasses.get(scanPackage); if (classes == null) { classes = ResourceUtils.resolveClasses(scanPackage); scannedClasses.put(scanPackage, classes); } - for (Class coatingClass : classes) { - Example exampleAnnotation = AnnotationUtils.getAnnotation(coatingClass, Example.class); - if (exampleAnnotation == null) { - continue; - } String simpleName = coatingClass.getSimpleName(); - if (!pattern.matcher(simpleName).matches()) { - continue; + if (pattern.matcher(simpleName).matches()) { + resolveCoatingClass(coatingClass); } - - ExampleDef exampleDef = ExampleDef.fromElement(coatingClass); - List coatingFields = new ArrayList<>(); - SpecificFields specificFields = new SpecificFields(); - - ReflectionUtils.doWithLocalFields(coatingClass, declaredField -> { - CoatingField coatingField = new CoatingField(declaredField); - if (coatingField.isIgnore()) { - return; - } - if (specificFields.addProperty(coatingField)) { - return; - } - coatingFields.add(coatingField); - }); - - List mergedRepositories = matchMergedRepositories(coatingFields); - List reversedMergedRepositories = new ArrayList<>(mergedRepositories); - Collections.reverse(reversedMergedRepositories); - - CoatingType coatingType = new CoatingType(exampleDef, coatingFields, specificFields, mergedRepositories, reversedMergedRepositories); - classCoatingTypeMap.put(coatingClass, coatingType); - nameCoatingTypeMap.put(coatingClass.getName(), coatingType); } } + + for (Class coatingClass : queries) { + resolveCoatingClass(coatingClass); + } + } + + private void resolveCoatingClass(Class coatingClass) { + ExampleDef exampleDef = ExampleDef.fromElement(coatingClass); + if (exampleDef == null) { + return; + } + + List coatingFields = new ArrayList<>(); + SpecificFields specificFields = new SpecificFields(); + + ReflectionUtils.doWithLocalFields(coatingClass, declaredField -> { + CoatingField coatingField = new CoatingField(declaredField); + if (coatingField.isIgnore()) { + return; + } + if (!specificFields.tryAddField(coatingField)) { + coatingFields.add(coatingField); + } + }); + + List mergedRepositories = matchMergedRepositories(coatingFields); + List reversedMergedRepositories = new ArrayList<>(mergedRepositories); + Collections.reverse(reversedMergedRepositories); + + CoatingType coatingType = new CoatingType(exampleDef, coatingFields, specificFields, mergedRepositories, reversedMergedRepositories); + classCoatingTypeMap.put(coatingClass, coatingType); + nameCoatingTypeMap.put(coatingClass.getName(), coatingType); } private List matchMergedRepositories(List coatingFields) { @@ -115,6 +119,7 @@ public class CoatingTypeResolver { for (CoatingField coatingField : coatingFields) { CriterionDef criterionDef = coatingField.getCriterionDef(); String belongTo = criterionDef.getBelongTo(); + String field = criterionDef.getField(); if (!belongTo.startsWith("/")) { MergedRepository mergedRepository = nameMergedRepositoryMap.get(belongTo); @@ -122,16 +127,13 @@ public class CoatingTypeResolver { belongTo = mergedRepository.getAbsoluteAccessPath(); criterionDef.setBelongTo(belongTo); } - MergedRepository mergedRepository = mergedRepositoryMap.get(belongTo); Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); - String fieldName = criterionDef.getField(); CommonRepository repository = mergedRepository.getExecutedRepository(); - EntityEle entityEle = repository.getEntityEle(); - Map propAliasMap = entityEle.getPropAliasMap(); - Assert.isTrue(propAliasMap.containsKey(fieldName), "The field does not exist within the entity! element: {}, field: {}", - entityEle.getElement(), fieldName); + Assert.isTrue(repository.hasField(field), + "The field of @Criterion does not exist in the entity! coating field: {}, entity: {}, field: {}", + coatingField.getField(), repository.getEntityEle().getElement(), field); mergedRepositorySet.add(mergedRepository); } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java index f7f8e679d3868caf1fc1f6fc08af6034c353f497..cc1a22872963489a3a5342ab38abfc91239a9e6f 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java @@ -28,6 +28,7 @@ import lombok.Data; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -36,80 +37,58 @@ import java.util.Map; public class MergedRepositoryResolver { private AbstractContextRepository repository; + // absoluteAccessPath ==> MergedRepository private Map mergedRepositoryMap = new LinkedHashMap<>(); + // name ==> MergedRepository private Map nameMergedRepositoryMap = new LinkedHashMap<>(); public MergedRepositoryResolver(AbstractContextRepository repository) { this.repository = repository; - resolve(); + resolve(new ArrayList<>(), false, repository); } - public void resolve() { - CommonRepository rootRepository = repository.getRootRepository(); - MergedRepository mergedRepository = new MergedRepository( - "", - "/", - false, - "/", - rootRepository, - getMergedBindersMap("", rootRepository), - rootRepository, - 1); - addMergedRepository(mergedRepository); - resolve(new ArrayList<>(), repository); - } - - private void resolve(List multiAccessPath, AbstractContextRepository lastRepository) { + private void resolve(List multiAccessPath, boolean ignoreRoot, AbstractContextRepository contextRepository) { String lastAccessPath = StrUtil.join("", multiAccessPath); - for (CommonRepository repository : lastRepository.getSubRepositories()) { + Collection repositories = contextRepository.getRepositoryMap().values(); + for (CommonRepository repository : repositories) { String accessPath = repository.getAccessPath(); + boolean isRoot = repository.isRoot(); + if (ignoreRoot && isRoot) { + continue; + } + String absoluteAccessPath = lastAccessPath + accessPath; - AbstractRepository abstractRepository = repository.getProxyRepository(); + String relativeAccessPath = absoluteAccessPath; + CommonRepository executedRepository = repository; + AbstractRepository abstractRepository = repository.getProxyRepository(); + AbstractContextRepository abstractContextRepository = null; if (abstractRepository instanceof AbstractContextRepository) { - AbstractContextRepository abstractContextRepository = (AbstractContextRepository) abstractRepository; - CommonRepository rootRepository = abstractContextRepository.getRootRepository(); - - MergedRepository mergedRepository = new MergedRepository( - lastAccessPath, - absoluteAccessPath, - true, - absoluteAccessPath + "/", - repository, - getMergedBindersMap(lastAccessPath, repository), - rootRepository, - mergedRepositoryMap.size() + 1); - addMergedRepository(mergedRepository); + abstractContextRepository = (AbstractContextRepository) abstractRepository; + relativeAccessPath = relativeAccessPath + "/"; + executedRepository = abstractContextRepository.getRootRepository(); + } + MergedRepository mergedRepository = new MergedRepository( + lastAccessPath, + absoluteAccessPath, + repository, + getMergedBindersMap(lastAccessPath, repository), + abstractContextRepository != null, + relativeAccessPath, + executedRepository, + mergedRepositoryMap.size() + 1); + addMergedRepository(mergedRepository); + + if (abstractContextRepository != null) { List newMultiAccessPath = new ArrayList<>(multiAccessPath); newMultiAccessPath.add(accessPath); - resolve(newMultiAccessPath, abstractContextRepository); - - } else { - MergedRepository mergedRepository = new MergedRepository( - lastAccessPath, - absoluteAccessPath, - false, - absoluteAccessPath, - repository, - getMergedBindersMap(lastAccessPath, repository), - repository, - mergedRepositoryMap.size() + 1); - addMergedRepository(mergedRepository); + resolve(newMultiAccessPath, true, abstractContextRepository); } } } - private void addMergedRepository(MergedRepository mergedRepository) { - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); - String name = mergedRepository.getName(); - mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); - if (StringUtils.isNotBlank(name)) { - nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); - } - } - private Map> getMergedBindersMap(String lastAccessPath, CommonRepository repository) { BinderResolver binderResolver = repository.getBinderResolver(); List propertyBinders = binderResolver.getPropertyBinders(); @@ -122,4 +101,13 @@ public class MergedRepositoryResolver { return mergedBindersMap; } + private void addMergedRepository(MergedRepository mergedRepository) { + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); + String name = mergedRepository.getName(); + if (StringUtils.isNotBlank(name)) { + nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); + } + } + } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java index 4701151283d4feb539089cfd0db2d126dd3fa944..3581899615d1e96837b88c6fa700e0bb00f16b64 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java @@ -19,15 +19,15 @@ package com.gitee.dorive.coating.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.annotation.Repository; -import com.gitee.dorive.coating.annotation.CoatingScan; import com.gitee.dorive.coating.api.CoatingRepository; import com.gitee.dorive.coating.api.ExampleBuilder; +import com.gitee.dorive.coating.entity.BuildExample; import com.gitee.dorive.coating.entity.CoatingType; +import com.gitee.dorive.coating.entity.def.CoatingScanDef; import com.gitee.dorive.coating.impl.DefaultExampleBuilder; import com.gitee.dorive.coating.impl.resolver.CoatingTypeResolver; import com.gitee.dorive.coating.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.event.repository.AbstractEventRepository; import lombok.Data; @@ -43,8 +43,7 @@ import java.util.Map; @EqualsAndHashCode(callSuper = false) public abstract class AbstractCoatingRepository extends AbstractEventRepository implements ExampleBuilder, CoatingRepository { - private String[] scanPackages; - private String regex; + private CoatingScanDef coatingScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private CoatingTypeResolver coatingTypeResolver; private ExampleBuilder exampleBuilder; @@ -53,13 +52,14 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); - CoatingScan coatingScan = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), CoatingScan.class); - if (repository != null && coatingScan != null) { - this.scanPackages = coatingScan.value(); - this.regex = StringUtils.isBlank(coatingScan.regex()) ? "^" + getEntityClass().getSimpleName() + ".*" : coatingScan.regex(); - this.mergedRepositoryResolver = new MergedRepositoryResolver(this); - this.coatingTypeResolver = new CoatingTypeResolver(this); - this.exampleBuilder = new DefaultExampleBuilder(this); + coatingScanDef = CoatingScanDef.fromElement(this.getClass()); + if (repository != null && coatingScanDef != null) { + if (StringUtils.isBlank(coatingScanDef.getRegex())) { + coatingScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); + } + mergedRepositoryResolver = new MergedRepositoryResolver(this); + coatingTypeResolver = new CoatingTypeResolver(this); + exampleBuilder = new DefaultExampleBuilder(this); } } @@ -71,37 +71,37 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo } @Override - public Example buildExample(Context context, Object coating) { + public BuildExample buildExample(Context context, Object coating) { return exampleBuilder.buildExample(context, coating); } @Override public List selectByCoating(Context context, Object coating) { - Example example = buildExample(context, coating); - if (example.isEmptyQuery()) { + BuildExample buildExample = buildExample(context, coating); + if (buildExample.isAbandoned()) { return Collections.emptyList(); } - if (example.isCountQueried()) { - example.setPage(null); + if (buildExample.isCountQueried()) { + buildExample.setPage(null); } - return selectByExample(context, example); + return selectByExample(context, buildExample); } @Override @SuppressWarnings("unchecked") public Page selectPageByCoating(Context context, Object coating) { - Example example = buildExample(context, coating); - if (example.isEmptyQuery()) { - return (Page) example.getPage(); + BuildExample buildExample = buildExample(context, coating); + if (buildExample.isAbandoned()) { + return (Page) buildExample.getPage(); } - if (example.isCountQueried()) { - Page page = example.getPage(); - example.setPage(null); - List records = selectByExample(context, example); + if (buildExample.isCountQueried()) { + Page page = buildExample.getPage(); + buildExample.setPage(null); + List records = selectByExample(context, buildExample); page.setRecords((List) records); return (Page) page; } - return selectPageByExample(context, example); + return selectPageByExample(context, buildExample); } } diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index c0bde56d374298b7dc920d9f81fd1f856c6365d7..9884ef570aa9c8a020a50471dde812858d0b06e9 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java index c54ff8168ff05e25e6d40421f91f4dc4a74f9cad..879ab489e3e00e6f5e80972d8804759d053d4b8d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.api.binder; import com.gitee.dorive.core.api.context.Context; -public interface Processor { +public interface BindingProcessor { Object input(Context context, Object value); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.java new file mode 100644 index 0000000000000000000000000000000000000000..21b24d8ba9f5448d144086901de4251bea1c3d8d --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.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.core.api.context; + +public interface Node { + + boolean isRoot(); + + String getName(); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java index e1f3faf8e07a2375f9f4afef1a1ad4fc91c758d0..96be4e7ece09d7789b6b0ca74b15ba172985ed5f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java @@ -18,18 +18,19 @@ package com.gitee.dorive.core.api.context; import com.gitee.dorive.core.impl.selector.AllSelector; +import com.gitee.dorive.core.impl.selector.EmptySelector; import com.gitee.dorive.core.impl.selector.RootSelector; -import com.gitee.dorive.core.repository.CommonRepository; import java.util.List; public interface Selector { - Selector ALL = new AllSelector(); + Selector EMPTY = new EmptySelector(); Selector ROOT = new RootSelector(); + Selector ALL = new AllSelector(); - boolean matches(Context context, CommonRepository repository); + boolean matches(Context context, Node node); - List select(Context context, CommonRepository repository); + List select(Context context, Node node); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..36925d5297e74b1edce7ac3d94e730cf4d2a8b57 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java @@ -0,0 +1,31 @@ +/* + * 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.api.executor; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Criterion; + +public interface FieldConverter { + + Object convert(Context context, Criterion criterion, Object value); + + Object reconstitute(String name, Object value); + + Object deconstruct(String name, Object value); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryContext.java index c107945cb34205681d9f5cc3ad768e683afe3045..129a504fe47f59b8ddcc70ed2300bd5ba7d28788 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryContext.java @@ -50,7 +50,7 @@ public class RepositoryContext implements BeanFactoryPostProcessor { } } - public static Class findTypeByEntity(Class entityClass) { + public static Class findRepositoryClass(Class entityClass) { return ENTITY_REPOSITORY_MAP.get(entityClass); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java new file mode 100644 index 0000000000000000000000000000000000000000..2e9e41b5dd1670c5aa17b59a8d98fc15a30ba22c --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java @@ -0,0 +1,30 @@ +/* + * 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; + +import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.executor.Executor; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ExecutorResult { + private EntityFactory entityFactory; + private Executor executor; +} 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 9bb4ee1836941826c869734637a0f57d9718f852..4db5f3978f1243260ff9fb15ded8fefd5b681d94 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 @@ -19,11 +19,9 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.impl.selector.EmptySelector; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @@ -31,17 +29,14 @@ import java.util.Map; @NoArgsConstructor public abstract class AbstractContext implements Context { - private Selector selector = EmptySelector.EMPTY_SELECTOR; - private Map attachments = Collections.emptyMap(); + private Selector selector = Selector.EMPTY; + private Map attachments = new LinkedHashMap<>(8); public AbstractContext(Selector selector) { this.selector = selector; } public Object put(String key, Object value) { - if (attachments == Collections.EMPTY_MAP) { - attachments = new LinkedHashMap<>(); - } return attachments.put(key, value); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java index 9cfde2435075ecfbb86cec3b63b756ccf39e169b..d856c8b995891686922f790a1d344fe587a010fa 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java @@ -23,7 +23,18 @@ import lombok.Data; @Data @AllArgsConstructor public class Criterion { + private String property; private String operator; private Object value; + + public Criterion(String property, String operator) { + this.property = property; + this.operator = operator; + } + + public Criterion tryClone() { + return new Criterion(property, operator, value); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java index 658952857b5b7eb2b2bfceab8efe41864a6c2a15..8b9d547b315dcf32981a508e2299c9ece64ebd71 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java @@ -31,8 +31,6 @@ import java.util.List; @NoArgsConstructor public class Example { - private boolean emptyQuery = false; - private boolean countQueried = false; private List selectProps; private List extraProps; private List criteria = new ArrayList<>(4); @@ -43,24 +41,12 @@ public class Example { this.criteria = criteria; } - public boolean isDirtyQuery() { - return !criteria.isEmpty(); - } - - public boolean isQueryAll() { - return !emptyQuery && !isDirtyQuery(); - } - - public void select(String... properties) { - select(StringUtils.toList(properties)); - } - public void select(List properties) { selectProps = properties; } - public void selectExtra(String... properties) { - selectExtra(StringUtils.toList(properties)); + public void select(String... properties) { + select(StringUtils.toList(properties)); } public void selectExtra(List properties) { @@ -71,6 +57,18 @@ public class Example { } } + public void selectExtra(String... properties) { + selectExtra(StringUtils.toList(properties)); + } + + public boolean isEmpty() { + return criteria.isEmpty(); + } + + public boolean isNotEmpty() { + return !criteria.isEmpty(); + } + public Example eq(String property, Object value) { criteria.add(new Criterion(property, Operator.EQ, value)); return this; @@ -122,12 +120,12 @@ public class Example { } public Example isNull(String property) { - criteria.add(new Criterion(property, Operator.IS_NULL, null)); + criteria.add(new Criterion(property, Operator.IS_NULL)); return this; } public Example isNotNull(String property) { - criteria.add(new Criterion(property, Operator.IS_NOT_NULL, null)); + criteria.add(new Criterion(property, Operator.IS_NOT_NULL)); return this; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/QueryResult.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/InnerExample.java similarity index 65% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/QueryResult.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/InnerExample.java index d903705e19450b285f731dea5d829505e41b66a0..33e99a8c0eaf6f24b7bb3299b967c462ba90dce8 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/QueryResult.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/InnerExample.java @@ -15,26 +15,21 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.core.entity.executor; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import java.util.List; -import java.util.Map; @Data -public class QueryResult { +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class InnerExample extends Example { - private Page> page; - private List> resultMaps; - - public QueryResult(Page> page) { - this.page = page; - } - - public QueryResult(List> resultMaps) { - this.resultMaps = resultMaps; + public InnerExample(List criteria) { + super(criteria); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java index 4c7b2710f7eae8c2cb274df5277d88f2852462f1..ca49bdecb4954ccbccd81ee5ccf5df310fab52fe 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java @@ -29,8 +29,12 @@ public class MultiResult extends Result { private List> resultMaps; - public MultiResult(List> resultMaps, List entities) { - super(entities); + public MultiResult(Page page, List> resultMaps) { + setPage(page); + this.resultMaps = resultMaps; + } + + public MultiResult(List> resultMaps) { this.resultMaps = resultMaps; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java index 9c874e6dfea13198bf1b81864b74873a2813bedc..76cd1d6fa7e95d1eaf2b2c33611a3153db9d643b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java @@ -21,6 +21,7 @@ import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.ArrayList; import java.util.List; @Data @@ -30,6 +31,10 @@ public class OrderBy { private List properties; private String order; + public OrderBy tryClone() { + return new OrderBy(new ArrayList<>(properties), order); + } + @Override public String toString() { return "ORDER BY " + StrUtil.join(",", properties) + " " + order.toUpperCase(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java index e368926cb90906260f26a3128ff4e00dc1fab4ca..41dba0e93e0f80e0c4d302f7ff01a83dfe1bc32c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java @@ -21,6 +21,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -39,6 +40,10 @@ public class Page { this.size = size; } + public Page tryClone() { + return new Page<>(total, current, size, new ArrayList<>(records)); + } + @Override public String toString() { return "LIMIT " + (current - 1) * size + "," + size; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index 0cbd91975a4fabebffbda98061258c57b726ca7d..33487582bdc597eb6cec51ad7ea8234dd799cf95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -32,7 +32,7 @@ public class UnionExample extends Example { private List examples = new ArrayList<>(); @Override - public boolean isDirtyQuery() { + public boolean isNotEmpty() { return !examples.isEmpty(); } 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 3fee09dcc524a7db7ebced6784a840f48bdd0785..d496055315f2af129cbf8e380807070b425f0f5d 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,12 +17,40 @@ package com.gitee.dorive.core.entity.operation; -import lombok.AllArgsConstructor; +import com.gitee.dorive.api.constant.OperationType; import lombok.Data; @Data -@AllArgsConstructor public class Operation { + + public static final int UNKNOWN = 0; + public static final int INCLUDE_ROOT = 1; + public static final int IGNORE_ROOT = 2; + private int type; private Object entity; + private int rootType; + + public Operation(int type, Object entity) { + this.type = type; + this.entity = entity; + this.rootType = UNKNOWN; + } + + public boolean isInsertContext() { + return (type & OperationType.INSERT) != 0; + } + + public boolean isForceInsert() { + return type == OperationType.FORCE_INSERT; + } + + public boolean isIncludeRoot() { + return rootType == 1; + } + + public boolean isIgnoreRoot() { + return rootType == 2; + } + } 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/Query.java index 9eca5a48c3a84495b55d4938888222e20a767232..84c40cdb4dbe2e9ff074b98ee1c5cdb600811390 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/Query.java @@ -37,8 +37,8 @@ public class Query extends Condition { return getPrimaryKey() == null && getExample() == null; } - public boolean withoutPage() { - return getExample().getPage() == null; + public boolean startPage() { + return getExample() != null && getExample().getPage() != null; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java index 38c1c43ab4cc582abb1626bf2e44d3e7cafc7745..ee67e22cb9e76e03f160d5644ee0a4c0a81273d3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Binder; -import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.api.binder.BindingProcessor; import com.gitee.dorive.core.api.context.Context; import lombok.AllArgsConstructor; import lombok.Data; @@ -30,12 +30,12 @@ import java.util.List; @Data @AllArgsConstructor -public abstract class AbstractBinder implements Binder, Processor { +public abstract class AbstractBinder implements Binder, BindingProcessor { private BindingDef bindingDef; private String alias; private PropChain fieldPropChain; - private Processor processor; + private BindingProcessor bindingProcessor; public String getFieldName() { return fieldPropChain.getEntityField().getName(); @@ -53,12 +53,12 @@ public abstract class AbstractBinder implements Binder, Processor { @Override public Object input(Context context, Object value) { - return processor.input(context, value); + return bindingProcessor.input(context, value); } @Override public Object output(Context context, Object value) { - return processor.output(context, value); + return bindingProcessor.output(context, value); } public List collectFieldValues(Context context, List entities) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java index 79da64a831f7bb21cbbfde0ba4f124203c71b177..950aea469fd4ef7d41fce5e441514c9387bbc5dc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.api.binder.BindingProcessor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.element.PropChain; @@ -26,8 +26,8 @@ import java.util.Map; public class ContextBinder extends AbstractBinder { - public ContextBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, Processor processor) { - super(bindingDef, alias, fieldPropChain, processor); + public ContextBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, BindingProcessor bindingProcessor) { + super(bindingDef, alias, fieldPropChain, bindingProcessor); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java index 3bb6dce54fbe410b3828fc26b8c225fbfa5afc18..6faee09b15d2be66a8f9afd58e7b212da28587db 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.element.PropChain; -import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.api.binder.BindingProcessor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; @@ -37,12 +37,12 @@ public class PropertyBinder extends AbstractBinder { public PropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, - Processor processor, + BindingProcessor bindingProcessor, String belongAccessPath, CommonRepository belongRepository, PropChain boundPropChain, String bindAlias) { - super(bindingDef, alias, fieldPropChain, processor); + super(bindingDef, alias, fieldPropChain, bindingProcessor); this.belongAccessPath = belongAccessPath; this.belongRepository = belongRepository; this.boundPropChain = boundPropChain; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..8f6eda212c7cc02aa646fd127eed7e1488a41c19 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java @@ -0,0 +1,118 @@ +/* + * 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.util.StrUtil; +import com.gitee.dorive.api.entity.def.FieldDef; +import com.gitee.dorive.api.entity.element.EntityField; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.entity.executor.Criterion; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Data +public class DefaultFieldConverter implements FieldConverter { + + private EntityField entityField; + private Map reMapping = Collections.emptyMap(); + private Map deMapping = Collections.emptyMap(); + + public DefaultFieldConverter(EntityField entityField) { + this.entityField = entityField; + FieldDef fieldDef = entityField.getFieldDef(); + Class genericType = entityField.getGenericType(); + String mapExp = fieldDef.getMapExp(); + if (StringUtils.isNotBlank(mapExp)) { + this.reMapping = new LinkedHashMap<>(8); + this.deMapping = new LinkedHashMap<>(8); + List items = StrUtil.splitTrim(mapExp, ","); + for (String item : items) { + if (StringUtils.isNotBlank(item)) { + List valueValuePair = StrUtil.splitTrim(item, "="); + String entityValue = valueValuePair.get(0); + String mapValue = valueValuePair.get(1); + if (genericType == Integer.class) { + reMapping.put(Integer.valueOf(mapValue), Integer.valueOf(entityValue)); + deMapping.put(Integer.valueOf(entityValue), Integer.valueOf(mapValue)); + + } else if (genericType == String.class) { + reMapping.put(mapValue, entityValue); + deMapping.put(entityValue, mapValue); + } + } + } + } + } + + @Override + public Object convert(Context context, Criterion criterion, Object value) { + if (value == null) { + return null; + } + if (value instanceof List) { + List list = (List) value; + List newList = new ArrayList<>(list.size()); + for (Object item : list) { + Object mapValue = deMapping.get(item); + if (mapValue != null) { + newList.add(mapValue); + } else { + newList.add(item); + } + } + return newList; + } + Object mapValue = deMapping.get(value); + if (mapValue != null) { + return mapValue; + } + return value; + } + + @Override + public Object reconstitute(String name, Object value) { + if (value == null) { + return null; + } + Object entityValue = reMapping.get(value); + if (entityValue != null) { + return entityValue; + } + return value; + } + + @Override + public Object deconstruct(String name, Object value) { + if (value == null) { + return null; + } + Object mapValue = deMapping.get(value); + if (mapValue != null) { + return mapValue; + } + return value; + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java similarity index 52% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java index e9a8bc44f16d204e1f6ab62bcd9ae11a98ad3281..bde74464b4da0e405e29a0201c0e887ab6eb86f9 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java @@ -15,50 +15,51 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl.executor; +package com.gitee.dorive.core.impl.executor; -import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.executor.*; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.UnionExample; 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.impl.executor.AbstractExecutor; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import java.util.List; @Data -@AllArgsConstructor +@NoArgsConstructor @EqualsAndHashCode(callSuper = false) -public class AliasExecutor extends AbstractExecutor { +public abstract class AbstractExampleExecutor extends AbstractProxyExecutor { - private EntityEle entityEle; - private Executor executor; + public AbstractExampleExecutor(Executor executor) { + super(executor); + } @Override public Result executeQuery(Context context, Query query) { Example example = query.getExample(); if (example != null) { if (example instanceof UnionExample) { - convert((UnionExample) example); + convert(context, (UnionExample) example); } else { - convert(example); + convert(context, example); } } - return executor.executeQuery(context, query); + return super.executeQuery(context, query); } @Override public long executeCount(Context context, Query query) { Example example = query.getExample(); if (example != null) { - convert(example); + convert(context, example); } - return executor.executeCount(context, query); + return super.executeCount(context, query); } @Override @@ -67,49 +68,19 @@ public class AliasExecutor extends AbstractExecutor { Condition condition = (Condition) operation; Example example = condition.getExample(); if (example != null) { - convert(example); + convert(context, example); } } - return executor.execute(context, operation); + return super.execute(context, operation); } - public void convert(UnionExample unionExample) { + private void convert(Context context, UnionExample unionExample) { List examples = unionExample.getExamples(); for (Example example : examples) { - convert(example); - } - } - - public void convert(Example example) { - convertSelect(example); - convertCriteria(example.getCriteria()); - convertOrderBy(example.getOrderBy()); - } - - public void convertSelect(Example example) { - List properties = example.getSelectProps(); - if (properties != null && !properties.isEmpty()) { - properties = entityEle.toAliases(properties); - example.setSelectProps(properties); + convert(context, example); } } - public void convertCriteria(List criteria) { - if (criteria != null && !criteria.isEmpty()) { - for (Criterion criterion : criteria) { - String property = criterion.getProperty(); - property = entityEle.toAlias(property); - criterion.setProperty(property); - } - } - } - - public void convertOrderBy(OrderBy orderBy) { - if (orderBy != null) { - List properties = orderBy.getProperties(); - properties = entityEle.toAliases(properties); - orderBy.setProperties(properties); - } - } + public abstract void convert(Context context, Example example); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java index f3a6f8f0e3496a8ef479e1b5283664c4ed7b9f30..a5d0456d4fc717e02667ed188693961c995cfcb3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java @@ -18,10 +18,8 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.core.api.executor.Executor; -import lombok.AllArgsConstructor; import lombok.Data; @Data -@AllArgsConstructor public abstract class AbstractExecutor implements Executor { } 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 new file mode 100644 index 0000000000000000000000000000000000000000..92f4fac2097185b3fcb5c8b0fc20616c88da5c43 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java @@ -0,0 +1,53 @@ +/* + * 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.executor; + +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 lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public abstract class AbstractProxyExecutor extends AbstractExecutor { + + private Executor executor; + + @Override + public Result executeQuery(Context context, Query query) { + return executor.executeQuery(context, query); + } + + @Override + public long executeCount(Context context, Query query) { + return executor.executeCount(context, query); + } + + @Override + public int execute(Context context, Operation operation) { + return executor.execute(context, operation); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java similarity index 63% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java index b3ed67d90ecf4b6c626ef26f11f1d9dc56866432..40696f8e9e777274ad0d11ef195c577eee96971e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java @@ -31,23 +31,21 @@ import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.Collection; import java.util.Collections; import java.util.List; -@Getter -@Setter -@ToString -public class ChainExecutor extends AbstractExecutor implements EntityHandler { +@Data +@EqualsAndHashCode(callSuper = false) +public class DefaultExecutor extends AbstractExecutor implements EntityHandler { private final AbstractContextRepository repository; private final EntityHandler entityHandler; - public ChainExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { + public DefaultExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { this.repository = repository; this.entityHandler = entityHandler; } @@ -55,20 +53,16 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { @Override public Result executeQuery(Context context, Query query) { Assert.isTrue(!query.isEmpty(), "The query cannot be empty!"); - Selector selector = context.getSelector(); - boolean isIncludeRoot = (query.getType() & OperationType.INCLUDE_ROOT) == OperationType.INCLUDE_ROOT; - CommonRepository repository = this.repository.getRootRepository(); - - if (selector.matches(context, repository) || isIncludeRoot) { - Result result = repository.executeQuery(context, query); + CommonRepository rootRepository = repository.getRootRepository(); + if (selector.matches(context, rootRepository) || query.isIncludeRoot()) { + Result result = rootRepository.executeQuery(context, query); List entities = result.getRecords(); if (!entities.isEmpty()) { handle(context, entities); } return result; } - return new Result<>(); } @@ -84,15 +78,11 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { @Override public int execute(Context context, Operation operation) { - int expectedType = operation.getType(); - - boolean isIncludeRoot = (expectedType & OperationType.INCLUDE_ROOT) == OperationType.INCLUDE_ROOT; - boolean isIgnoreRoot = (expectedType & OperationType.IGNORE_ROOT) == OperationType.IGNORE_ROOT; - int realExpectedType = expectedType & OperationType.INSERT_OR_UPDATE_OR_DELETE; + Selector selector = context.getSelector(); - boolean isInsertContext = (realExpectedType & OperationType.INSERT) == OperationType.INSERT; - int expectedIncludeRoot = realExpectedType | OperationType.INCLUDE_ROOT; - int expectedIgnoreRoot = realExpectedType | OperationType.IGNORE_ROOT; + boolean isInsertContext = operation.isInsertContext(); + boolean isIncludeRoot = operation.isIncludeRoot(); + boolean isIgnoreRoot = operation.isIgnoreRoot(); Object rootEntity = operation.getEntity(); Assert.notNull(rootEntity, "The root entity cannot be null!"); @@ -101,7 +91,6 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { AbstractContextRepository delegateRepository = derivedResolver.deriveRepository(rootEntity); delegateRepository = delegateRepository == null ? repository : delegateRepository; - Selector selector = context.getSelector(); int totalCount = 0; for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { boolean isRoot = repository.isRoot(); @@ -128,61 +117,59 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { int operationType = OperationType.NONE; boolean operable = false; if (isMatch) { - operationType = determineOperationType(expectedType, realExpectedType, repository, entity); - operable = (operationType & OperationType.INSERT_OR_UPDATE_OR_DELETE) > 0; - if ((operationType & OperationType.INSERT) == OperationType.INSERT) { - getBoundValue(repository, context, rootEntity, entity); + operationType = determineType(operation, repository, entity); + operable = (operationType & OperationType.INSERT_OR_UPDATE_OR_DELETE) != 0; + if ((operationType & OperationType.INSERT) != 0) { + getBoundValue(context, rootEntity, repository, entity); } } if (isAggregated) { - Operation newOperation = newOperation(realExpectedType, repository, entity); - newOperation.setType(operable ? expectedIncludeRoot : expectedIgnoreRoot); - totalCount += repository.execute(context, newOperation); + OperationFactory operationFactory = repository.getOperationFactory(); + Operation newOperation = operationFactory.renewOperation(operation, entity); + if (newOperation != null) { + newOperation.setRootType(operable ? Operation.INCLUDE_ROOT : Operation.IGNORE_ROOT); + totalCount += repository.execute(context, newOperation); + } } else if (operable) { - if (isRoot && realExpectedType == operationType) { + if (isRoot && operation.getType() == operationType) { totalCount += repository.execute(context, operation); } else { - totalCount += doExecute(operationType, repository, context, entity); + totalCount += doExecute(context, repository, entity, operationType); } } } if (isInsertContext && collection.size() == 1) { - setBoundId(repository, context, rootEntity, targetEntity); + setBoundId(context, rootEntity, repository, targetEntity); } } } return totalCount; } - private int determineOperationType(int expectedType, int realExpectedType, CommonRepository repository, Object entity) { - if (expectedType == OperationType.FORCE_INSERT) { + private int determineType(Operation operation, CommonRepository repository, Object entity) { + if (operation.isForceInsert()) { return OperationType.INSERT; - } else { - Object primaryKey = repository.getPrimaryKey(entity); - int operationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE_OR_DELETE; - return realExpectedType & operationType; } + int type = operation.getType(); + Object primaryKey = repository.getPrimaryKey(entity); + int operationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE_OR_DELETE; + return type & operationType; } - private Operation newOperation(int realExpectedType, CommonRepository repository, Object entity) { - OperationFactory operationFactory = repository.getOperationFactory(); - if (realExpectedType == OperationType.INSERT) { - return operationFactory.buildInsert(entity); - - } else if (realExpectedType == OperationType.UPDATE) { - return operationFactory.buildUpdate(entity); - - } else if (realExpectedType == OperationType.INSERT_OR_UPDATE) { - return new Operation(OperationType.INSERT_OR_UPDATE, entity); - - } else if (realExpectedType == OperationType.DELETE) { - return operationFactory.buildDeleteByEntity(entity); + private void getBoundValue(Context context, Object rootEntity, CommonRepository repository, Object entity) { + for (Binder binder : repository.getBinderResolver().getBoundValueBinders()) { + Object fieldValue = binder.getFieldValue(context, entity); + if (fieldValue == null) { + Object boundValue = binder.getBoundValue(context, rootEntity); + if (boundValue != null) { + binder.setFieldValue(context, entity, boundValue); + } + } } - throw new RuntimeException("Unsupported type!"); } - private int doExecute(int operationType, CommonRepository repository, Context context, Object entity) { + private int doExecute(Context context, CommonRepository repository, Object entity, int operationType) { if (operationType == OperationType.INSERT) { return repository.insert(context, entity); @@ -195,19 +182,7 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { return 0; } - private void getBoundValue(CommonRepository repository, Context context, Object rootEntity, Object entity) { - for (Binder binder : repository.getBinderResolver().getBoundValueBinders()) { - 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(CommonRepository repository, Context context, Object rootEntity, Object entity) { + 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); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java similarity index 68% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 7d2205fce3740c8b2920006ebf3355c23dfaf324..804dee38bf743ec3d169acc39dfd51c7cddbd690 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -15,69 +15,59 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl.executor; +package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.MultiResult; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.executor.*; 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.impl.executor.AbstractExecutor; -import com.gitee.dorive.spring.boot.starter.entity.QueryResult; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class FactoryExecutor extends AbstractExecutor { +public class FactoryExecutor extends AbstractProxyExecutor { private EntityEle entityEle; private EntityFactory entityFactory; - private Executor executor; + + public FactoryExecutor(Executor executor, EntityEle entityEle, EntityFactory entityFactory) { + super(executor); + this.entityEle = entityEle; + this.entityFactory = entityFactory; + } @Override public Result executeQuery(Context context, Query query) { - Result result = executor.executeQuery(context, query); - Example example = query.getExample(); - QueryResult queryResult = (QueryResult) result.getRecord(); + Result result = super.executeQuery(context, query); + MultiResult multiResult = (MultiResult) result; + Page page = multiResult.getPage(); + List> resultMaps = multiResult.getResultMaps(); - List> resultMaps = queryResult.getResultMaps(); - if (resultMaps != null) { - List entities; + List entities = Collections.emptyList(); + if (resultMaps != null && !resultMaps.isEmpty()) { + Example example = query.getExample(); if (example instanceof UnionExample) { entities = reconstituteWithoutDuplicate(context, resultMaps); } else { entities = reconstitute(context, resultMaps); } - return new MultiResult(resultMaps, entities); } - Page> queryPage = queryResult.getPage(); - if (queryPage != null) { - com.gitee.dorive.core.entity.executor.Page page = example.getPage(); - page.setTotal(queryPage.getTotal()); - List entities = reconstitute(context, queryPage.getRecords()); + if (page != null) { page.setRecords(entities); - return new Result<>(page); } - - return new Result<>(Collections.emptyList()); + multiResult.setRecords(entities); + multiResult.setRecord(!entities.isEmpty() ? entities.get(0) : null); + multiResult.setCount(entities.size()); + return multiResult; } private List reconstituteWithoutDuplicate(Context context, List> resultMaps) { @@ -115,11 +105,6 @@ public class FactoryExecutor extends AbstractExecutor { return entities; } - @Override - public long executeCount(Context context, Query query) { - return executor.executeCount(context, query); - } - @Override public int execute(Context context, Operation operation) { Object entity = operation.getEntity(); @@ -127,7 +112,7 @@ public class FactoryExecutor extends AbstractExecutor { Object persistent = entityFactory.deconstruct(context, entity); operation.setEntity(persistent); } - int totalCount = executor.execute(context, operation); + int totalCount = super.execute(context, operation); if (operation instanceof Insert) { Object persistent = operation.getEntity(); Object primaryKey = BeanUtil.getFieldValue(persistent, "id"); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java new file mode 100644 index 0000000000000000000000000000000000000000..2123456356758626d3faf9cc5712f0e79e912184 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java @@ -0,0 +1,88 @@ +/* + * 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.executor; + +import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.api.executor.FieldConverter; +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 lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; +import java.util.Map; + +@Data +@EqualsAndHashCode(callSuper = false) +public class FieldExecutor extends AbstractExampleExecutor { + + private EntityEle entityEle; + private Map converterMap; + + public FieldExecutor(Executor executor, EntityEle entityEle, Map converterMap) { + super(executor); + this.entityEle = entityEle; + this.converterMap = converterMap; + } + + @Override + public void convert(Context context, Example example) { + convertSelectProps(example); + convertCriteria(context, example.getCriteria()); + convertOrderBy(example.getOrderBy()); + } + + public void convertSelectProps(Example example) { + List properties = example.getSelectProps(); + if (properties != null && !properties.isEmpty()) { + properties = entityEle.toAliases(properties); + example.setSelectProps(properties); + } + } + + public void convertCriteria(Context context, List criteria) { + if (criteria != null && !criteria.isEmpty()) { + for (Criterion criterion : criteria) { + String property = criterion.getProperty(); + String alias = entityEle.toAlias(property); + criterion.setProperty(alias); + + Object value = criterion.getValue(); + if (converterMap != null && !converterMap.isEmpty()) { + FieldConverter fieldConverter = converterMap.get(property); + if (fieldConverter != null) { + Object mappedValue = fieldConverter.convert(context, criterion, value); + criterion.setValue(mappedValue); + } + } + } + } + } + + public void convertOrderBy(OrderBy orderBy) { + if (orderBy != null) { + List properties = orderBy.getProperties(); + properties = entityEle.toAliases(properties); + orderBy.setProperties(properties); + } + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index b27ceb7af11fb3b4925edcf5f314dbcf784c2332..680e68563ea29925ff80897fd3b119717f6989cc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -19,8 +19,9 @@ package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.api.executor.EntityFactory; import lombok.AllArgsConstructor; import lombok.Data; @@ -35,19 +36,37 @@ public class DefaultEntityFactory implements EntityFactory { private EntityEle entityEle; private Class pojoClass; + private Map aliasFieldMapping; - private Map fieldPropMapping; + private Map fieldConverterMap; private CopyOptions reCopyOptions; + + private Map fieldPropMapping; + private Map propConverterMap; private CopyOptions deCopyOptions; - public void setAliasFieldMapping(Map aliasFieldMapping) { + public void setReCopyOptions(Map aliasFieldMapping, Map fieldConverterMap) { this.aliasFieldMapping = aliasFieldMapping; + this.fieldConverterMap = fieldConverterMap; this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(aliasFieldMapping); + if (fieldConverterMap != null && !fieldConverterMap.isEmpty()) { + this.reCopyOptions.setFieldValueEditor((name, value) -> { + FieldConverter fieldConverter = fieldConverterMap.get(name); + return fieldConverter != null ? fieldConverter.reconstitute(name, value) : value; + }); + } } - public void setFieldPropMapping(Map fieldPropMapping) { + public void setDeCopyOptions(Map fieldPropMapping, Map propConverterMap) { this.fieldPropMapping = fieldPropMapping; + this.propConverterMap = propConverterMap; this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(fieldPropMapping); + if (propConverterMap != null && !propConverterMap.isEmpty()) { + this.deCopyOptions.setFieldValueEditor((name, value) -> { + FieldConverter fieldConverter = propConverterMap.get(name); + return fieldConverter != null ? fieldConverter.deconstruct(name, 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 ba24285103d1512c28b9a76fc0f8e3408e630dad..c2e7587c3e1b5e7a2b247f4476471e42c44d28c5 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 @@ -17,6 +17,7 @@ package com.gitee.dorive.core.impl.factory; +import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.*; @@ -35,7 +36,7 @@ public class OperationFactory { return query; } - public Query buildQuery(Example example) { + public Query buildQueryByExample(Example example) { Query query = new Query(null); query.setExample(example); return query; @@ -52,7 +53,7 @@ public class OperationFactory { return update; } - public Update buildUpdate(Object entity, Example example) { + public Update buildUpdateByExample(Object entity, Example example) { Update update = new Update(entity); update.setExample(example); return update; @@ -69,7 +70,7 @@ public class OperationFactory { } } - public Delete buildDeleteByEntity(Object entity) { + public Delete buildDelete(Object entity) { Delete delete = new Delete(entity); Object primaryKey = entityEle.getPkProxy().getValue(entity); delete.setPrimaryKey(primaryKey); @@ -82,10 +83,30 @@ public class OperationFactory { return delete; } - public Delete buildDelete(Example example) { + public Delete buildDeleteByExample(Example example) { Delete delete = new Delete(null); delete.setExample(example); return delete; } + public Operation renewOperation(Operation operation, Object entity) { + int type = operation.getType(); + if (type == OperationType.INSERT) { + return buildInsert(entity); + + } else if (type == OperationType.UPDATE) { + return buildUpdate(entity); + + } else if (type == OperationType.INSERT_OR_UPDATE) { + return new Operation(OperationType.INSERT_OR_UPDATE, entity); + + } else if (type == OperationType.DELETE) { + return buildDelete(entity); + + } else if (type == OperationType.FORCE_INSERT) { + return new Insert(OperationType.FORCE_INSERT, entity); + } + return null; + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index 018a324145e3cfec287f84ee187aed124f9c1cf5..41b78610b07007baf66763f49939f070ce6636f7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -17,14 +17,15 @@ package com.gitee.dorive.core.impl.handler; -import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.core.entity.executor.MultiResult; 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.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.ContextBinder; @@ -52,10 +53,10 @@ public class MultiEntityHandler implements EntityHandler { public long handle(Context context, List entities) { Map entityIndex = new LinkedHashMap<>(entities.size() * 4 / 3 + 1); Example example = newExample(context, entities, entityIndex); - if (example.isDirtyQuery()) { + if (example.isNotEmpty()) { OperationFactory operationFactory = repository.getOperationFactory(); - Query query = operationFactory.buildQuery(example); - query.setType(query.getType() | OperationType.INCLUDE_ROOT); + Query query = operationFactory.buildQueryByExample(example); + query.setRootType(Operation.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); if (result instanceof MultiResult) { setValueForRootEntities(context, entities, entityIndex, (MultiResult) result); @@ -70,7 +71,7 @@ public class MultiEntityHandler implements EntityHandler { Map> mergedBindersMap = binderResolver.getMergedBindersMap(); List binders = mergedBindersMap.get("/"); - Example example = new Example(); + Example example = new InnerExample(); if (binders.size() == 1) { PropertyBinder binder = binders.get(0); List boundValues = collectBoundValues(context, entities, entityIndex, binder); @@ -92,7 +93,7 @@ public class MultiEntityHandler implements EntityHandler { } } - if (example.isDirtyQuery()) { + if (example.isNotEmpty()) { for (ContextBinder binder : binderResolver.getContextBinders()) { String fieldName = binder.getFieldName(); Object boundValue = binder.getBoundValue(context, null); @@ -130,7 +131,9 @@ public class MultiEntityHandler implements EntityHandler { if (boundValue != null) { boundValue = binder.input(context, boundValue); multiInBuilder.append(boundValue); - strBuilder.append(boundValue).append(","); + String boundValueStr = String.valueOf(boundValue); + strBuilder.append("(").append(boundValueStr.length()).append(")").append(boundValueStr).append(","); + } else { multiInBuilder.clear(); strBuilder = null; @@ -173,7 +176,8 @@ public class MultiEntityHandler implements EntityHandler { PropChain anchorPoint = repository.getAnchorPoint(); BinderResolver binderResolver = repository.getBinderResolver(); - List binders = binderResolver.getMergedBindersMap().get("/"); + Map> mergedBindersMap = binderResolver.getMergedBindersMap(); + List binders = mergedBindersMap.get("/"); List entities = multiResult.getRecords(); int averageSize = entities.size() / rootEntities.size() + 1; @@ -192,7 +196,9 @@ public class MultiEntityHandler implements EntityHandler { for (PropertyBinder binder : binders) { Object fieldValue = binder.getFieldValue(context, entity); if (fieldValue != null) { - strBuilder.append(fieldValue).append(","); + String fieldValueStr = String.valueOf(fieldValue); + strBuilder.append("(").append(fieldValueStr.length()).append(")").append(fieldValueStr).append(","); + } else { strBuilder = null; break; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java index 2826ed42dbf75fd02022efa098dc940fa1bcec58..9de37af0b001b46b5a4b452905c4e9e71a80ac48 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java @@ -17,14 +17,15 @@ package com.gitee.dorive.core.impl.handler; -import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.MultiResult; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; @@ -49,10 +50,10 @@ public class UnionEntityHandler implements EntityHandler { @Override public long handle(Context context, List entities) { Example example = newExample(context, entities); - if (example.isDirtyQuery()) { + if (example.isNotEmpty()) { OperationFactory operationFactory = repository.getOperationFactory(); - Query query = operationFactory.buildQuery(example); - query.setType(query.getType() | OperationType.INCLUDE_ROOT); + Query query = operationFactory.buildQueryByExample(example); + query.setRootType(Operation.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); if (result instanceof MultiResult) { setValueForRootEntities(entities, (MultiResult) result); @@ -71,7 +72,7 @@ public class UnionEntityHandler implements EntityHandler { Object lastEntity = lastPropChain == null ? entity : lastPropChain.getValue(entity); if (lastEntity != null) { Example example = newExample(context, entity); - if (example.isDirtyQuery()) { + if (example.isNotEmpty()) { example.selectExtra((index + 1) + " as $row"); unionExample.addExample(example); } @@ -82,7 +83,7 @@ public class UnionEntityHandler implements EntityHandler { private Example newExample(Context context, Object entity) { BinderResolver binderResolver = repository.getBinderResolver(); - Example example = new Example(); + Example example = new InnerExample(); for (PropertyBinder binder : binderResolver.getPropertyBinders()) { String fieldName = binder.getFieldName(); Object boundValue = binder.getBoundValue(context, entity); @@ -97,7 +98,7 @@ public class UnionEntityHandler implements EntityHandler { break; } } - if (example.isDirtyQuery()) { + if (example.isNotEmpty()) { for (ContextBinder binder : binderResolver.getContextBinders()) { String fieldName = binder.getFieldName(); Object boundValue = binder.getBoundValue(context, entity); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java similarity index 91% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java index 69d1381ad826a6d09550955489af7a90cf87c63b..bc38046a6a31e8f02fd769a8d17ad3adbf29d040 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java @@ -18,14 +18,14 @@ package com.gitee.dorive.core.impl.processor; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.api.binder.BindingProcessor; import com.gitee.dorive.core.api.context.Context; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor -public class DefaultProcessor implements Processor { +public class DefaultBindingProcessor implements BindingProcessor { private BindingDef bindingDef; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java index 0bdb69e0f9dab56f25f2ef1627b42d8cea54cfc7..139190f979ba46692a47f368e7274b986feecc4d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java @@ -27,7 +27,7 @@ import java.util.Collection; @Data @EqualsAndHashCode(callSuper = false) -public class PropertyProcessor extends DefaultProcessor { +public class PropertyBindingProcessor extends DefaultBindingProcessor { @Override public Object input(Context context, Object value) { 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 b9b96b5d5998af01e286f9d94a086b86acd80713..08d2fdbbf1243cb7e54cc89098af155924f21fd6 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 @@ -27,11 +27,11 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.core.api.binder.Binder; -import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.api.binder.BindingProcessor; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; -import com.gitee.dorive.core.impl.processor.DefaultProcessor; -import com.gitee.dorive.core.impl.processor.PropertyProcessor; +import com.gitee.dorive.core.impl.processor.DefaultBindingProcessor; +import com.gitee.dorive.core.impl.processor.PropertyBindingProcessor; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.PathUtils; @@ -80,8 +80,9 @@ public class BinderResolver { for (BindingDef bindingDef : bindingDefs) { bindingDef = renewBindingDef(accessPath, bindingDef); - String field = bindingDef.getField(); + String bindExp = bindingDef.getBindExp(); + String alias = entityEle.toAlias(field); PropChain fieldPropChain = propChainMap.get("/" + field); @@ -89,10 +90,10 @@ public class BinderResolver { entityEle.getGenericType().getName(), field); fieldPropChain.newPropProxy(); - Processor processor = newProcessor(bindingDef); + BindingProcessor bindingProcessor = newBindingProcessor(bindingDef); - if (bindingDef.getBindExp().startsWith("/")) { - PropertyBinder propertyBinder = newPropertyBinder(bindingDef, alias, fieldPropChain, processor); + if (bindExp.startsWith("/")) { + PropertyBinder propertyBinder = newPropertyBinder(bindingDef, alias, fieldPropChain, bindingProcessor); allBinders.add(propertyBinder); propertyBinders.add(propertyBinder); @@ -100,7 +101,7 @@ public class BinderResolver { List propertyBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); propertyBinders.add(propertyBinder); - selfFields.add(bindingDef.getField()); + selfFields.add(field); if (propertyBinder.isSameType()) { if (!"id".equals(field)) { @@ -114,7 +115,7 @@ public class BinderResolver { } } else { - ContextBinder contextBinder = new ContextBinder(bindingDef, alias, fieldPropChain, processor); + ContextBinder contextBinder = new ContextBinder(bindingDef, alias, fieldPropChain, bindingProcessor); allBinders.add(contextBinder); contextBinders.add(contextBinder); boundValueBinders.add(contextBinder); @@ -137,37 +138,37 @@ public class BinderResolver { return bindingDef; } - private Processor newProcessor(BindingDef bindingDef) { + private BindingProcessor newBindingProcessor(BindingDef bindingDef) { Assert.notNull(bindingDef, "The bindingDef cannot be null!"); Class processorClass = bindingDef.getProcessor(); - Processor processor = null; + BindingProcessor bindingProcessor = null; if (processorClass == Object.class) { if (StringUtils.isBlank(bindingDef.getProperty())) { - processor = new DefaultProcessor(); + bindingProcessor = new DefaultBindingProcessor(); } else { - processor = new PropertyProcessor(); + bindingProcessor = new PropertyBindingProcessor(); } } else { ApplicationContext applicationContext = repository.getApplicationContext(); String[] beanNamesForType = applicationContext.getBeanNamesForType(processorClass); if (beanNamesForType.length > 0) { - processor = (Processor) applicationContext.getBean(beanNamesForType[0]); + bindingProcessor = (BindingProcessor) applicationContext.getBean(beanNamesForType[0]); } - if (processor == null) { - processor = (Processor) ReflectUtil.newInstance(processorClass); + if (bindingProcessor == null) { + bindingProcessor = (BindingProcessor) ReflectUtil.newInstance(processorClass); } } - if (processor instanceof DefaultProcessor) { - DefaultProcessor defaultProcessor = (DefaultProcessor) processor; + if (bindingProcessor instanceof DefaultBindingProcessor) { + DefaultBindingProcessor defaultProcessor = (DefaultBindingProcessor) bindingProcessor; defaultProcessor.setBindingDef(bindingDef); } - if (processor instanceof PropertyProcessor) { - Assert.notBlank(bindingDef.getProperty(), "The property of PropertyProcessor cannot be blank!"); + if (bindingProcessor instanceof PropertyBindingProcessor) { + Assert.notBlank(bindingDef.getProperty(), "The property of PropertyBindingProcessor cannot be blank!"); } - return processor; + return bindingProcessor; } - private PropertyBinder newPropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, Processor processor) { + private PropertyBinder newPropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, BindingProcessor bindingProcessor) { String bindExp = bindingDef.getBindExp(); String property = bindingDef.getProperty(); @@ -177,7 +178,8 @@ public class BinderResolver { Assert.notNull(belongRepository, "The belong repository cannot be null! bindExp: {}", bindExp); belongRepository.setBoundEntity(true); - Map propChainMap = repository.getPropChainResolver().getPropChainMap(); + PropChainResolver propChainResolver = repository.getPropChainResolver(); + Map propChainMap = propChainResolver.getPropChainMap(); PropChain boundPropChain = propChainMap.get(bindExp); Assert.notNull(boundPropChain, "The bound property chain cannot be null! bindExp: {}", bindExp); boundPropChain.newPropProxy(); @@ -186,7 +188,7 @@ public class BinderResolver { String boundName = StringUtils.isBlank(property) ? PathUtils.getLastName(bindExp) : property; String bindAlias = entityEle.toAlias(boundName); - return new PropertyBinder(bindingDef, alias, fieldPropChain, processor, + return new PropertyBinder(bindingDef, alias, fieldPropChain, bindingProcessor, belongAccessPath, belongRepository, boundPropChain, bindAlias); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java index c08e8159c9ca820e2a09b41cebd2d61823b13232..0898c63063df9888a15e2246604124bf8db83ec0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java @@ -17,7 +17,17 @@ package com.gitee.dorive.core.impl.selector; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Node; import com.gitee.dorive.core.api.context.Selector; +import java.util.List; + public abstract class AbstractSelector implements Selector { + + @Override + public List select(Context context, Node node) { + return null; + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java index b77705f83725711bb255dd2a217e44917cc4f15d..bdca51a14265864c533470d51412b58cb764b01e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java @@ -18,24 +18,17 @@ package com.gitee.dorive.core.impl.selector; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.api.context.Node; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - @Data @EqualsAndHashCode(callSuper = false) public class AllSelector extends AbstractSelector { @Override - public boolean matches(Context context, CommonRepository repository) { + public boolean matches(Context context, Node node) { return true; } - @Override - public List select(Context context, CommonRepository repository) { - return null; - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java index 8c1fd48f72f0be756b33dcef12952218d0339398..5eaa51219b289b68b3f37cbc246e84479e24d641 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java @@ -18,26 +18,17 @@ package com.gitee.dorive.core.impl.selector; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.api.context.Node; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - @Data @EqualsAndHashCode(callSuper = false) public class EmptySelector extends AbstractSelector { - public static final EmptySelector EMPTY_SELECTOR = new EmptySelector(); - @Override - public boolean matches(Context context, CommonRepository repository) { + public boolean matches(Context context, Node node) { return false; } - @Override - public List select(Context context, CommonRepository repository) { - return null; - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java index 23ace0dba079b5ba06ff3a1d0c0c40ac2196aae6..db28324e791971240458ec4ac3d032c8220871ca 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java @@ -18,9 +18,8 @@ package com.gitee.dorive.core.impl.selector; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.api.context.Node; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -55,16 +54,14 @@ public class NameSelector extends AbstractSelector { } @Override - public boolean matches(Context context, CommonRepository repository) { - EntityDef entityDef = repository.getEntityDef(); - String name = entityDef.getName(); + public boolean matches(Context context, Node node) { + String name = node.getName(); return StringUtils.isBlank(name) || nameDefMap.containsKey(name); } @Override - public List select(Context context, CommonRepository repository) { - EntityDef entityDef = repository.getEntityDef(); - String name = entityDef.getName(); + public List select(Context context, Node node) { + String name = node.getName(); NameDef nameDef = nameDefMap.get(name); return nameDef != null && !nameDef.getProperties().isEmpty() ? nameDef.getProperties() : null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java index 6fbeaa87da95aaab98f777d02414b91081bc9881..041c68144a3b2e47b7a5169ce6e580340617cef4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java @@ -18,24 +18,17 @@ package com.gitee.dorive.core.impl.selector; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.api.context.Node; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - @Data @EqualsAndHashCode(callSuper = false) public class RootSelector extends AbstractSelector { @Override - public boolean matches(Context context, CommonRepository repository) { - return repository.isRoot(); - } - - @Override - public List select(Context context, CommonRepository repository) { - return null; + public boolean matches(Context context, Node node) { + return node.isRoot(); } } 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 cdcf6deae7a93a277ac3ccaedefc4d48d8d8a910..63cd0367fe27000c7ec7dfa534c4b6add29814e3 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 @@ -19,19 +19,29 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.api.entity.element.EntityField; import com.gitee.dorive.api.entity.element.EntityType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; +import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.config.RepositoryContext; +import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.impl.executor.ChainExecutor; +import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; +import com.gitee.dorive.core.impl.executor.DefaultExecutor; +import com.gitee.dorive.core.impl.executor.FactoryExecutor; +import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; @@ -75,7 +85,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor public void afterPropertiesSet() throws Exception { Class entityClass = ReflectUtils.getFirstArgumentType(this.getClass()); EntityType entityType = EntityType.getInstance(entityClass); - Assert.isTrue(entityType.isAnnotatedEntity(), "No @Entity annotation found! type: {}", entityType.getName()); + Assert.isTrue(entityType.isEntityDef(), "No @Entity annotation found! type: {}", entityType.getName()); propChainResolver = new PropChainResolver(entityType); @@ -86,7 +96,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor Map propChainMap = propChainResolver.getPropChainMap(); propChainMap.forEach((accessPath, propChain) -> { - if (propChain.isAnnotatedEntity()) { + if (propChain.isEntityDef()) { CommonRepository subRepository = newRepository(accessPath, propChain.getEntityField()); repositoryMap.put(accessPath, subRepository); subRepositories.add(subRepository); @@ -99,7 +109,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor setEntityDef(rootRepository.getEntityDef()); setEntityEle(rootRepository.getEntityEle()); setOperationFactory(rootRepository.getOperationFactory()); - setExecutor(newExecutor()); + setExecutor(newDefaultExecutor()); setAttachments(new ConcurrentHashMap<>(rootRepository.getAttachments())); } @@ -142,9 +152,9 @@ public abstract class AbstractContextRepository extends AbstractRepositor private EntityDef renewEntityDef(EntityEle entityEle) { EntityDef entityDef = entityEle.getEntityDef(); entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); - if (!entityDef.isAggregated() && entityEle.isAggregated()) { + if (entityEle.isAggregateDef()) { Class entityClass = entityEle.getGenericType(); - Class repositoryClass = RepositoryContext.findTypeByEntity(entityClass); + Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); entityDef.setRepository(repositoryClass); } @@ -166,13 +176,48 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityEle(entityEle); defaultRepository.setOperationFactory(operationFactory); + Map converterMap = newConverterMap(entityEle); Map attachments = new ConcurrentHashMap<>(8); - defaultRepository.setExecutor(newExecutor(entityDef, entityEle, attachments)); + + ExecutorResult executorResult = newExecutor(entityDef, entityEle, converterMap, attachments); + EntityFactory entityFactory = executorResult.getEntityFactory(); + Executor executor = executorResult.getExecutor(); + + executor = new FactoryExecutor(executor, entityEle, entityFactory); + executor = new FieldExecutor(executor, entityEle, converterMap); + attachments.put(Keys.FIELD_EXECUTOR, executor); + + defaultRepository.setExecutor(executor); defaultRepository.setAttachments(attachments); } return (AbstractRepository) repository; } + private Map newConverterMap(EntityEle entityEle) { + Map converterMap = new LinkedHashMap<>(8); + Map entityFieldMap = entityEle.getEntityFieldMap(); + if (entityFieldMap != null) { + entityFieldMap.forEach((name, entityField) -> { + FieldDef fieldDef = entityField.getFieldDef(); + if (fieldDef != null) { + Class converterClass = fieldDef.getConverter(); + String mapExp = fieldDef.getMapExp(); + FieldConverter fieldConverter = null; + if (converterClass != Object.class) { + fieldConverter = (FieldConverter) ReflectUtil.newInstance(converterClass); + + } else if (StringUtils.isNotBlank(mapExp)) { + fieldConverter = new DefaultFieldConverter(entityField); + } + if (fieldConverter != null) { + converterMap.put(name, fieldConverter); + } + } + }); + } + return converterMap; + } + private OrderBy newDefaultOrderBy(EntityDef entityDef) { String sortBy = entityDef.getSortBy(); String order = entityDef.getOrder().toUpperCase(); @@ -183,16 +228,16 @@ public abstract class AbstractContextRepository extends AbstractRepositor return null; } - private Executor newExecutor() { + private Executor newDefaultExecutor() { EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); derivedResolver = new DerivedResolver(this); if (derivedResolver.isDerived()) { entityHandler = new AdaptiveEntityHandler(this, entityHandler); } - return new ChainExecutor(this, entityHandler); + return new DefaultExecutor(this, entityHandler); } - protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle, Map attachments); + protected abstract ExecutorResult newExecutor(EntityDef entityDef, EntityEle entityEle, Map converterMap, Map attachments); protected abstract AbstractRepository processRepository(AbstractRepository repository); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..310af10f1345028865b28fc7b5b01c2e8a28eb7d --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java @@ -0,0 +1,74 @@ +/* + * 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.repository; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.util.ExampleUtils; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +public abstract class AbstractExampleRepository extends AbstractGenericRepository { + + @Override + public List selectByExample(Context context, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.tryClone(example); + } + return super.selectByExample(context, example); + } + + @Override + public Page selectPageByExample(Context context, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.tryClone(example); + } + return super.selectPageByExample(context, example); + } + + @Override + public long selectCount(Context context, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.tryClone(example); + } + return super.selectCount(context, example); + } + + @Override + public int updateByExample(Context context, Object entity, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.tryClone(example); + } + return super.updateByExample(context, entity, example); + } + + @Override + public int deleteByExample(Context context, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.tryClone(example); + } + return super.deleteByExample(context, example); + } + +} 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 12f011e57b3b625973d5921ffe60b1a96244de39..d2feb79995d3b97c05e00b720f04f9e92d7c764b 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 @@ -24,6 +24,7 @@ import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.util.ExampleUtils; import lombok.Data; import lombok.EqualsAndHashCode; @@ -48,7 +49,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { if (selector.matches(context, repository)) { - totalCount += repository.updateByExample(context, entity, example); + totalCount += repository.updateByExample(context, entity, ExampleUtils.tryClone(example)); } } return totalCount; @@ -63,7 +64,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int deleteByPrimaryKey(Context context, PK primaryKey) { - Assert.notNull(primaryKey, "The primaryKey cannot be null!"); + Assert.notNull(primaryKey, "The primary key cannot be null!"); E entity = selectByPrimaryKey(context, primaryKey); return delete(context, entity); } @@ -75,7 +76,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { if (selector.matches(context, repository)) { - totalCount += repository.deleteByExample(context, example); + totalCount += repository.deleteByExample(context, ExampleUtils.tryClone(example)); } } return totalCount; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java similarity index 90% rename from dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java rename to dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index 2140546b79d7666420ea453798afbbc80f55ac38..b13b22a7f0eb1e24be1cc208226d3ab536981d97 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -34,20 +34,20 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class ProxyRepository extends AbstractRepository { +public abstract class AbstractProxyRepository extends AbstractRepository { private AbstractRepository proxyRepository; public AbstractRepository getProxyRepository() { - if (proxyRepository instanceof ProxyRepository) { - return ((ProxyRepository) proxyRepository).getProxyRepository(); + if (proxyRepository instanceof AbstractProxyRepository) { + return ((AbstractProxyRepository) proxyRepository).getProxyRepository(); } return proxyRepository; } public void setProxyRepository(AbstractRepository repository) { - if (proxyRepository instanceof ProxyRepository) { - ((ProxyRepository) proxyRepository).setProxyRepository(repository); + if (proxyRepository instanceof AbstractProxyRepository) { + ((AbstractProxyRepository) proxyRepository).setProxyRepository(repository); } proxyRepository = repository; } 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 843cbfcf26cd3b440fa09e603b73516949cf41e1..34697b8b8bd4006454d7440110b6f2932a1f867b 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 @@ -63,7 +63,7 @@ public abstract class AbstractRepository implements Repository, Ex @SuppressWarnings("unchecked") public List selectByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Query query = operationFactory.buildQuery(example); + Query query = operationFactory.buildQueryByExample(example); Result result = executeQuery(context, query); return (List) result.getRecords(); } @@ -73,7 +73,7 @@ public abstract class AbstractRepository implements Repository, Ex public Page selectPageByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); Assert.notNull(example.getPage(), "The page cannot be null!"); - Query query = operationFactory.buildQuery(example); + Query query = operationFactory.buildQueryByExample(example); Result result = executeQuery(context, query); return (Page) result.getPage(); } @@ -81,7 +81,7 @@ public abstract class AbstractRepository implements Repository, Ex @Override public long selectCount(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Query query = operationFactory.buildQuery(example); + Query query = operationFactory.buildQueryByExample(example); return executeCount(context, query); } @@ -103,7 +103,7 @@ public abstract class AbstractRepository implements Repository, Ex public int updateByExample(Context context, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); - Update update = operationFactory.buildUpdate(entity, example); + Update update = operationFactory.buildUpdateByExample(entity, example); return execute(context, update); } @@ -117,7 +117,7 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int delete(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Delete delete = operationFactory.buildDeleteByEntity(entity); + Delete delete = operationFactory.buildDelete(entity); return execute(context, delete); } @@ -131,7 +131,7 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int deleteByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Delete delete = operationFactory.buildDelete(example); + Delete delete = operationFactory.buildDeleteByExample(example); return execute(context, delete); } 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 761adc052f5717ce7c292df548df34ae1898df38..fd51b1db081024439e7b841aff1b586b2df72468 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 @@ -19,10 +19,11 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Node; import com.gitee.dorive.core.api.context.Selector; 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.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -33,7 +34,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -public class CommonRepository extends ProxyRepository { +public class CommonRepository extends AbstractProxyRepository implements Node { private String accessPath; private boolean root; @@ -43,13 +44,26 @@ public class CommonRepository extends ProxyRepository { private BinderResolver binderResolver; private boolean boundEntity; + public Object getPrimaryKey(Object entity) { + return getEntityEle().getPkProxy().getValue(entity); + } + + public boolean hasField(String field) { + return getEntityEle().hasField(field); + } + + @Override + public String getName() { + return getEntityDef().getName(); + } + @Override public Result executeQuery(Context context, Query query) { Selector selector = context.getSelector(); List properties = selector.select(context, this); if (properties != null && !properties.isEmpty()) { if (query.getPrimaryKey() != null) { - Example example = new Example().eq("id", query.getPrimaryKey()); + Example example = new InnerExample().eq("id", query.getPrimaryKey()); query.setPrimaryKey(null); query.setExample(example); } @@ -60,20 +74,11 @@ public class CommonRepository extends ProxyRepository { } Example example = query.getExample(); if (example != null) { - if (example.isEmptyQuery()) { - Page page = example.getPage(); - return page != null ? new Result<>(page) : new Result<>(); - } if (example.getOrderBy() == null && defaultOrderBy != null) { - OrderBy orderBy = new OrderBy(defaultOrderBy.getProperties(), defaultOrderBy.getOrder()); - example.setOrderBy(orderBy); + example.setOrderBy(defaultOrderBy.tryClone()); } } return super.executeQuery(context, query); } - public Object getPrimaryKey(Object entity) { - return getEntityEle().getPkProxy().getValue(entity); - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..bc6382f21590d66d8edb9f11b196635aca20db94 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java @@ -0,0 +1,68 @@ +/* + * 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.util; + +import com.gitee.dorive.core.entity.executor.Criterion; +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.Page; + +import java.util.ArrayList; +import java.util.List; + +public class ExampleUtils { + + public static Example tryClone(Example example) { + if (example == null) { + return null; + } + Example newExample = new InnerExample(); + + List selectProps = example.getSelectProps(); + if (selectProps != null) { + newExample.select(new ArrayList<>(selectProps)); + } + + List extraProps = example.getExtraProps(); + if (extraProps != null) { + newExample.selectExtra(new ArrayList<>(extraProps)); + } + + List criteria = example.getCriteria(); + if (criteria != null && !criteria.isEmpty()) { + List newCriteria = newExample.getCriteria(); + for (Criterion criterion : criteria) { + newCriteria.add(criterion.tryClone()); + } + } + + OrderBy orderBy = example.getOrderBy(); + if (orderBy != null) { + newExample.setOrderBy(orderBy.tryClone()); + } + + Page page = example.getPage(); + if (page != null) { + newExample.setPage(page.tryClone()); + } + + return newExample; + } + +} diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6204db1f33e8002216a5ee50ea1979168a1d118 --- /dev/null +++ b/dorive-env/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + com.gitee.digital-engine + dorive + 3.4.3.1 + + dorive-env + + + org.springframework.boot + spring-boot-starter + + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + + cn.hutool + hutool-all + + + \ No newline at end of file diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Construct.java b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Construct.java new file mode 100644 index 0000000000000000000000000000000000000000..b198917c9f83e17f6ca1f7dd48f3d66ac86a9e28 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Construct.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.env.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; + +@Inherited +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Construct { + + @AliasFor("profile") + String[] value() default {}; + + @AliasFor("value") + String[] profile() default {}; + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Key.java b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Key.java new file mode 100644 index 0000000000000000000000000000000000000000..543b8ea493e0d806d42b331aa17ae50c7e1d0d42 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Key.java @@ -0,0 +1,35 @@ +/* + * 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.env.annotation; + +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; + +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Key { + + String value(); + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Value.java b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Value.java new file mode 100644 index 0000000000000000000000000000000000000000..f7849c1ff139da8c997d0240e568ae4938e4c4f7 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Value.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.env.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Inherited +@Documented +@Repeatable(Values.class) +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Value { + + String profile() default ""; + + String value(); + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Values.java b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Values.java new file mode 100644 index 0000000000000000000000000000000000000000..7f862fc2fed3a97f1d38e75d45dbfc400a44649f --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/annotation/Values.java @@ -0,0 +1,35 @@ +/* + * 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.env.annotation; + +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; + +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Values { + + Value[] value(); + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConfigResolver.java b/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConfigResolver.java new file mode 100644 index 0000000000000000000000000000000000000000..0f261ab19f9e68651edd6006ddc6ee539addb1b0 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConfigResolver.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.env.impl; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.core.env.Environment; + +import java.util.Properties; + +@Data +@AllArgsConstructor +public class ConfigResolver { + + private Environment environment; + + public Properties resolveInstance(Object instance) { + ConstructResolver constructResolver = new ConstructResolver(environment); + constructResolver.resolveConstruct(instance); + KeyValuesResolver resolver = new KeyValuesResolver(environment); + return resolver.resolveProperties(instance); + } + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConstructResolver.java b/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConstructResolver.java new file mode 100644 index 0000000000000000000000000000000000000000..b847d7f1c0e2d1bf3e273c5375e924331a14203e --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/impl/ConstructResolver.java @@ -0,0 +1,70 @@ +/* + * 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.env.impl; + +import cn.hutool.core.util.ReflectUtil; +import com.gitee.dorive.env.annotation.Construct; +import com.gitee.dorive.env.util.AopUtils; +import lombok.Data; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.env.Environment; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +@Data +public class ConstructResolver { + + private Environment environment; + private Set activeProfiles; + + public ConstructResolver(Environment environment) { + this.environment = environment; + this.activeProfiles = new LinkedHashSet<>(Arrays.asList(environment.getActiveProfiles())); + } + + public void resolveConstruct(Object instance) { + Class targetClass = AopUtils.getTargetClass(instance); + ReflectionUtils.doWithLocalMethods(targetClass, declaredMethod -> { + if (Modifier.isStatic(declaredMethod.getModifiers())) { + return; + } + Construct constructAnnotation = AnnotatedElementUtils.getMergedAnnotation(declaredMethod, Construct.class); + if (constructAnnotation != null) { + if (matchEnvironment(constructAnnotation, declaredMethod)) { + ReflectUtil.invoke(instance, declaredMethod); + } + } + }); + } + + protected boolean matchEnvironment(Construct constructAnnotation, Method declaredMethod) { + String[] profile = constructAnnotation.profile(); + Set profiles = new LinkedHashSet<>(Arrays.asList(profile)); + if (profiles.isEmpty()) { + profiles.add(declaredMethod.getName()); + } + return !Collections.disjoint(activeProfiles, profiles); + } + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/impl/KeyValuesResolver.java b/dorive-env/src/main/java/com/gitee/dorive/env/impl/KeyValuesResolver.java new file mode 100644 index 0000000000000000000000000000000000000000..95f8d0b91a9b749c8393d15bd14906a064f80f6a --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/impl/KeyValuesResolver.java @@ -0,0 +1,110 @@ +/* + * 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.env.impl; + +import cn.hutool.core.util.ReflectUtil; +import com.gitee.dorive.env.annotation.Key; +import com.gitee.dorive.env.annotation.Value; +import com.gitee.dorive.env.util.AopUtils; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.env.Environment; +import org.springframework.util.ReflectionUtils; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Properties; +import java.util.Set; + +@Data +public class KeyValuesResolver { + + private Environment environment; + private Set activeProfiles; + + public KeyValuesResolver(Environment environment) { + this.environment = environment; + this.activeProfiles = new LinkedHashSet<>(Arrays.asList(environment.getActiveProfiles())); + } + + public Properties resolveProperties(Object instance) { + Properties properties = new Properties(); + Class targetClass = AopUtils.getTargetClass(instance); + ReflectionUtils.doWithLocalFields(targetClass, declaredField -> { + if (Modifier.isStatic(declaredField.getModifiers())) { + return; + } + Object value = determineValue(instance, declaredField); + if (value != null) { + Key keyAnnotation = declaredField.getAnnotation(Key.class); + if (keyAnnotation != null) { + String property = keyAnnotation.value(); + if (StringUtils.isNotBlank(property) && !environment.containsProperty(property)) { + properties.setProperty(property, value.toString()); + } + } + } + }); + return properties; + } + + protected Object determineValue(Object instance, Field declaredField) { + Object value = determineValueByAnnotation(declaredField); + if (value != null) { + ReflectUtil.setFieldValue(instance, declaredField, value); + } else { + value = ReflectUtil.getFieldValue(instance, declaredField); + } + return value; + } + + protected Serializable determineValueByAnnotation(Field declaredField) { + Set valueAnnotations = AnnotatedElementUtils.getMergedRepeatableAnnotations(declaredField, Value.class); + if (!valueAnnotations.isEmpty()) { + for (Value valueAnnotation : valueAnnotations) { + if (matchEnvironment(valueAnnotation, declaredField)) { + String valueStr = valueAnnotation.value(); + if (StringUtils.isNotBlank(valueStr)) { + valueStr = environment.resolvePlaceholders(valueStr); + Class type = declaredField.getType(); + if (type == Boolean.class) { + return Boolean.valueOf(valueStr); + + } else if (type == Integer.class) { + return Integer.valueOf(valueStr); + + } else if (type == String.class) { + return valueStr; + } + } + } + } + } + return null; + } + + protected boolean matchEnvironment(Value valueAnnotation, Field declaredField) { + String profile = valueAnnotation.profile(); + return StringUtils.isBlank(profile) || activeProfiles.contains(profile); + } + +} diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicConfiguration.java b/dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..cf94136b75fa73568f0c6534f155b4cb2415ddc0 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicConfiguration.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.env.spring; + +import com.gitee.dorive.env.impl.ConfigResolver; +import lombok.Getter; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; + +import javax.annotation.PostConstruct; + +@Getter +public class DynamicConfiguration extends DynamicEnvPostProcessor implements EnvironmentAware { + + private Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @PostConstruct + public void initialize() { + ConfigResolver configResolver = new ConfigResolver(environment); + configResolver.resolveInstance(this); + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/EnvironmentProcessor.java b/dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicEnvPostProcessor.java similarity index 76% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/EnvironmentProcessor.java rename to dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicEnvPostProcessor.java index bd53c544486c0d669a9a8e3d3537655349cd09a3..aab77a931329b56f9e6963bb665b1838d84195a6 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/EnvironmentProcessor.java +++ b/dorive-env/src/main/java/com/gitee/dorive/env/spring/DynamicEnvPostProcessor.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.config; +package com.gitee.dorive.env.spring; +import com.gitee.dorive.env.impl.ConfigResolver; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; @@ -25,16 +26,14 @@ import org.springframework.core.env.PropertiesPropertySource; import java.util.Properties; -public class EnvironmentProcessor implements EnvironmentPostProcessor, Ordered { - - private static final String PROPERTY_KEY = "mybatis-plus.global-config.enable-sql-runner"; +public class DynamicEnvPostProcessor implements EnvironmentPostProcessor, Ordered { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { - if (!environment.containsProperty(PROPERTY_KEY)) { - Properties properties = new Properties(); - properties.setProperty(PROPERTY_KEY, "true"); - PropertiesPropertySource propertySource = new PropertiesPropertySource(PROPERTY_KEY, properties); + ConfigResolver configResolver = new ConfigResolver(environment); + Properties properties = configResolver.resolveInstance(this); + if (!properties.isEmpty()) { + PropertiesPropertySource propertySource = new PropertiesPropertySource(this.getClass().getName() + "@KeyValues", properties); environment.getPropertySources().addLast(propertySource); } } diff --git a/dorive-env/src/main/java/com/gitee/dorive/env/util/AopUtils.java b/dorive-env/src/main/java/com/gitee/dorive/env/util/AopUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..ed252013e3131972e72e7b6a968d09df15d7b202 --- /dev/null +++ b/dorive-env/src/main/java/com/gitee/dorive/env/util/AopUtils.java @@ -0,0 +1,30 @@ +/* + * 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.env.util; + +public class AopUtils { + + public static Class getTargetClass(Object instance) { + Class targetClass = org.springframework.aop.support.AopUtils.getTargetClass(instance); + if (targetClass.getName().contains("$$")) { + targetClass = targetClass.getSuperclass(); + } + return targetClass; + } + +} diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index a295ba1020889ba574c0344fb09bb88e12296f1c..c2072bd2b5dab437b135fd123addd1faa05b02c5 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-event diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java index a021277f482a4b15f3b3809be29ad16025df4f53..1b64270ea5ac16305c955a9f0734f2f3edb0873c 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java @@ -17,10 +17,17 @@ package com.gitee.dorive.event.api; +import com.gitee.dorive.event.annotation.Listener; import com.gitee.dorive.event.entity.ExecutorEvent; +import org.springframework.core.annotation.AnnotationUtils; public interface EntityListener { + default Class subscribe() { + Listener listener = AnnotationUtils.getAnnotation(this.getClass(), Listener.class); + return listener != null ? listener.value() : null; + } + void onApplicationEvent(ExecutorEvent executorEvent); } 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 2ac9f02e95d111aba5eb825f7014c6861ead4da9..bf15d94721ecca4cc2aacdcd17d6d3ea08a30102 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,7 @@ package com.gitee.dorive.event.config; -import com.gitee.dorive.event.impl.RepositoryListener; +import com.gitee.dorive.event.impl.ExecutorListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -26,9 +26,9 @@ import org.springframework.core.annotation.Order; @Configuration public class DoriveEventConfiguration { - @Bean("repositoryListenerV3") - public RepositoryListener repositoryListener() { - return new RepositoryListener(); + @Bean("executorListenerV3") + public ExecutorListener executorListener() { + return new ExecutorListener(); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java new file mode 100644 index 0000000000000000000000000000000000000000..2799f34dae2cd52f7cea32aeadff48e531c4e788 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.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.event.impl; + +import com.gitee.dorive.api.util.ReflectUtils; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.event.api.EntityListener; +import com.gitee.dorive.event.entity.ExecutorEvent; + +public abstract class DefaultEntityListener implements EntityListener { + + @Override + public Class subscribe() { + return ReflectUtils.getFirstArgumentType(this.getClass()); + } + + @Override + @SuppressWarnings("unchecked") + public void onApplicationEvent(ExecutorEvent executorEvent) { + Context context = executorEvent.getContext(); + Operation operation = executorEvent.getOperation(); + onExecution(context, operation.getType(), (E) operation.getEntity()); + } + + protected abstract void onExecution(Context context, int type, E entity); + +} 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/impl/EventExecutor.java index 2bb9f9ce055a9cc3c29022303f312b5cdf2907e3..c102064aa7c2be748d6b3f69f3cc2ef9a817b0f1 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java @@ -20,38 +20,29 @@ package com.gitee.dorive.event.impl; import com.gitee.dorive.api.entity.element.EntityEle; 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.impl.executor.AbstractExecutor; +import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; import com.gitee.dorive.event.entity.ExecutorEvent; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.context.ApplicationContext; @Data -@AllArgsConstructor @EqualsAndHashCode(callSuper = false) -public class EventExecutor extends AbstractExecutor { +public class EventExecutor extends AbstractProxyExecutor { private ApplicationContext applicationContext; private EntityEle entityEle; - private Executor executor; - @Override - public Result executeQuery(Context context, Query query) { - return executor.executeQuery(context, query); - } - - @Override - public long executeCount(Context context, Query query) { - return executor.executeCount(context, query); + public EventExecutor(Executor executor, ApplicationContext applicationContext, EntityEle entityEle) { + super(executor); + this.applicationContext = applicationContext; + this.entityEle = entityEle; } @Override public int execute(Context context, Operation operation) { - int count = executor.execute(context, operation); + int count = super.execute(context, operation); if (count != 0) { ExecutorEvent executorEvent = new ExecutorEvent(this); executorEvent.setContext(context); diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java similarity index 82% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java index 5e7d80e613d9fbb766d3ab04511e6c0569e639b0..dd0408f119749fdb1cc982c0c584ad3ffbf7b25f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java @@ -18,7 +18,6 @@ package com.gitee.dorive.event.impl; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.event.annotation.Listener; import com.gitee.dorive.event.api.EntityListener; import com.gitee.dorive.event.entity.ExecutorEvent; import lombok.extern.slf4j.Slf4j; @@ -28,7 +27,6 @@ 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.AnnotationUtils; import java.util.ArrayList; import java.util.List; @@ -36,7 +34,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Slf4j -public class RepositoryListener implements ApplicationListener, ApplicationContextAware, InitializingBean { +public class ExecutorListener implements ApplicationListener, ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; private final Map, List> classEventListenersMap = new ConcurrentHashMap<>(); @@ -52,9 +50,8 @@ public class RepositoryListener implements ApplicationListener, A List entityListeners = new ArrayList<>(entityListenerMap.values()); entityListeners.sort(new AnnotationAwareOrderComparator()); for (EntityListener entityListener : entityListeners) { - Listener listener = AnnotationUtils.getAnnotation(entityListener.getClass(), Listener.class); - if (listener != null) { - Class entityClass = listener.value(); + Class entityClass = entityListener.subscribe(); + if (entityClass != null) { List existEntityListeners = classEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); existEntityListeners.add(entityListener); } @@ -62,15 +59,15 @@ public class RepositoryListener implements ApplicationListener, A } @Override - public void onApplicationEvent(ExecutorEvent event) { - EventExecutor eventExecutor = (EventExecutor) event.getSource(); + public void onApplicationEvent(ExecutorEvent executorEvent) { + EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); EntityEle entityEle = eventExecutor.getEntityEle(); Class entityClass = entityEle.getGenericType(); List entityListeners = classEventListenersMap.get(entityClass); if (entityListeners != null && !entityListeners.isEmpty()) { for (EntityListener entityListener : entityListeners) { try { - entityListener.onApplicationEvent(event); + entityListener.onApplicationEvent(executorEvent); } catch (Exception e) { log.error("Exception occurred in event listening!", e); } 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 f4d345c330e4f8e1f896cefb988a6f9dcf561c0b..34536d6567cffcf06896533cc81e99e4fd440804 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 @@ -19,15 +19,15 @@ package com.gitee.dorive.event.repository; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.repository.AbstractGenericRepository; +import com.gitee.dorive.core.repository.AbstractExampleRepository; +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.core.repository.ProxyRepository; import com.gitee.dorive.event.annotation.EnableEvent; import com.gitee.dorive.event.impl.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; -public abstract class AbstractEventRepository extends AbstractGenericRepository { +public abstract class AbstractEventRepository extends AbstractExampleRepository { private boolean enableEvent; @@ -42,14 +42,14 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo protected AbstractRepository processRepository(AbstractRepository repository) { if (enableEvent) { AbstractRepository actualRepository = repository; - if (repository instanceof ProxyRepository) { - actualRepository = ((ProxyRepository) repository).getProxyRepository(); + if (repository instanceof AbstractProxyRepository) { + actualRepository = ((AbstractProxyRepository) repository).getProxyRepository(); } if (actualRepository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) actualRepository; EntityEle entityEle = defaultRepository.getEntityEle(); Executor executor = defaultRepository.getExecutor(); - executor = new EventExecutor(getApplicationContext(), entityEle, executor); + executor = new EventExecutor(executor, getApplicationContext(), entityEle); defaultRepository.setExecutor(executor); } } diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index 2cb9b5b9827ec9d77c3761bd34a12a4c6b5ed253..a0b771770727491cdedccffa0158cec0771d9840 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-injection diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java b/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java index c2c135dcc4ef90c2a20af59848c4f979c727139c..857f5124fdc72bb529c3e279683bbc40fe4b4734 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java +++ b/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java @@ -19,7 +19,7 @@ package com.gitee.dorive.injection.spring; import com.gitee.dorive.injection.annotation.Root; import com.gitee.dorive.injection.api.TypeDomainResolver; -import com.gitee.dorive.injection.utils.AopUtils; +import com.gitee.dorive.injection.util.AopUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/utils/AopUtils.java b/dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java similarity index 97% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/utils/AopUtils.java rename to dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java index 7a7b4e5ad5ff82bc73a1bc4e0b2d4baece141202..0e6818e1aab304f65a84f9c23ef9a79fec81131e 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/utils/AopUtils.java +++ b/dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.injection.utils; +package com.gitee.dorive.injection.util; import java.lang.annotation.Annotation; diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index dc7e069147e3f2c3dae416492c4e04c123f18d6e..c292e6c408fb18f2f7273d505e78c21fb8f7a39f 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-proxy diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index b6ef802e5e93ea337a52fae79558efff042bcbd1..713efc5061f9ca95596364e305a5a9245d9182c6 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 dorive-ref diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java index 48849671370d339223dda3101f256c37dddf49c9..44d96d8cfedf4bcf1063a3081a1c78ae714646b7 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java @@ -19,7 +19,7 @@ package com.gitee.dorive.ref.api; import com.gitee.dorive.ref.repository.AbstractRefRepository; -public interface Ref extends SimpleRepository { +public interface Ref extends SelectorRepository { > R get(); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SimpleRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java similarity index 97% rename from dorive-ref/src/main/java/com/gitee/dorive/ref/api/SimpleRepository.java rename to dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java index e5cdb9b80a6407fdd40920090dce0776dc58f11a..c2eba9d50853af34b40185adc7d73a204453be3f 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SimpleRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java @@ -25,7 +25,7 @@ import com.gitee.dorive.core.entity.executor.Page; import java.util.List; -public interface SimpleRepository extends CoatingRepository { +public interface SelectorRepository extends CoatingRepository { default E selectByPrimaryKey(Selector selector, PK primaryKey) { return selectByPrimaryKey(new InnerContext(selector), primaryKey); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java index 584731f343b8a2ad97774090b37cfc4bc7fe67d1..d89e2964778bb58aa9ba5621d7ee85efba3fa5f2 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java @@ -20,7 +20,7 @@ package com.gitee.dorive.ref.impl; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.repository.ProxyRepository; +import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.ref.api.Ref; import com.gitee.dorive.ref.api.RefObj; import com.gitee.dorive.ref.repository.AbstractRefRepository; @@ -31,7 +31,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -public class RefImpl extends ProxyRepository implements Ref { +public class RefImpl extends AbstractProxyRepository implements Ref { private AbstractRefRepository repository; private EntityHandler entityHandler; diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index 0aeed35cb0e633e4cf62c29b3b21c53fa6a7db9f..b97108dc2acb6d4ed6ca9d9b1c6426d66def6d6d 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -19,10 +19,10 @@ package com.gitee.dorive.ref.repository; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.ref.api.SimpleRepository; +import com.gitee.dorive.ref.api.SelectorRepository; import com.gitee.dorive.ref.impl.RefInjector; -public abstract class AbstractRefRepository extends AbstractCoatingRepository implements SimpleRepository { +public abstract class AbstractRefRepository extends AbstractCoatingRepository implements SelectorRepository { @Override protected EntityHandler processEntityHandler(EntityHandler entityHandler) { diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index ea9ebe91672583637f7fb2d492622e2f0263291c..ec641d113d78f766f4e795ece67589fdd719bce9 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.2 + 3.4.3.1 dorive-spring-boot-starter @@ -15,6 +15,16 @@ dorive-injection ${project.version} + + com.gitee.digital-engine + dorive-env + ${project.version} + + + com.gitee.digital-engine + dorive-web + ${project.version} + com.gitee.digital-engine dorive-ref diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java index 77c23d2d081f375cbdfc4a64fb9957a7d07bc178..9d33ecf38fb34b1d79ab55968b06c0f3501dfa49 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java @@ -20,14 +20,25 @@ package com.gitee.dorive.spring.boot.starter.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +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 org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; +@Data @Order(-100) @Configuration -public class MybatisPlusConfiguration { - +@EqualsAndHashCode(callSuper = false) +public class MybatisPlusConfiguration extends DynamicConfiguration { + + @Key("mybatis-plus.global-config.enable-sql-runner") + @Value("true") + private Boolean enableSqlRunner; + @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java index a40aaf5f2cace8f1c12cec25770423e62919d635..5f613a35a76275b665e143974b28fce504ac0e24 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java @@ -26,16 +26,17 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class ArgSegment { - private String property; + private String tableAlias; + private String column; private String operator; private String expr; @Override public String toString() { if (expr != null) { - return property + " " + operator + " " + expr; + return tableAlias + "." + column + " " + operator + " " + expr; } else { - return property + " " + operator; + return tableAlias + "." + column + " " + operator; } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index ef8a0eb732318f3b8171a94ac57e3a92dab03765..31097b70d5ea36b2f32f1f28474a098107494f9b 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -20,6 +20,8 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; import lombok.Data; @@ -40,8 +42,8 @@ public class CountQuerier { this.segmentBuilder = new SegmentBuilder(repository); } - public Map selectCount(String groupField, boolean distinct, String countField, Object coating) { - SegmentResult segmentResult = segmentBuilder.buildSegment(coating); + public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object coating) { + SegmentResult segmentResult = segmentBuilder.buildSegment(context, coating); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); @@ -69,8 +71,12 @@ public class CountQuerier { return countMap; } + public Map selectCount(Context context, String groupField, String countField, Object coating) { + return selectCount(context, groupField, true, countField, coating); + } + public Map selectCount(String groupField, String countField, Object coating) { - return selectCount(groupField, true, countField, coating); + return selectCount(new BoundedContext(), groupField, true, countField, coating); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index e2fe7fca1ac49f33daf4c9deda5c8463cda2ac29..e07c27fe1e8d3fed6b8a6eaf84f2a83aadd33676 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -20,9 +20,9 @@ package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.coating.api.ExampleBuilder; +import com.gitee.dorive.coating.entity.BuildExample; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; @@ -45,26 +45,26 @@ public class SQLExampleBuilder implements ExampleBuilder { } @Override - public Example buildExample(Context context, Object coating) { - SegmentResult segmentResult = segmentBuilder.buildSegment(coating); + public BuildExample buildExample(Context context, Object coating) { + SegmentResult segmentResult = segmentBuilder.buildSegment(context, coating); char letter = segmentResult.getLetter(); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); OrderBy orderBy = segmentResult.getOrderBy(); Page page = segmentResult.getPage(); - Example example = new Example(); - example.setOrderBy(orderBy); - example.setPage(page); + BuildExample buildExample = new BuildExample(); + buildExample.setOrderBy(orderBy); + buildExample.setPage(page); if (selectSegment == null) { throw new RuntimeException("Unable to build SQL statement!"); } if (selectSegment.getArgSegments().isEmpty()) { - return example; + return buildExample; } if (!selectSegment.isDirtyQuery()) { - return example; + return buildExample; } selectSegment.setDistinct(true); @@ -80,10 +80,10 @@ public class SQLExampleBuilder implements ExampleBuilder { String countSql = selectSegment.selectSql() + fromWhereSql; long count = SqlRunner.db().selectCount("SELECT COUNT(1) FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - example.setCountQueried(true); + buildExample.setCountQueried(true); if (count == 0) { - example.setEmptyQuery(true); - return example; + buildExample.setAbandoned(true); + return buildExample; } } @@ -103,12 +103,12 @@ public class SQLExampleBuilder implements ExampleBuilder { List> resultMaps = SqlRunner.db().selectList(selectSql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { - example.eq("id", primaryKeys); + buildExample.eq("id", primaryKeys); } else { - example.setEmptyQuery(true); + buildExample.setAbandoned(true); } - return example; + return buildExample; } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 462f1649c1ae4c99e490e496d4a4720028e5f2e8..a76da67bf433593ea2106da6d09a951b1807c159 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -23,20 +23,30 @@ import com.gitee.dorive.coating.entity.CoatingCriteria; import com.gitee.dorive.coating.entity.CoatingType; import com.gitee.dorive.coating.entity.MergedRepository; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.spring.boot.starter.api.Keys; -import com.gitee.dorive.spring.boot.starter.entity.*; -import com.gitee.dorive.spring.boot.starter.impl.executor.AliasExecutor; +import com.gitee.dorive.api.constant.Keys; +import com.gitee.dorive.spring.boot.starter.entity.ArgSegment; +import com.gitee.dorive.spring.boot.starter.entity.JoinSegment; +import com.gitee.dorive.spring.boot.starter.entity.OnSegment; +import com.gitee.dorive.spring.boot.starter.entity.Segment; +import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; +import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; +import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data @AllArgsConstructor @@ -44,7 +54,7 @@ public class SegmentBuilder { private final AbstractCoatingRepository repository; - public SegmentResult buildSegment(Object coating) { + public SegmentResult buildSegment(Context context, Object coating) { CoatingType coatingType = repository.getCoatingType(coating); CoatingCriteria coatingCriteria = coatingType.newCriteria(coating); Map> criteriaMap = coatingCriteria.getCriteriaMap(); @@ -69,14 +79,14 @@ public class SegmentBuilder { Map attachments = executedRepository.getAttachments(); TableInfo tableInfo = (TableInfo) attachments.get(Keys.TABLE_INFO); - AliasExecutor aliasExecutor = (AliasExecutor) attachments.get(Keys.ALIAS_EXECUTOR); + FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); String tableName = tableInfo.getTableName(); String tableAlias = String.valueOf(letter); letter = (char) (letter + 1); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> Collections.emptyList()); - aliasExecutor.convertCriteria(criteria); + fieldExecutor.convertCriteria(context, criteria); appendArguments(argSegments, args, tableAlias, criteria); if ("/".equals(relativeAccessPath)) { @@ -92,7 +102,7 @@ public class SegmentBuilder { selectSegment.setArgSegments(argSegments); segmentMap.put(relativeAccessPath, selectSegment); - aliasExecutor.convertOrderBy(orderBy); + fieldExecutor.convertOrderBy(orderBy); } else { JoinSegment joinSegment = new JoinSegment(); @@ -126,17 +136,17 @@ public class SegmentBuilder { String tableAlias, List criteria) { for (Criterion criterion : criteria) { - String property = tableAlias + "." + criterion.getProperty(); + String property = criterion.getProperty(); String operator = CriterionUtils.getOperator(criterion); if (Operator.IS_NULL.equals(operator) || Operator.IS_NOT_NULL.equals(operator)) { - ArgSegment argSegment = new ArgSegment(property, operator, null); + ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, null); argSegments.add(argSegment); } else { Object value = criterion.getValue(); args.add(CriterionUtils.format(operator, value)); int index = args.size() - 1; - ArgSegment argSegment = new ArgSegment(property, operator, "{" + index + "}"); + ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, "{" + index + "}"); argSegments.add(argSegment); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java index 115b807975b07dadb4fc79488f3a9eeaaaf5777a..c438df9e0afa42c47d84ac4fdd7cbec438e2a434 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java @@ -27,24 +27,15 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -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.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.NullableUpdate; -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.executor.*; +import com.gitee.dorive.core.entity.operation.*; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.spring.boot.starter.entity.QueryResult; import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; import lombok.Getter; import lombok.Setter; @@ -85,32 +76,35 @@ public class MybatisPlusExecutor extends AbstractExecutor { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", query.getPrimaryKey()); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new Result<>(new QueryResult(resultMaps)); + return new MultiResult(resultMaps); } else if (query.getExample() != null) { Example example = query.getExample(); - if (query.withoutPage()) { + if (query.startPage()) { + com.gitee.dorive.core.entity.executor.Page page = example.getPage(); + + Page> queryPage = new Page<>(page.getCurrent(), page.getSize()); + QueryWrapper queryWrapper = buildQueryWrapper(example); + queryPage = baseMapper.selectMapsPage(queryPage, queryWrapper); + + page.setTotal(queryPage.getTotal()); + return new MultiResult(page, queryPage.getRecords()); + + } else { if (example instanceof UnionExample) { UnionExample unionExample = (UnionExample) example; QueryWrapper queryWrapper = buildQueryWrapper(unionExample); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new Result<>(new QueryResult(resultMaps)); + return new MultiResult(resultMaps); } else { QueryWrapper queryWrapper = buildQueryWrapper(example); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new Result<>(new QueryResult(resultMaps)); + return new MultiResult(resultMaps); } - - } else { - com.gitee.dorive.core.entity.executor.Page page = example.getPage(); - Page> dataPage = new Page<>(page.getCurrent(), page.getSize()); - QueryWrapper queryWrapper = buildQueryWrapper(example); - dataPage = baseMapper.selectMapsPage(dataPage, queryWrapper); - return new Result<>(new QueryResult(dataPage)); } } - return new Result<>(new QueryResult(Collections.emptyList())); + return new MultiResult(Collections.emptyList()); } @Override @@ -218,8 +212,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { NullableUpdate nullableUpdate = (NullableUpdate) update; Set nullableSet = nullableUpdate.getNullableSet(); if (nullableSet != null && !nullableSet.isEmpty()) { - example = primaryKey != null ? new Example().eq("id", primaryKey) : example; - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableSet, example); + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableSet, primaryKey, example); return baseMapper.update(null, updateWrapper); } } @@ -255,7 +248,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { return updateWrapper; } - private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableSet, Example example) { + private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableSet, Object primaryKey, Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); List fieldList = TableInfoHelper.getTableInfo(pojoClass).getFieldList(); for (TableFieldInfo tableFieldInfo : fieldList) { @@ -265,9 +258,15 @@ public class MybatisPlusExecutor extends AbstractExecutor { updateWrapper.set(true, tableFieldInfo.getColumn(), value); } } - for (Criterion criterion : example.getCriteria()) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); - criterionAppender.appendCriterion(updateWrapper, criterion.getProperty(), criterion.getValue()); + if (primaryKey != null) { + CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(Operator.EQ); + criterionAppender.appendCriterion(updateWrapper, "id", primaryKey); + } + if (example != null) { + for (Criterion criterion : example.getCriteria()) { + CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); + criterionAppender.appendCriterion(updateWrapper, criterion.getProperty(), criterion.getValue()); + } } return updateWrapper; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 94dcacc3da1ee8e1d53f4b24c890aee7eadf9954..400f3ad53f9d73ec27d2a7c1f9cf3cf6d6c840a2 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -22,20 +22,20 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.coating.api.ExampleBuilder; -import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.coating.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import com.gitee.dorive.spring.boot.starter.api.Keys; import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; import com.gitee.dorive.spring.boot.starter.impl.SQLExampleBuilder; -import com.gitee.dorive.spring.boot.starter.impl.executor.AliasExecutor; -import com.gitee.dorive.spring.boot.starter.impl.executor.FactoryExecutor; import com.gitee.dorive.spring.boot.starter.impl.executor.MybatisPlusExecutor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -64,7 +64,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override @SuppressWarnings("unchecked") - protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle, Map attachments) { + protected ExecutorResult newExecutor(EntityDef entityDef, EntityEle entityEle, Map converterMap, Map attachments) { Class mapperClass = entityDef.getSource(); Object mapper = null; Class pojoClass = null; @@ -80,20 +80,18 @@ public class MybatisPlusRepository extends AbstractRefRepository { } } } - Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); + Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); attachments.put(Keys.TABLE_INFO, tableInfo); - EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, pojoClass, tableInfo); + EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, pojoClass, tableInfo, converterMap); Executor executor = new MybatisPlusExecutor(entityDef, entityEle, (BaseMapper) mapper, (Class) pojoClass); - executor = new FactoryExecutor(entityEle, entityFactory, executor); - executor = new AliasExecutor(entityEle, executor); - attachments.put(Keys.ALIAS_EXECUTOR, executor); - return executor; + return new ExecutorResult(entityFactory, executor); } - private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, Class pojoClass, TableInfo tableInfo) { + private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, Class pojoClass, TableInfo tableInfo, + Map converterMap) { Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { @@ -107,17 +105,17 @@ public class MybatisPlusRepository extends AbstractRefRepository { defaultEntityFactory.setPojoClass(pojoClass); Map aliasFieldMapping = newAliasFieldMapping(entityEle); - defaultEntityFactory.setAliasFieldMapping(aliasFieldMapping); + defaultEntityFactory.setReCopyOptions(aliasFieldMapping, converterMap); Map fieldPropMapping = newFieldPropMapping(tableInfo, aliasFieldMapping); - defaultEntityFactory.setFieldPropMapping(fieldPropMapping); + defaultEntityFactory.setDeCopyOptions(fieldPropMapping, newPropConverterMap(fieldPropMapping, converterMap)); } return entityFactory; } private Map newAliasFieldMapping(EntityEle entityEle) { - Map propAliasMap = entityEle.getPropAliasMap(); - return propAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + Map fieldAliasMap = entityEle.getFieldAliasMap(); + return fieldAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); } private Map newFieldPropMapping(TableInfo tableInfo, Map aliasFieldMapping) { @@ -141,8 +139,17 @@ public class MybatisPlusRepository extends AbstractRefRepository { return fieldPropMapping; } + private Map newPropConverterMap(Map fieldPropMapping, Map converterMap) { + Map propConverterMap = new LinkedHashMap<>(converterMap.size()); + converterMap.forEach((field, fieldConverter) -> { + String prop = fieldPropMapping.get(field); + propConverterMap.put(prop, fieldConverter); + }); + return propConverterMap; + } + @Override - public Example buildExample(Context context, Object coating) { + public BuildExample buildExample(Context context, Object coating) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { diff --git a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories b/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories index 853f9182d6dccc7895544903b3c55c18d456cc85..094855eb4092637fc99327c324339cf616d16029 100644 --- a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,4 +1,4 @@ org.springframework.boot.env.EnvironmentPostProcessor=\ - com.gitee.dorive.spring.boot.starter.config.EnvironmentProcessor + com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..f46594f39458b709046a45dd43ee2a6b07c1bc70 --- /dev/null +++ b/dorive-web/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.gitee.digital-engine + dorive + 3.4.3.1 + + dorive-web + + + org.springframework.boot + spring-boot-starter + + + com.fasterxml.jackson.core + jackson-annotations + + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + + cn.hutool + hutool-all + + + \ No newline at end of file diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/entity/ResObject.java b/dorive-web/src/main/java/com/gitee/dorive/web/entity/ResObject.java new file mode 100644 index 0000000000000000000000000000000000000000..aa3ef73cefb6c7d2104c273f29e86a0d6b092c4c --- /dev/null +++ b/dorive-web/src/main/java/com/gitee/dorive/web/entity/ResObject.java @@ -0,0 +1,76 @@ +/* + * 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.web.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ResObject { + + public static final int SUCCESS_CODE = 0; + public static final int FAIL_CODE = -1; + + public static final String SUCCESS_MSG = "success"; + public static final String FAIL_MSG = "fail"; + + private int code; + private String message; + private T data; + + public static ResObject success() { + return new ResObject<>(SUCCESS_CODE, SUCCESS_MSG, null); + } + + public static ResObject fail() { + return new ResObject<>(FAIL_CODE, FAIL_MSG, null); + } + + public static ResObject successMsg(String message) { + return new ResObject<>(SUCCESS_CODE, message, null); + } + + public static ResObject failMsg(String message) { + return new ResObject<>(FAIL_CODE, message, null); + } + + public static ResObject successData(T data) { + return new ResObject<>(SUCCESS_CODE, SUCCESS_MSG, data); + } + + public static ResObject failData(T data) { + return new ResObject<>(FAIL_CODE, FAIL_MSG, data); + } + + @JsonIgnore + public boolean isSuccess() { + return code == SUCCESS_CODE; + } + + @JsonIgnore + public boolean isFail() { + return code == FAIL_CODE; + } + +} diff --git a/pom.xml b/pom.xml index 49e3030902f3c06338c864b3b2640fa424ca603d..1c5b1e75411346bef619bfdccc9df4cc2143318a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.2 + 3.4.3.1 pom @@ -30,6 +30,8 @@ dorive-injection + dorive-env + dorive-web dorive-proxy dorive-api dorive-core @@ -53,6 +55,11 @@ spring-boot-starter 2.7.8 + + com.fasterxml.jackson.core + jackson-annotations + 2.13.4 + org.projectlombok lombok