diff --git a/README.md b/README.md index fcce1b71c52abbe376ce171348678f977e7f6650..c7b3f01eb87f2bb7d34219c794f035999252f360 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ - **模型驱动** - **NoSQL** - **面向对象** -- **事件驱动** +- **事件模式** - **代码生成** ### 🤼‍♂️设计模式对比 @@ -47,7 +47,7 @@ com.gitee.digital-engine dorive-spring-boot-starter - 3.3.1 + 3.3.9 ``` @@ -66,11 +66,6 @@ @Data @Entity(name = "tenant", source = SysTenantMapper.class) public class Tenant { - /** - * 选取器,决定每次操作的范围 - */ - public static final Selector ALL = new NameSelector("*"); - public static final Selector ONLY_TENANT = new NameSelector("tenant"); private Integer id; private String tenantCode; @@ -98,8 +93,6 @@ public class Tenant { ```java @RootRepository -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) @CoatingScan("xxx.xxx.xxx.xxx.xxx.query") public class TenantRepository extends MybatisPlusRepository { } @@ -110,8 +103,9 @@ public class TenantRepository extends MybatisPlusRepository { ```java package xxx.xxx.xxx.xxx.xxx.query; @Data -@Coating +@Example public class TenantQuery { + @Criterion(belongTo = "user") private String userCode; private String sortBy; private String order; @@ -135,7 +129,7 @@ User user = new User(); user.setUserCode("user"); tenant.setUser(Collections.singletonList(user)); -int count = tenantRepository.insert(Tenant.ALL, tenant); +int count = tenantRepository.insert(Selector.ALL, tenant); ``` #### 查询数据 @@ -149,21 +143,21 @@ tenantQuery.setOrder("desc"); tenantQuery.setPage(1); tenantQuery.setLimit(10); -List tenants = tenantRepository.selectByCoating(Tenant.ALL, tenantQuery); +List tenants = tenantRepository.selectByCoating(Selector.ALL, tenantQuery); ``` #### 更新数据 ```java -Tenant tenant = tenantRepository.selectByPrimaryKey(Tenant.ONLY_TENANT, 1); +Tenant tenant = tenantRepository.selectByPrimaryKey(Selector.ROOT, 1); tenant.setTenantCode("tenant1"); -int count = tenantRepository.update(Tenant.ONLY_TENANT, tenant); +int count = tenantRepository.update(Selector.ROOT, tenant); ``` #### 删除数据 ```java // 开发者通过聚合对象的id,即可删除所有数据 -int count = tenantRepository.deleteByPrimaryKey(Tenant.ALL, 1); +int count = tenantRepository.deleteByPrimaryKey(Selector.ALL, 1); ``` diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 82bd81e3198d36a3afbeb205dfab70e7f6cc9044..1e1d608798da44adcbdd8661f7ae77899ffaa212 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-api diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Repository.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Repository.java index 693423f12bb68a7d8c83115a15bf883dbe55c14b..0e1b9cff116e597285f3e57e4e8a1bb9fda700f4 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Repository.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Repository.java @@ -32,6 +32,4 @@ public @interface Repository { @AliasFor(annotation = Component.class) String value() default ""; - String querier() default ""; - } 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 2507279be820b921d82b41eabc5e43940e9f8de0..09d257f861f65a1b57b68a6ba9983160c214eb24 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 @@ -17,7 +17,6 @@ package com.gitee.dorive.api.entity.element; -import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.annotation.Aggregate; import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.entity.def.BindingDef; @@ -27,7 +26,6 @@ import lombok.NoArgsConstructor; import java.lang.reflect.AnnotatedElement; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -40,7 +38,7 @@ public abstract class EntityEle { private boolean aggregated; private List bindingDefs; private PropProxy pkProxy; - private Map aliasMap; + private Map propAliasMap; public EntityEle(AnnotatedElement element) { this.element = element; @@ -64,11 +62,7 @@ public abstract class EntityEle { } public String toAlias(String property) { - if (property.contains(",")) { - List aliases = toAliases(StrUtil.splitTrim(property, ",")); - return StrUtil.join(",", aliases); - } - return aliasMap.getOrDefault(property, property); + return propAliasMap.getOrDefault(property, property); } public List toAliases(List properties) { @@ -83,12 +77,6 @@ public abstract class EntityEle { return properties; } - public Map newAliasFieldMapping() { - Map map = new LinkedHashMap<>(); - aliasMap.forEach((key, value) -> map.put(value, key)); - return map; - } - protected abstract void doInitialize(); public abstract boolean isCollection(); 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 db9f7bf7935fa141756c847661ea062114eefa16..c5cdee3c2a8ef80ba184a2587642163224adb62c 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 @@ -40,7 +40,7 @@ public class EntityField extends EntityEle { private AliasDef aliasDef; private EntityType entityType; - public static boolean filter(Class type) { + public static boolean isComplexType(Class type) { String className = type.getName(); return !className.startsWith("java.lang.") && !className.startsWith("java.util.") && !type.isEnum(); } @@ -64,14 +64,14 @@ public class EntityField extends EntityEle { private void resolve(Field field) { EntityDef entityDef = getEntityDef(); - if (entityDef != null) { + if (entityDef != null && type != genericType) { EntityDef genericEntityDef = EntityDef.fromElement(genericType); if (genericEntityDef != null) { entityDef.merge(genericEntityDef); } } aliasDef = AliasDef.fromElement(field); - if (filter(genericType)) { + if (isComplexType(genericType)) { entityType = EntityType.getInstance(genericType); } } @@ -81,7 +81,7 @@ public class EntityField extends EntityEle { if (entityType != null) { entityType.initialize(); setPkProxy(entityType.getPkProxy()); - setAliasMap(entityType.getAliasMap()); + setPropAliasMap(entityType.getPropAliasMap()); } } 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 b2cea697151e89bd38b23d0c718243fc3b0912de..7aacd48491cd0ac3c4b68c4cce02dbdab16ff72b 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 @@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -47,7 +48,7 @@ public class EntityType extends EntityEle { private Class type; private String name; - private Map entityFields = new LinkedHashMap<>(); + private Map entityFields; public static synchronized EntityType getInstance(Class type) { EntityType entityType = CACHE.get(type); @@ -67,7 +68,11 @@ public class EntityType extends EntityEle { super(type); this.type = type; this.name = type.getName(); - for (Field field : ReflectUtils.getAllFields(type)) { + + List fields = ReflectUtils.getAllFields(type); + this.entityFields = new LinkedHashMap<>(fields.size() * 4 / 3 + 1); + + for (Field field : fields) { if (!Modifier.isStatic(field.getModifiers())) { try { EntityField entityField = new EntityField(field); @@ -89,14 +94,14 @@ public class EntityType extends EntityEle { PropProxy pkProxy = PropProxyFactory.newPropProxy(genericType, "id"); setPkProxy(pkProxy); - Map aliasMap = new LinkedHashMap<>(); + Map propAliasMap = new LinkedHashMap<>(entityFields.size() * 4 / 3 + 1); for (EntityField entityField : entityFields.values()) { String name = entityField.getName(); AliasDef aliasDef = entityField.getAliasDef(); String alias = aliasDef != null ? aliasDef.getValue() : StrUtil.toUnderlineCase(name); - aliasMap.put(name, alias); + propAliasMap.put(name, alias); } - setAliasMap(aliasMap); + setPropAliasMap(propAliasMap); } @Override diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/factory/PropProxyFactory.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/factory/PropProxyFactory.java index 0722b3682d5836a5151995a17fb4ad6e598a4daa..62906454056d655f60770b94072715aa77dab2aa 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/factory/PropProxyFactory.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/factory/PropProxyFactory.java @@ -20,9 +20,8 @@ package com.gitee.dorive.api.impl.factory; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.proxy.ProxyCompiler; import com.gitee.dorive.proxy.JavassistCompiler; -import com.gitee.dorive.api.util.ReflectUtils; +import com.gitee.dorive.proxy.ProxyCompiler; import java.lang.reflect.Field; import java.util.Map; @@ -58,7 +57,7 @@ public class PropProxyFactory { try { String generatedCode = generateCode(entityClass, fieldClass, fieldName); Class generatedClass = PROXY_COMPILER.compile(generatedCode, null); - PropProxy propProxy = (PropProxy) ReflectUtils.newInstance(generatedClass); + PropProxy propProxy = (PropProxy) ReflectUtil.newInstance(generatedClass); GENERATED_PROXY_CACHE.put(cacheKey, propProxy); } catch (Exception e) { 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 64a29e8ded38c5c9c09022a993a2fcb7625a49e6..426bcc509c6bcaae2a6c2fe46190a923547bfbbb 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 @@ -40,7 +40,7 @@ public class PropChainResolver { String accessPath = lastAccessPath + "/" + entityField.getName(); PropChain propChain = new PropChain(lastPropChain, entityType, accessPath, entityField); propChainMap.put(accessPath, propChain); - if (EntityField.filter(entityField.getType()) && !entityField.isAnnotatedEntity()) { + if (EntityField.isComplexType(entityField.getType()) && !entityField.isAnnotatedEntity()) { resolve(accessPath, entityField.getEntityType()); } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/util/ReflectUtils.java b/dorive-api/src/main/java/com/gitee/dorive/api/util/ReflectUtils.java index 37d18f6c39d3a3dc64be197ee690975aa9a2403e..127e52feda21c99ae313c7e25b7a3ffb13185ccc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/util/ReflectUtils.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/util/ReflectUtils.java @@ -50,10 +50,6 @@ public class ReflectUtils { return fields; } - public static Object newInstance(Class type) { - return org.springframework.cglib.core.ReflectUtils.newInstance(type); - } - public static Class getFirstArgumentType(Class type) { Type genericSuperclass = type.getGenericSuperclass(); ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index c7305c8e518e331ce6faa44b28f9788d058114c7..93fa6cde35c9ee6c3cf9ced9402807fd36fcea08 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-coating diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Property.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java similarity index 97% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Property.java rename to dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java index 13bdaec6c5a90f4db0687d2f83718c9a35454eba..7563ff9900631b68fcbd240a7d70bfbc42f54d99 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Property.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java @@ -30,7 +30,7 @@ import java.lang.annotation.Target; @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) -public @interface Property { +public @interface Criterion { @AliasFor("belongTo") String value() default "/"; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Coating.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java similarity index 97% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Coating.java rename to dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java index 21b799da44b0f1b6d151b1ffcd306063c1a679db..4bbe1677513de759e64284dca78df5b99727f71f 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Coating.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java @@ -28,5 +28,5 @@ import java.lang.annotation.Target; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -public @interface Coating { +public @interface Example { } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java index 86f117095bfcaf50e53351a03fe821e0f9734e10..898e8b37666dd2082140a8f4a6d04b30361108c7 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java @@ -18,7 +18,7 @@ package com.gitee.dorive.coating.entity; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.coating.entity.def.PropertyDef; +import com.gitee.dorive.coating.entity.def.CriterionDef; import lombok.AllArgsConstructor; import lombok.Data; @@ -36,7 +36,7 @@ public class CoatingField { private boolean collection; private Class genericType; private String name; - private PropertyDef propertyDef; + private CriterionDef criterionDef; public CoatingField(Field field) { this.field = field; @@ -50,11 +50,11 @@ public class CoatingField { Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; this.genericType = (Class) actualTypeArgument; } - propertyDef = PropertyDef.fromElement(field); + criterionDef = CriterionDef.fromField(field); } public boolean isIgnore() { - return propertyDef.isIgnore(); + return criterionDef.isIgnore(); } public Object getFieldValue(Object object) { diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java index 331542a6f775f566c48b85a58e01e048d17ab949..eea73b5bafeb36c3b00ff2879b24ab38370c0c12 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java @@ -17,8 +17,8 @@ package com.gitee.dorive.coating.entity; -import com.gitee.dorive.coating.entity.def.CoatingDef; -import com.gitee.dorive.coating.entity.def.PropertyDef; +import com.gitee.dorive.coating.entity.def.ExampleDef; +import com.gitee.dorive.coating.entity.def.CriterionDef; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; @@ -34,8 +34,8 @@ import java.util.Map; @AllArgsConstructor public class CoatingType { - private CoatingDef coatingDef; - private List fields; + private ExampleDef exampleDef; + private List coatingFields; private SpecificFields specificFields; private List mergedRepositories; private List reversedMergedRepositories; @@ -49,13 +49,13 @@ public class CoatingType { public Map> newCriteriaMap(Object coating) { Map> criteriaMap = new LinkedHashMap<>(8); - for (CoatingField field : fields) { - Object fieldValue = field.getFieldValue(coating); + for (CoatingField coatingField : coatingFields) { + Object fieldValue = coatingField.getFieldValue(coating); if (fieldValue != null) { - PropertyDef propertyDef = field.getPropertyDef(); - String belongTo = propertyDef.getBelongTo(); - String fieldName = propertyDef.getField(); - String operator = propertyDef.getOperator(); + CriterionDef criterionDef = coatingField.getCriterionDef(); + String belongTo = criterionDef.getBelongTo(); + String fieldName = criterionDef.getField(); + String operator = criterionDef.getOperator(); List criteria = criteriaMap.computeIfAbsent(belongTo, key -> new ArrayList<>(4)); criteria.add(new Criterion(fieldName, operator, fieldValue)); } 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 cb9eba4ac99c6fc9838405e21fe491e9ce789823..3a15ca0da87925f9339748466e14fd9649a9c26a 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 @@ -36,7 +36,7 @@ public class MergedRepository { private CommonRepository definedRepository; private Map> mergedBindersMap; private CommonRepository executedRepository; - private Integer sequence; + private Integer order; public String getName() { return definedRepository.getEntityDef().getName(); 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 421213c0f27dfd0c00dcf41d1bb39b7dc30f25ba..56b581a8e0f4ab181e52e88b73aced9dc8f628eb 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,22 +34,22 @@ public class SpecificFields { private CoatingField pageField; private CoatingField limitField; - public boolean addProperty(CoatingField field) { - String fieldName = field.getName(); + public boolean addProperty(CoatingField coatingField) { + String fieldName = coatingField.getName(); if ("sortBy".equals(fieldName)) { - sortByField = field; + sortByField = coatingField; return true; } else if ("order".equals(fieldName)) { - orderField = field; + orderField = coatingField; return true; } else if ("page".equals(fieldName)) { - pageField = field; + pageField = coatingField; return true; } else if ("limit".equals(fieldName)) { - limitField = field; + limitField = coatingField; return true; } return false; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/PropertyDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java similarity index 70% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/PropertyDef.java rename to dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java index c539613ed6e3c9e967d8b5bb64117459eaf8b256..220a49c03cdd7151f35821c849294f7d8c571249 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/PropertyDef.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java @@ -18,7 +18,7 @@ package com.gitee.dorive.coating.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.coating.annotation.Property; +import com.gitee.dorive.coating.annotation.Criterion; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -31,23 +31,23 @@ import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor -public class PropertyDef { +public class CriterionDef { private String belongTo; private String field; private String operator; private boolean ignore; - public static PropertyDef fromElement(Field field) { - if (field.isAnnotationPresent(Property.class)) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(field, Property.class); - PropertyDef propertyDef = BeanUtil.copyProperties(attributes, PropertyDef.class); - if (StringUtils.isBlank(propertyDef.getField())) { - propertyDef.setField(field.getName()); + public static CriterionDef fromField(Field field) { + if (field.isAnnotationPresent(Criterion.class)) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(field, Criterion.class); + CriterionDef criterionDef = BeanUtil.copyProperties(attributes, CriterionDef.class); + if (StringUtils.isBlank(criterionDef.getField())) { + criterionDef.setField(field.getName()); } - return propertyDef; + return criterionDef; } - return new PropertyDef("/", field.getName(), "=", false); + return new CriterionDef("/", field.getName(), "=", false); } } diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingDef.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java similarity index 73% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingDef.java rename to dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java index d710955c9303c310d94c6cac931a81c6eb3a4461..c764018641f1923b351a45fac0d79b881cba53f6 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingDef.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java @@ -18,17 +18,17 @@ package com.gitee.dorive.coating.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.coating.annotation.Coating; +import com.gitee.dorive.coating.annotation.Example; import org.springframework.core.annotation.AnnotatedElementUtils; import java.lang.reflect.AnnotatedElement; import java.util.Map; -public class CoatingDef { +public class ExampleDef { - public static CoatingDef fromElement(AnnotatedElement annotatedElement) { - Map annotationAttributes = AnnotatedElementUtils.getMergedAnnotationAttributes(annotatedElement, Coating.class); - return BeanUtil.copyProperties(annotationAttributes, CoatingDef.class); + public static ExampleDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Example.class); + return BeanUtil.copyProperties(attributes, ExampleDef.class); } } 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 e19f6ff46410e3d73cd2467a36d1697d80756f4f..a8bf57e787b377a126fb85fcc4d882f05240956d 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 @@ -108,22 +108,23 @@ public class DefaultExampleBuilder implements ExampleBuilder { List entities = Collections.emptyList(); if (!example.isEmptyQuery() && example.isDirtyQuery()) { - example.select(new ArrayList<>(binderResolver.getBoundFields())); + example.select(binderResolver.getSelfFields()); entities = executedRepository.selectByExample(context, example); } - List finalEntities = entities; - mergedBindersMap.forEach((relativeAccessPath, binders) -> { + for (Map.Entry> entry : mergedBindersMap.entrySet()) { + String relativeAccessPath = entry.getKey(); + List binders = entry.getValue(); RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); if (targetRepoExample != null) { Example targetExample = targetRepoExample.getExample(); - if (finalEntities.isEmpty()) { + if (entities.isEmpty()) { targetExample.setEmptyQuery(true); return; } if (binders.size() == 1) { PropertyBinder binder = binders.get(0); - List fieldValues = binder.collectFieldValues(context, finalEntities); + List fieldValues = binder.collectFieldValues(context, entities); if (!fieldValues.isEmpty()) { String boundName = binder.getBoundName(); if (fieldValues.size() == 1) { @@ -136,9 +137,9 @@ public class DefaultExampleBuilder implements ExampleBuilder { } } else { - List properties = binders.stream().map(PropertyBinder::getBoundName).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(finalEntities.size(), properties); - collectFieldValues(context, finalEntities, binders, builder); + List aliases = binders.stream().map(PropertyBinder::getBindAlias).collect(Collectors.toList()); + MultiInBuilder builder = new MultiInBuilder(entities.size(), aliases); + collectFieldValues(context, entities, binders, builder); if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.build()); } else { @@ -146,7 +147,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { } } } - }); + } }); } 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 692897546dbeb7f2912bdc764f4bb88ccd93797b..3771d7645206fb3cb8228cfbc11a036f25e8c5de 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 @@ -19,13 +19,13 @@ 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.Coating; +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.CoatingDef; -import com.gitee.dorive.coating.entity.def.PropertyDef; +import com.gitee.dorive.coating.entity.def.ExampleDef; +import com.gitee.dorive.coating.entity.def.CriterionDef; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.coating.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; @@ -70,8 +70,8 @@ public class CoatingTypeResolver { } for (Class coatingClass : classes) { - Coating coatingAnnotation = AnnotationUtils.getAnnotation(coatingClass, Coating.class); - if (coatingAnnotation == null) { + Example exampleAnnotation = AnnotationUtils.getAnnotation(coatingClass, Example.class); + if (exampleAnnotation == null) { continue; } String simpleName = coatingClass.getSimpleName(); @@ -79,57 +79,58 @@ public class CoatingTypeResolver { continue; } - CoatingDef coatingDef = CoatingDef.fromElement(coatingClass); - List fields = new ArrayList<>(); + ExampleDef exampleDef = ExampleDef.fromElement(coatingClass); + List coatingFields = new ArrayList<>(); SpecificFields specificFields = new SpecificFields(); ReflectionUtils.doWithLocalFields(coatingClass, declaredField -> { - CoatingField field = new CoatingField(declaredField); - if (field.isIgnore()) { + CoatingField coatingField = new CoatingField(declaredField); + if (coatingField.isIgnore()) { return; } - if (specificFields.addProperty(field)) { + if (specificFields.addProperty(coatingField)) { return; } - fields.add(field); + coatingFields.add(coatingField); }); - List mergedRepositories = collectRepositories(fields); + List mergedRepositories = matchMergedRepositories(coatingFields); List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - CoatingType coatingType = new CoatingType(coatingDef, fields, specificFields, mergedRepositories, reversedMergedRepositories); + CoatingType coatingType = new CoatingType(exampleDef, coatingFields, specificFields, mergedRepositories, reversedMergedRepositories); classCoatingTypeMap.put(coatingClass, coatingType); nameCoatingTypeMap.put(coatingClass.getName(), coatingType); } } } - private List collectRepositories(List fields) { + private List matchMergedRepositories(List coatingFields) { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); Map nameMergedRepositoryMap = mergedRepositoryResolver.getNameMergedRepositoryMap(); Set mergedRepositorySet = new LinkedHashSet<>(); - for (CoatingField field : fields) { - PropertyDef propertyDef = field.getPropertyDef(); - String belongTo = propertyDef.getBelongTo(); + for (CoatingField coatingField : coatingFields) { + CriterionDef criterionDef = coatingField.getCriterionDef(); + String belongTo = criterionDef.getBelongTo(); if (!belongTo.startsWith("/")) { MergedRepository mergedRepository = nameMergedRepositoryMap.get(belongTo); Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); belongTo = mergedRepository.getAbsoluteAccessPath(); + criterionDef.setBelongTo(belongTo); } MergedRepository mergedRepository = mergedRepositoryMap.get(belongTo); Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); - String fieldName = propertyDef.getField(); + String fieldName = criterionDef.getField(); CommonRepository repository = mergedRepository.getExecutedRepository(); EntityEle entityEle = repository.getEntityEle(); - Map aliasMap = entityEle.getAliasMap(); - Assert.isTrue(aliasMap.containsKey(fieldName), "The field does not exist within the entity! element: {}, field: {}", + Map propAliasMap = entityEle.getPropAliasMap(); + Assert.isTrue(propAliasMap.containsKey(fieldName), "The field does not exist within the entity! element: {}, field: {}", entityEle.getElement(), fieldName); mergedRepositorySet.add(mergedRepository); @@ -143,7 +144,7 @@ public class CoatingTypeResolver { } List mergedRepositories = new ArrayList<>(mergedRepositorySet); - mergedRepositories.sort(Comparator.comparing(MergedRepository::getSequence)); + mergedRepositories.sort(Comparator.comparing(MergedRepository::getOrder)); return mergedRepositories; } 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 d1c411180bf276be39d5f919c6b9f52ceec32e31..f7f8e679d3868caf1fc1f6fc08af6034c353f497 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 @@ -55,14 +55,7 @@ public class MergedRepositoryResolver { getMergedBindersMap("", rootRepository), rootRepository, 1); - - mergedRepositoryMap.put("/", mergedRepository); - - String name = mergedRepository.getName(); - if (StringUtils.isNotBlank(name)) { - nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); - } - + addMergedRepository(mergedRepository); resolve(new ArrayList<>(), repository); } @@ -87,13 +80,7 @@ public class MergedRepositoryResolver { getMergedBindersMap(lastAccessPath, repository), rootRepository, mergedRepositoryMap.size() + 1); - - mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); - - String name = mergedRepository.getName(); - if (StringUtils.isNotBlank(name)) { - nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); - } + addMergedRepository(mergedRepository); List newMultiAccessPath = new ArrayList<>(multiAccessPath); newMultiAccessPath.add(accessPath); @@ -109,24 +96,27 @@ public class MergedRepositoryResolver { getMergedBindersMap(lastAccessPath, repository), repository, mergedRepositoryMap.size() + 1); - - mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); - - String name = mergedRepository.getName(); - if (StringUtils.isNotBlank(name)) { - nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); - } + addMergedRepository(mergedRepository); } } } + 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(); Map> mergedBindersMap = new LinkedHashMap<>(); for (PropertyBinder propertyBinder : propertyBinders) { String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); - List existPropertyBinders = mergedBindersMap.computeIfAbsent(relativeAccessPath, key -> new ArrayList<>()); + List existPropertyBinders = mergedBindersMap.computeIfAbsent(relativeAccessPath, key -> new ArrayList<>(4)); existPropertyBinders.add(propertyBinder); } return mergedBindersMap; 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 e99685e1ab18e805070bae6a468acb5f8990f01c..4701151283d4feb539089cfd0db2d126dd3fa944 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 @@ -35,6 +35,7 @@ import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -42,7 +43,6 @@ import java.util.Map; @EqualsAndHashCode(callSuper = false) public abstract class AbstractCoatingRepository extends AbstractEventRepository implements ExampleBuilder, CoatingRepository { - private String querier; private String[] scanPackages; private String regex; private MergedRepositoryResolver mergedRepositoryResolver; @@ -55,14 +55,11 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); CoatingScan coatingScan = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), CoatingScan.class); if (repository != null && coatingScan != null) { - this.querier = repository.querier(); this.scanPackages = coatingScan.value(); this.regex = StringUtils.isBlank(coatingScan.regex()) ? "^" + getEntityClass().getSimpleName() + ".*" : coatingScan.regex(); this.mergedRepositoryResolver = new MergedRepositoryResolver(this); this.coatingTypeResolver = new CoatingTypeResolver(this); - if ("default".equals(querier)) { - this.exampleBuilder = new DefaultExampleBuilder(this); - } + this.exampleBuilder = new DefaultExampleBuilder(this); } } @@ -81,6 +78,9 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo @Override public List selectByCoating(Context context, Object coating) { Example example = buildExample(context, coating); + if (example.isEmptyQuery()) { + return Collections.emptyList(); + } if (example.isCountQueried()) { example.setPage(null); } @@ -91,6 +91,9 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo @SuppressWarnings("unchecked") public Page selectPageByCoating(Context context, Object coating) { Example example = buildExample(context, coating); + if (example.isEmptyQuery()) { + return (Page) example.getPage(); + } if (example.isCountQueried()) { Page page = example.getPage(); example.setPage(null); diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 5281a044cce81992f4467946d5cc69a7814f6e77..19353ff2cb81c5875b0239346180461a3dc494af 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/Binder.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/common/Binder.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java index 8bd4250f18e941470ff28c744696ed8468f20b19..116e6fcd0968d94e0651932f79e14b436b5e8e36 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/Binder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.common; +package com.gitee.dorive.core.api.binder; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/Processor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/common/Processor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java index 0400b4d4578add23b00fb4af07a893c2b639c468..c54ff8168ff05e25e6d40421f91f4dc4a74f9cad 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/Processor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.common; +package com.gitee.dorive.core.api.binder; import com.gitee.dorive.core.api.context.Context; 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 0442bbc44b12dc832deaaf35ba5760878125ce8d..e1f3faf8e07a2375f9f4afef1a1ad4fc91c758d0 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 @@ -17,11 +17,16 @@ package com.gitee.dorive.core.api.context; +import com.gitee.dorive.core.impl.selector.AllSelector; +import com.gitee.dorive.core.impl.selector.RootSelector; import com.gitee.dorive.core.repository.CommonRepository; import java.util.List; -public interface Selector extends Context { +public interface Selector { + + Selector ALL = new AllSelector(); + Selector ROOT = new RootSelector(); boolean matches(Context context, CommonRepository repository); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/EntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/common/EntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java index b0469e413da035464df22f5566d69080a7c5f14b..789cc202d5965b269bbb59ea72f46a4742b203ab 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/common/EntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.common; +package com.gitee.dorive.core.api.executor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityHandler.java index b9527affaae93d8821dc6335058713845890412d..b2f87bedbec7af1f4106a3693a3c73b00df5184e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityHandler.java @@ -23,6 +23,6 @@ import java.util.List; public interface EntityHandler { - int handle(Context context, List entities); + long handle(Context context, List entities); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java index b8c6d66b0d5e8e7ae71a2ce920610f8b249799f1..8ec59a6b75e81d17b4bca634f1b2e4f8435bc076 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java @@ -26,7 +26,7 @@ public interface Executor { Result executeQuery(Context context, Query query); - long executeCountQuery(Context context, Query query); + long executeCount(Context context, Query query); int execute(Context context, Operation operation); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java index 5d553011f0e18b19192b7bee643a655aa804bb16..711fa84d81b44937fe258045bcc59026b7813825 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java @@ -65,7 +65,7 @@ public interface Repository { * @param example 条件 * @return 计数 */ - long selectCountByExample(Context context, Example example); + long selectCount(Context context, Example example); /** * 插入一个实体 diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/config/DoriveCoreConfiguration.java b/dorive-core/src/main/java/com/gitee/dorive/core/config/DoriveCoreConfiguration.java index 0849f4503d6ef68920ae4f7b995ded85465ac587..0e40d40774d4cc9cc09288046216b6ff80dfa84f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/config/DoriveCoreConfiguration.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/config/DoriveCoreConfiguration.java @@ -25,13 +25,8 @@ import org.springframework.core.annotation.Order; @Configuration public class DoriveCoreConfiguration { - @Bean("repositoryDefinitionV3") - public static RepositoryDefinition repositoryDefinition() { - return new RepositoryDefinition(); - } - @Bean("repositoryContextV3") - public RepositoryContext repositoryContext() { + public static RepositoryContext repositoryContext() { return new RepositoryContext(); } 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 ef52545faa69af4cc0f27d95bbbfd163970e51a3..c107945cb34205681d9f5cc3ad768e683afe3045 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 @@ -17,38 +17,41 @@ package com.gitee.dorive.core.config; +import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.repository.AbstractContextRepository; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.core.ResolvableType; +import java.lang.reflect.Type; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class RepositoryContext implements ApplicationContextAware, InitializingBean { +public class RepositoryContext implements BeanFactoryPostProcessor { - private ApplicationContext applicationContext; - - private static final Map, AbstractContextRepository> CLASS_REPOSITORY_MAP = new ConcurrentHashMap<>(); - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } + private static final Map, Class> ENTITY_REPOSITORY_MAP = new ConcurrentHashMap<>(); @Override - @SuppressWarnings("rawtypes") - public void afterPropertiesSet() { - Map beansOfType = applicationContext.getBeansOfType(AbstractContextRepository.class); - for (AbstractContextRepository repository : beansOfType.values()) { - CLASS_REPOSITORY_MAP.put(repository.getEntityClass(), repository); + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + String[] beanNames = beanFactory.getBeanDefinitionNames(); + for (String beanName : beanNames) { + BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); + ResolvableType resolvableType = beanDefinition.getResolvableType(); + Type type = resolvableType.getType(); + if (type instanceof Class) { + Class clazz = (Class) type; + if (AbstractContextRepository.class.isAssignableFrom(clazz)) { + Class entityClass = ReflectUtils.getFirstArgumentType(clazz); + ENTITY_REPOSITORY_MAP.put(entityClass, clazz); + } + } } } - @SuppressWarnings("unchecked") - public static , E> R getRepository(Class entityClass) { - return (R) CLASS_REPOSITORY_MAP.get(entityClass); + public static Class findTypeByEntity(Class entityClass) { + return ENTITY_REPOSITORY_MAP.get(entityClass); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryDefinition.java b/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryDefinition.java deleted file mode 100644 index c72f435f97731dc228ed8718842c45489e1717cd..0000000000000000000000000000000000000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/config/RepositoryDefinition.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.config; - -import com.gitee.dorive.api.util.ReflectUtils; -import com.gitee.dorive.core.repository.AbstractContextRepository; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.core.ResolvableType; - -import java.lang.reflect.Type; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class RepositoryDefinition implements BeanFactoryPostProcessor { - - private static final Map, Class> ENTITY_REPOSITORY_MAP = new ConcurrentHashMap<>(); - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - String[] beanNames = beanFactory.getBeanDefinitionNames(); - for (String beanName : beanNames) { - BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); - ResolvableType resolvableType = beanDefinition.getResolvableType(); - Type type = resolvableType.getType(); - if (type instanceof Class) { - Class clazz = (Class) type; - if (AbstractContextRepository.class.isAssignableFrom(clazz)) { - Class entityClass = ReflectUtils.getFirstArgumentType(clazz); - ENTITY_REPOSITORY_MAP.put(entityClass, clazz); - } - } - } - } - - public static Class findRepositoryType(Class entityClass) { - return ENTITY_REPOSITORY_MAP.get(entityClass); - } - -} 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 97ba0772f19132df492e485cb516b946c93154bf..392bd82994bed3047074d4b71e6a57be06f7aea1 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,7 +19,7 @@ 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.NameSelector; +import com.gitee.dorive.core.impl.selector.EmptySelector; import lombok.Data; import lombok.NoArgsConstructor; @@ -31,7 +31,7 @@ import java.util.concurrent.ConcurrentHashMap; @NoArgsConstructor public abstract class AbstractContext implements Context { - private Selector selector = NameSelector.EMPTY_SELECTOR; + private Selector selector = EmptySelector.EMPTY_SELECTOR; private Map attachments = Collections.emptyMap(); public AbstractContext(Selector selector) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java index b335f818eb3e4f04e42e27b224b9eb5bdd8d7182..1bf01dbe852da096b0ccb60fa1beb7a1ea999e4f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java @@ -30,15 +30,15 @@ import java.util.List; public class MultiInBuilder { private int size; - private List properties; + private List aliases; private int step; private List values; private int cursor; - public MultiInBuilder(int size, List properties) { + public MultiInBuilder(int size, List aliases) { this.size = size; - this.properties = properties; - this.step = properties.size(); + this.aliases = aliases; + this.step = aliases.size(); this.values = new ArrayList<>(size * step); this.cursor = 0; } @@ -69,8 +69,8 @@ public class MultiInBuilder { } public Criterion build() { - String propStr = StrUtil.join(",", properties); - return new Criterion(propStr, Operator.MULTI_IN, this); + String aliasesStr = StrUtil.join(",", aliases); + return new Criterion(aliasesStr, Operator.MULTI_IN, this); } } 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 db9cd20046be20c1aca050fbff9d417172e96774..38c1c43ab4cc582abb1626bf2e44d3e7cafc7745 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 @@ -19,8 +19,8 @@ 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.common.Binder; -import com.gitee.dorive.core.api.common.Processor; +import com.gitee.dorive.core.api.binder.Binder; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.AllArgsConstructor; import lombok.Data; 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 828a7c81f738b45fc25f14b5d09653c8339090cf..79da64a831f7bb21cbbfde0ba4f124203c71b177 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.common.Processor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.element.PropChain; 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 e3a19c193ec084b44c38c469d5c82dd9d2abc9d3..3bb6dce54fbe410b3828fc26b8c225fbfa5afc18 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.common.Processor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; @@ -57,6 +57,10 @@ public class PropertyBinder extends AbstractBinder { return getFieldPropChain().isSameType(boundPropChain); } + public boolean isCollection() { + return boundPropChain.getEntityField().isCollection(); + } + @Override public Object getBoundValue(Context context, Object rootEntity) { return boundPropChain.getValue(rootEntity); 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/ChainExecutor.java index 15ec0aeeb45abfff9149f4df104a0e75f1964ebb..1da151c3085e14e911c0314b1f9c12a3391f9745 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/ChainExecutor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; -import com.gitee.dorive.core.api.common.Binder; +import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; @@ -28,7 +28,7 @@ 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.factory.OperationFactory; -import com.gitee.dorive.core.impl.resolver.DelegateResolver; +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; @@ -73,12 +73,12 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { } @Override - public int handle(Context context, List entities) { + public long handle(Context context, List entities) { return entityHandler.handle(context, entities); } @Override - public long executeCountQuery(Context context, Query query) { + public long executeCount(Context context, Query query) { throw new RuntimeException("This method does not support!"); } @@ -97,8 +97,8 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { Object rootEntity = operation.getEntity(); Assert.notNull(rootEntity, "The rootEntity cannot be null!"); - DelegateResolver delegateResolver = repository.getDelegateResolver(); - AbstractContextRepository delegateRepository = delegateResolver.delegateRepository(rootEntity); + DerivedResolver derivedResolver = repository.getDerivedResolver(); + AbstractContextRepository delegateRepository = derivedResolver.deriveRepository(rootEntity); delegateRepository = delegateRepository == null ? repository : delegateRepository; Selector selector = context.getSelector(); 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 d65354f86413aef17b9f3267e032cc22739094e4..b27ceb7af11fb3b4925edcf5f314dbcf784c2332 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 @@ -21,7 +21,7 @@ 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.common.EntityFactory; +import com.gitee.dorive.core.api.executor.EntityFactory; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -37,17 +37,27 @@ public class DefaultEntityFactory implements EntityFactory { private Class pojoClass; private Map aliasFieldMapping; private Map fieldPropMapping; + private CopyOptions reCopyOptions; + private CopyOptions deCopyOptions; + + public void setAliasFieldMapping(Map aliasFieldMapping) { + this.aliasFieldMapping = aliasFieldMapping; + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(aliasFieldMapping); + } + + public void setFieldPropMapping(Map fieldPropMapping) { + this.fieldPropMapping = fieldPropMapping; + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(fieldPropMapping); + } @Override public Object reconstitute(Context context, Object persistent) { - CopyOptions copyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(aliasFieldMapping); - return BeanUtil.toBean(persistent, entityEle.getGenericType(), copyOptions); + return BeanUtil.toBean(persistent, entityEle.getGenericType(), reCopyOptions); } @Override public Object deconstruct(Context context, Object entity) { - CopyOptions copyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(fieldPropMapping); - return BeanUtil.toBean(entity, pojoClass, copyOptions); + return BeanUtil.toBean(entity, pojoClass, deCopyOptions); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java index 78cc2f93ba700123edd55f2af24e3b45c764bd28..618241e4867b342e951ef270faa98442757a2f04 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java @@ -17,10 +17,10 @@ package com.gitee.dorive.core.impl.handler; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.impl.resolver.DelegateResolver; +import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.Data; @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; @Data public class AdaptiveEntityHandler implements EntityHandler { @@ -42,42 +41,41 @@ public class AdaptiveEntityHandler implements EntityHandler { } @Override - public int handle(Context context, List rootEntities) { - List newRootEntities = new ArrayList<>(rootEntities.size()); - - int delegateCount = repository.getDelegateResolver().getDelegateCount(); - Map, List> repositoryEntitiesMap = new LinkedHashMap<>(delegateCount * 4 / 3 + 1); - - filterRootEntities(rootEntities, newRootEntities, repositoryEntitiesMap); - - AtomicInteger totalCount = new AtomicInteger(); + public long handle(Context context, List entities) { + List newEntities = new ArrayList<>(entities.size()); + Map, List> repositoryEntitiesMap = distribute(entities, newEntities); - if (!newRootEntities.isEmpty()) { - totalCount.addAndGet(entityHandler.handle(context, newRootEntities)); + long totalCount = 0L; + if (!newEntities.isEmpty()) { + totalCount += (entityHandler.handle(context, newEntities)); } - - repositoryEntitiesMap.forEach((repository, entities) -> { + for (Map.Entry, List> entry : repositoryEntitiesMap.entrySet()) { + AbstractContextRepository repository = entry.getKey(); + List subclassEntities = entry.getValue(); Executor executor = repository.getExecutor(); if (executor instanceof EntityHandler) { - totalCount.addAndGet(((EntityHandler) executor).handle(context, entities)); + totalCount += (((EntityHandler) executor).handle(context, subclassEntities)); } - }); - - return totalCount.get(); + } + return totalCount; } - private void filterRootEntities(List rootEntities, List newRootEntities, - Map, List> repositoryEntitiesMap) { - DelegateResolver delegateResolver = repository.getDelegateResolver(); - for (Object rootEntity : rootEntities) { - AbstractContextRepository repository = delegateResolver.delegateRepository(rootEntity); + private Map, List> distribute(List entities, List newEntities) { + DerivedResolver derivedResolver = repository.getDerivedResolver(); + int numberOf = derivedResolver.numberOf(); + Map, List> repositoryEntitiesMap = new LinkedHashMap<>(numberOf * 4 / 3 + 1); + + for (Object entity : entities) { + AbstractContextRepository repository = derivedResolver.deriveRepository(entity); if (repository == null) { - newRootEntities.add(rootEntity); + newEntities.add(entity); } else { - List existRootEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(rootEntities.size())); - existRootEntities.add(rootEntity); + List existEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(entities.size())); + existEntities.add(entity); } } + + return repositoryEntitiesMap; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index 2bb821aac3d9ccd3be7274d20bb35b836ee594f9..dcf74e94a671a2109754c9791423a6377fbb1156 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -20,7 +20,6 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -28,7 +27,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import java.util.List; -import java.util.Map; @Data @AllArgsConstructor @@ -37,27 +35,18 @@ public class BatchEntityHandler implements EntityHandler { private final AbstractContextRepository repository; @Override - public int handle(Context context, List entities) { + public long handle(Context context, List entities) { Selector selector = context.getSelector(); - int totalCount = 0; + long totalCount = 0L; for (CommonRepository repository : this.repository.getSubRepositories()) { if (selector.matches(context, repository)) { - if (isMultiQuery(repository)) { - EntityHandler entityHandler = new MultiEntityHandler(repository); - totalCount += entityHandler.handle(context, entities); - } else { - EntityHandler entityHandler = new UnionEntityHandler(repository); - totalCount += entityHandler.handle(context, entities); - } + BinderResolver binderResolver = repository.getBinderResolver(); + EntityHandler entityHandler = binderResolver.isSimpleRootBinding() ? + new MultiEntityHandler(repository) : new UnionEntityHandler(repository); + totalCount += entityHandler.handle(context, entities); } } return totalCount; } - private boolean isMultiQuery(CommonRepository repository) { - BinderResolver binderResolver = repository.getBinderResolver(); - Map> mergedBindersMap = binderResolver.getMergedBindersMap(); - return mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/"); - } - } 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 79dcfaf26979121fc0ae21f923447aa0a5711089..018a324145e3cfec287f84ee187aed124f9c1cf5 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 @@ -49,7 +49,7 @@ public class MultiEntityHandler implements EntityHandler { private final CommonRepository repository; @Override - public int handle(Context context, List entities) { + 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()) { @@ -60,9 +60,9 @@ public class MultiEntityHandler implements EntityHandler { if (result instanceof MultiResult) { setValueForRootEntities(context, entities, entityIndex, (MultiResult) result); } - return (int) result.getCount(); + return result.getCount(); } - return 0; + return 0L; } private Example newExample(Context context, List entities, Map entityIndex) { @@ -84,8 +84,8 @@ public class MultiEntityHandler implements EntityHandler { } } else { - List properties = binders.stream().map(AbstractBinder::getFieldName).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(entities.size(), properties); + List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); + MultiInBuilder builder = new MultiInBuilder(entities.size(), aliases); collectBoundValues(context, entities, entityIndex, binders, builder); if (!builder.isEmpty()) { example.getCriteria().add(builder.build()); @@ -105,7 +105,7 @@ public class MultiEntityHandler implements EntityHandler { return example; } - public List collectBoundValues(Context context, List entities, Map entityIndex, PropertyBinder binder) { + private List collectBoundValues(Context context, List entities, Map entityIndex, PropertyBinder binder) { List boundValues = new ArrayList<>(entities.size()); for (Object entity : entities) { Object boundValue = binder.getBoundValue(context, entity); @@ -216,7 +216,7 @@ public class MultiEntityHandler implements EntityHandler { } @SuppressWarnings("unchecked") - public void setValueForRootEntity(boolean isCollection, PropChain anchorPoint, int averageSize, Object rootEntity, Object entity) { + private void setValueForRootEntity(boolean isCollection, PropChain anchorPoint, int averageSize, Object rootEntity, Object entity) { if (rootEntity != null) { Object value = anchorPoint.getValue(rootEntity); if (isCollection) { 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 dd805969ae9ed1adf3aea162050144cb4e3ff9da..2826ed42dbf75fd02022efa098dc940fa1bcec58 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 @@ -47,7 +47,7 @@ public class UnionEntityHandler implements EntityHandler { private final CommonRepository repository; @Override - public int handle(Context context, List entities) { + public long handle(Context context, List entities) { Example example = newExample(context, entities); if (example.isDirtyQuery()) { OperationFactory operationFactory = repository.getOperationFactory(); @@ -57,9 +57,9 @@ public class UnionEntityHandler implements EntityHandler { if (result instanceof MultiResult) { setValueForRootEntities(entities, (MultiResult) result); } - return (int) result.getCount(); + return result.getCount(); } - return 0; + return 0L; } private Example newExample(Context context, List entities) { @@ -80,7 +80,7 @@ public class UnionEntityHandler implements EntityHandler { return unionExample; } - public Example newExample(Context context, Object entity) { + private Example newExample(Context context, Object entity) { BinderResolver binderResolver = repository.getBinderResolver(); Example example = new Example(); for (PropertyBinder binder : binderResolver.getPropertyBinders()) { 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/DefaultProcessor.java index f9289291654998be805d9368f9dd212196c69a05..69d1381ad826a6d09550955489af7a90cf87c63b 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/DefaultProcessor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.processor; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.core.api.common.Processor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Data; import lombok.NoArgsConstructor; 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 8704d03129084b68d59440cfe4ddbd5bec8bbb61..b9b96b5d5998af01e286f9d94a086b86acd80713 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 @@ -18,15 +18,16 @@ package com.gitee.dorive.core.impl.resolver; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; 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.api.util.ReflectUtils; -import com.gitee.dorive.core.api.common.Binder; -import com.gitee.dorive.core.api.common.Processor; +import com.gitee.dorive.core.api.binder.Binder; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.processor.DefaultProcessor; @@ -39,6 +40,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -52,7 +54,8 @@ public class BinderResolver { private List allBinders; private List propertyBinders; private Map> mergedBindersMap; - private List boundFields; + private boolean simpleRootBinding; + private List selfFields; private List contextBinders; private List boundValueBinders; private PropertyBinder boundIdBinder; @@ -69,7 +72,8 @@ public class BinderResolver { allBinders = new ArrayList<>(bindingDefs.size()); propertyBinders = new ArrayList<>(bindingDefs.size()); mergedBindersMap = new LinkedHashMap<>(bindingDefs.size() * 4 / 3 + 1); - boundFields = new ArrayList<>(bindingDefs.size()); + simpleRootBinding = false; + selfFields = new ArrayList<>(bindingDefs.size()); contextBinders = new ArrayList<>(bindingDefs.size()); boundValueBinders = new ArrayList<>(bindingDefs.size()); boundIdBinder = null; @@ -81,7 +85,8 @@ public class BinderResolver { String alias = entityEle.toAlias(field); PropChain fieldPropChain = propChainMap.get("/" + field); - Assert.notNull(fieldPropChain, "The field of @Binding may be wrong! type: {}, field: {}", entityEle.getGenericType().getName(), field); + Assert.notNull(fieldPropChain, "The field configured for @Binding does not exist within the entity! type: {}, field: {}", + entityEle.getGenericType().getName(), field); fieldPropChain.newPropProxy(); Processor processor = newProcessor(bindingDef); @@ -94,8 +99,8 @@ public class BinderResolver { String belongAccessPath = propertyBinder.getBelongAccessPath(); List propertyBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); propertyBinders.add(propertyBinder); - - boundFields.add(bindingDef.getField()); + + selfFields.add(bindingDef.getField()); if (propertyBinder.isSameType()) { if (!"id".equals(field)) { @@ -115,6 +120,11 @@ public class BinderResolver { boundValueBinders.add(contextBinder); } } + + if (mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/")) { + simpleRootBinding = CollUtil.findOne(mergedBindersMap.get("/"), PropertyBinder::isCollection) == null; + } + selfFields = Collections.unmodifiableList(selfFields); } private BindingDef renewBindingDef(String accessPath, BindingDef bindingDef) { @@ -144,7 +154,7 @@ public class BinderResolver { processor = (Processor) applicationContext.getBean(beanNamesForType[0]); } if (processor == null) { - processor = (Processor) ReflectUtils.newInstance(processorClass); + processor = (Processor) ReflectUtil.newInstance(processorClass); } } if (processor instanceof DefaultProcessor) { @@ -173,8 +183,8 @@ public class BinderResolver { boundPropChain.newPropProxy(); EntityEle entityEle = belongRepository.getEntityEle(); - String fieldName = StringUtils.isBlank(property) ? PathUtils.getLastName(bindExp) : property; - String bindAlias = entityEle.toAlias(fieldName); + String boundName = StringUtils.isBlank(property) ? PathUtils.getLastName(bindExp) : property; + String bindAlias = entityEle.toAlias(boundName); return new PropertyBinder(bindingDef, alias, fieldPropChain, processor, belongAccessPath, belongRepository, boundPropChain, bindAlias); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DelegateResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DelegateResolver.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java index 1d2ee8cb194685fa7c462cbd8467efe410dedb12..95cce01c586518387fac26c0739fd82f4ff40ad3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DelegateResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java @@ -26,12 +26,12 @@ import java.util.LinkedHashMap; import java.util.Map; @Data -public class DelegateResolver { +public class DerivedResolver { private AbstractContextRepository repository; - private Map, AbstractContextRepository> delegateRepositoryMap = new LinkedHashMap<>(3 * 4 / 3 + 1); + private Map, AbstractContextRepository> derivedRepositoryMap = new LinkedHashMap<>(3 * 4 / 3 + 1); - public DelegateResolver(AbstractContextRepository repository) { + public DerivedResolver(AbstractContextRepository repository) { this.repository = repository; resolve(); } @@ -45,22 +45,22 @@ public class DelegateResolver { AbstractContextRepository abstractContextRepository = (AbstractContextRepository) beanInstance; Class fieldEntityClass = abstractContextRepository.getEntityClass(); if (repository.getEntityClass().isAssignableFrom(fieldEntityClass)) { - delegateRepositoryMap.put(fieldEntityClass, abstractContextRepository); + derivedRepositoryMap.put(fieldEntityClass, abstractContextRepository); } } }); } - public boolean isDelegated() { - return !delegateRepositoryMap.isEmpty(); + public boolean isDerived() { + return !derivedRepositoryMap.isEmpty(); } - public int getDelegateCount() { - return delegateRepositoryMap.size(); + public int numberOf() { + return derivedRepositoryMap.size(); } - public AbstractContextRepository delegateRepository(Object rootEntity) { - return delegateRepositoryMap.get(rootEntity.getClass()); + public AbstractContextRepository deriveRepository(Object entity) { + return derivedRepositoryMap.get(entity.getClass()); } } 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 48c628fc3bd08feb520e2f9af76a21347344986b..c08e8159c9ca820e2a09b41cebd2d61823b13232 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 @@ -19,18 +19,5 @@ package com.gitee.dorive.core.impl.selector; import com.gitee.dorive.core.api.context.Selector; -import java.util.Map; - public abstract class AbstractSelector implements Selector { - - @Override - public Selector getSelector() { - throw new RuntimeException("The method is not supported!"); - } - - @Override - public Map getAttachments() { - throw new RuntimeException("The method is not supported!"); - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/constant/Select.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java similarity index 58% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/constant/Select.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java index 2daf51e7742a64151006aa024ac00ac415ef37dc..b77705f83725711bb255dd2a217e44917cc4f15d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/constant/Select.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java @@ -15,13 +15,27 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.constant; +package com.gitee.dorive.core.impl.selector; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.impl.selector.NameSelector; -import com.gitee.dorive.core.impl.selector.RootSelector; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.repository.CommonRepository; +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) { + return true; + } + + @Override + public List select(Context context, CommonRepository repository) { + return null; + } -public interface Select { - Selector ALL = new NameSelector("*"); - Selector ROOT = new RootSelector(); } 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 new file mode 100644 index 0000000000000000000000000000000000000000..8c1fd48f72f0be756b33dcef12952218d0339398 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.selector; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.repository.CommonRepository; +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) { + 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 3848ee7424d770c4667a468f9039754af746e606..23ace0dba079b5ba06ff3a1d0c0c40ac2196aae6 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,8 +18,8 @@ package com.gitee.dorive.core.impl.selector; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.repository.CommonRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -35,27 +35,20 @@ import java.util.Map; @EqualsAndHashCode(callSuper = false) public class NameSelector extends AbstractSelector { - public static final NameSelector EMPTY_SELECTOR = new NameSelector(); - - private boolean wildcard; private Map nameDefMap = Collections.emptyMap(); public NameSelector(String... names) { if (names != null && names.length > 0) { this.nameDefMap = new LinkedHashMap<>(names.length * 4 / 3 + 1); for (String name : names) { - if ("*".equals(name)) { - this.wildcard = true; - } else { - if (name.contains("(") && name.contains(")")) { - String realName = name.substring(0, name.indexOf("(")); - String propertiesText = name.substring(name.indexOf("(") + 1, name.indexOf(")")); - List properties = StrUtil.splitTrim(propertiesText, ","); - nameDefMap.put(realName, new NameDef(realName, properties)); + if (name.contains("(") && name.contains(")")) { + String realName = name.substring(0, name.indexOf("(")); + String propText = name.substring(name.indexOf("(") + 1, name.indexOf(")")); + List properties = StrUtil.splitTrim(propText, ","); + nameDefMap.put(realName, new NameDef(realName, Collections.unmodifiableList(properties))); - } else { - nameDefMap.put(name, new NameDef(name, Collections.emptyList())); - } + } else { + nameDefMap.put(name, new NameDef(name, Collections.emptyList())); } } } @@ -63,9 +56,6 @@ public class NameSelector extends AbstractSelector { @Override public boolean matches(Context context, CommonRepository repository) { - if (wildcard) { - return true; - } EntityDef entityDef = repository.getEntityDef(); String name = entityDef.getName(); return StringUtils.isBlank(name) || nameDefMap.containsKey(name); 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 3261c5163ff593db61d9eaae6d4a9be2d9ccf180..cdcf6deae7a93a277ac3ccaedefc4d48d8d8a910 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 @@ -29,14 +29,14 @@ import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.config.RepositoryDefinition; +import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.executor.ChainExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.impl.resolver.DelegateResolver; +import com.gitee.dorive.core.impl.resolver.DerivedResolver; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; @@ -59,7 +59,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor private ApplicationContext applicationContext; private PropChainResolver propChainResolver; - private DelegateResolver delegateResolver; + private DerivedResolver derivedResolver; private Map repositoryMap = new LinkedHashMap<>(); private CommonRepository rootRepository; @@ -107,8 +107,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityDef entityDef = renewEntityDef(entityEle); OperationFactory operationFactory = new OperationFactory(entityEle); - AbstractRepository innerRepository = doNewRepository(entityDef, entityEle, operationFactory); - AbstractRepository proxyRepository = processRepository(innerRepository); + AbstractRepository actualRepository = doNewRepository(entityDef, entityEle, operationFactory); + AbstractRepository proxyRepository = processRepository(actualRepository); boolean isRoot = "/".equals(accessPath); boolean isAggregated = entityEle.isAggregated(); @@ -125,7 +125,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setEntityEle(entityEle); repository.setOperationFactory(operationFactory); repository.setProxyRepository(proxyRepository); - repository.setAttachments(new ConcurrentHashMap<>(innerRepository.getAttachments())); + repository.setAttachments(new ConcurrentHashMap<>(actualRepository.getAttachments())); repository.setAccessPath(accessPath); repository.setRoot(isRoot); @@ -144,7 +144,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); if (!entityDef.isAggregated() && entityEle.isAggregated()) { Class entityClass = entityEle.getGenericType(); - Class repositoryClass = RepositoryDefinition.findRepositoryType(entityClass); + Class repositoryClass = RepositoryContext.findTypeByEntity(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); entityDef.setRepository(repositoryClass); } @@ -162,10 +162,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor } if (repository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) repository; - Map attachments = new ConcurrentHashMap<>(8); defaultRepository.setEntityDef(entityDef); defaultRepository.setEntityEle(entityEle); defaultRepository.setOperationFactory(operationFactory); + + Map attachments = new ConcurrentHashMap<>(8); defaultRepository.setExecutor(newExecutor(entityDef, entityEle, attachments)); defaultRepository.setAttachments(attachments); } @@ -183,15 +184,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor } private Executor newExecutor() { - delegateResolver = new DelegateResolver(this); - - EntityHandler entityHandler = new BatchEntityHandler(this); - processEntityClass(entityHandler); - - if (delegateResolver.isDelegated()) { + EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); + derivedResolver = new DerivedResolver(this); + if (derivedResolver.isDerived()) { entityHandler = new AdaptiveEntityHandler(this, entityHandler); } - return new ChainExecutor(this, entityHandler); } @@ -199,6 +196,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor protected abstract AbstractRepository processRepository(AbstractRepository repository); - protected abstract void processEntityClass(EntityHandler entityHandler); + protected abstract EntityHandler processEntityHandler(EntityHandler entityHandler); } 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 6607a0f251073ba94e24b8e8563adca67b950fee..12f011e57b3b625973d5921ffe60b1a96244de39 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 @@ -34,10 +34,10 @@ import java.util.List; public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @Override - public long selectCountByExample(Context context, Example example) { + public long selectCount(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); CommonRepository repository = getRootRepository(); - return repository.selectCountByExample(context, example); + return repository.selectCount(context, example); } @Override 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 d8e3976dad654cb309dbfff18d971ade739379cf..843cbfcf26cd3b440fa09e603b73516949cf41e1 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 @@ -79,10 +79,10 @@ public abstract class AbstractRepository implements Repository, Ex } @Override - public long selectCountByExample(Context context, Example example) { + public long selectCount(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); Query query = operationFactory.buildQuery(example); - return executeCountQuery(context, query); + return executeCount(context, query); } @Override @@ -141,8 +141,8 @@ public abstract class AbstractRepository implements Repository, Ex } @Override - public long executeCountQuery(Context context, Query query) { - return executor.executeCountQuery(context, query); + public long executeCount(Context context, Query query) { + return executor.executeCount(context, query); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 77fa43a86faa4102223a186a3257436afc742c53..761adc052f5717ce7c292df548df34ae1898df38 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 @@ -43,22 +43,6 @@ public class CommonRepository extends ProxyRepository { private BinderResolver binderResolver; private boolean boundEntity; - @Override - public int updateByExample(Context context, Object entity, Example example) { - if (example.isEmptyQuery()) { - return 0; - } - return super.updateByExample(context, entity, example); - } - - @Override - public int deleteByExample(Context context, Example example) { - if (example.isEmptyQuery()) { - return 0; - } - return super.deleteByExample(context, example); - } - @Override public Result executeQuery(Context context, Query query) { Selector selector = context.getSelector(); 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/ProxyRepository.java index 45e2e0bd10ec71d5f61b7adf4822f26305b2a824..2140546b79d7666420ea453798afbbc80f55ac38 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/ProxyRepository.java @@ -68,8 +68,8 @@ public class ProxyRepository extends AbstractRepository { } @Override - public long selectCountByExample(Context context, Example example) { - return proxyRepository.selectCountByExample(context, example); + public long selectCount(Context context, Example example) { + return proxyRepository.selectCount(context, example); } @Override @@ -112,6 +112,11 @@ public class ProxyRepository extends AbstractRepository { return proxyRepository.executeQuery(context, query); } + @Override + public long executeCount(Context context, Query query) { + return proxyRepository.executeCount(context, query); + } + @Override public int execute(Context context, Operation operation) { return proxyRepository.execute(context, operation); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java index 2a51a4f6f66fd0dfd1336b4b5eec8610502d2276..d9cb41fdcaf838f8dea6cfbbe76ed53cb378fd66 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java @@ -26,11 +26,4 @@ public class NumberUtils { return null; } - public static Long longValue(Object object) { - if (object instanceof Number) { - return ((Number) object).longValue(); - } - return null; - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java index d049a5fabb8a34625d00d902659166f14fe7dd48..c173175cf0268eee5609258bc58508cdd5f22ec6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java @@ -23,14 +23,6 @@ import java.util.Set; public class PathUtils { - public static String getPrevPath(String accessPath) { - return accessPath.lastIndexOf("/") > 0 ? accessPath.substring(0, accessPath.lastIndexOf("/")) : "/"; - } - - public static String getLastName(String accessPath) { - return accessPath.startsWith("/") && accessPath.length() > 1 ? accessPath.substring(accessPath.lastIndexOf("/") + 1) : ""; - } - public static String getAbsolutePath(String accessPath, String relativePath) { accessPath = "https://dorive" + accessPath; accessPath = URLUtil.completeUrl(accessPath, relativePath); @@ -44,4 +36,12 @@ public class PathUtils { return accessPath; } + public static String getPrevPath(String accessPath) { + return accessPath.lastIndexOf("/") > 0 ? accessPath.substring(0, accessPath.lastIndexOf("/")) : "/"; + } + + public static String getLastName(String accessPath) { + return accessPath.startsWith("/") && accessPath.length() > 1 ? accessPath.substring(accessPath.lastIndexOf("/") + 1) : ""; + } + } diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index a3458f2fabd28a6ad31d7f64b7ebf5a8985c1f53..eb7dde7827c9987fee18ce287b7e106e9609ec2d 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-event 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 ecacfd2f537ad58fba313dd7e770d561575636cb..2bb9f9ce055a9cc3c29022303f312b5cdf2907e3 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 @@ -45,8 +45,8 @@ public class EventExecutor extends AbstractExecutor { } @Override - public long executeCountQuery(Context context, Query query) { - return executor.executeCountQuery(context, query); + public long executeCount(Context context, Query query) { + return executor.executeCount(context, query); } @Override 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/RepositoryListener.java index a70ba762b0473163d7c7a63a359f73e9b6d89703..5e7d80e613d9fbb766d3ab04511e6c0569e639b0 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/RepositoryListener.java @@ -31,15 +31,15 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.AnnotationUtils; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Slf4j public class RepositoryListener implements ApplicationListener, ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; - private final Map, List> classEventListenersMap = new LinkedHashMap<>(); + private final Map, List> classEventListenersMap = new ConcurrentHashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { @@ -55,7 +55,7 @@ public class RepositoryListener implements ApplicationListener, A Listener listener = AnnotationUtils.getAnnotation(entityListener.getClass(), Listener.class); if (listener != null) { Class entityClass = listener.value(); - List existEntityListeners = classEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>()); + List existEntityListeners = classEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); existEntityListeners.add(entityListener); } } @@ -63,8 +63,8 @@ public class RepositoryListener implements ApplicationListener, A @Override public void onApplicationEvent(ExecutorEvent event) { - EventExecutor executor = (EventExecutor) event.getSource(); - EntityEle entityEle = executor.getEntityEle(); + EventExecutor eventExecutor = (EventExecutor) event.getSource(); + EntityEle entityEle = eventExecutor.getEntityEle(); Class entityClass = entityEle.getGenericType(); List entityListeners = classEventListenersMap.get(entityClass); if (entityListeners != null && !entityListeners.isEmpty()) { 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 830111fbe20534340585af19bf86805fafe59ee8..f4d345c330e4f8e1f896cefb988a6f9dcf561c0b 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 @@ -41,12 +41,12 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo @Override protected AbstractRepository processRepository(AbstractRepository repository) { if (enableEvent) { - AbstractRepository innerRepository = repository; + AbstractRepository actualRepository = repository; if (repository instanceof ProxyRepository) { - innerRepository = ((ProxyRepository) repository).getProxyRepository(); + actualRepository = ((ProxyRepository) repository).getProxyRepository(); } - if (innerRepository instanceof DefaultRepository) { - DefaultRepository defaultRepository = (DefaultRepository) innerRepository; + if (actualRepository instanceof DefaultRepository) { + DefaultRepository defaultRepository = (DefaultRepository) actualRepository; EntityEle entityEle = defaultRepository.getEntityEle(); Executor executor = defaultRepository.getExecutor(); executor = new EventExecutor(getApplicationContext(), entityEle, executor); diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index 9040115b5ea6dbb44b90155f7c8629018f5c469a..20aaf2a89cc613c7818b6f7b9c78bede68ba5faa 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-injection diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index e9210c978f30ba0e090af481c9388454f3b7009b..01c8a32013c5e6593cddec3aea5858a03cb35330 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 dorive-proxy diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 50c717315cf4787a58000dfdff65f0435e317a0c..8de9b58a5b6e1d0870ffc62ce9ace01513c9b74a 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 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 8f7173b084f2ce8f0bbc1f52ee74d2de9e0e3121..48849671370d339223dda3101f256c37dddf49c9 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 @@ -17,11 +17,9 @@ package com.gitee.dorive.ref.api; -import com.gitee.dorive.coating.api.CoatingRepository; -import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.ref.repository.AbstractRefRepository; -public interface Ref extends ListableRepository, CoatingRepository { +public interface Ref extends SimpleRepository { > R get(); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java index cc10c72c18c2d0c8b88957e85fe42687de4ed8f9..4c28909cd4850317bb859ebb23d3f73ba1f6ece2 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java @@ -18,13 +18,20 @@ package com.gitee.dorive.ref.api; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Selector; public interface RefObj { - int select(Context context); + long select(Context context); int insertOrUpdate(Context context); int delete(Context context); + long select(Selector selector); + + int insertOrUpdate(Selector selector); + + int delete(Selector selector); + } 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/SimpleRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..e5cdb9b80a6407fdd40920090dce0776dc58f11a --- /dev/null +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SimpleRepository.java @@ -0,0 +1,98 @@ +/* + * 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.ref.api; + +import com.gitee.dorive.coating.api.CoatingRepository; +import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Page; + +import java.util.List; + +public interface SimpleRepository extends CoatingRepository { + + default E selectByPrimaryKey(Selector selector, PK primaryKey) { + return selectByPrimaryKey(new InnerContext(selector), primaryKey); + } + + default List selectByExample(Selector selector, Example example) { + return selectByExample(new InnerContext(selector), example); + } + + default Page selectPageByExample(Selector selector, Example example) { + return selectPageByExample(new InnerContext(selector), example); + } + + default long selectCount(Selector selector, Example example) { + return selectCount(new InnerContext(selector), example); + } + + default int insert(Selector selector, E entity) { + return insert(new InnerContext(selector), entity); + } + + default int update(Selector selector, E entity) { + return update(new InnerContext(selector), entity); + } + + default int updateByExample(Selector selector, Object entity, Example example) { + return updateByExample(new InnerContext(selector), entity, example); + } + + default int insertOrUpdate(Selector selector, E entity) { + return insertOrUpdate(new InnerContext(selector), entity); + } + + default int delete(Selector selector, E entity) { + return delete(new InnerContext(selector), entity); + } + + default int deleteByPrimaryKey(Selector selector, PK primaryKey) { + return deleteByPrimaryKey(new InnerContext(selector), primaryKey); + } + + default int deleteByExample(Selector selector, Example example) { + return deleteByExample(new InnerContext(selector), example); + } + + default int insertList(Selector selector, List entities) { + return insertList(new InnerContext(selector), entities); + } + + default int updateList(Selector selector, List entities) { + return updateList(new InnerContext(selector), entities); + } + + default int insertOrUpdateList(Selector selector, List entities) { + return insertOrUpdateList(new InnerContext(selector), entities); + } + + default int deleteList(Selector selector, List entities) { + return deleteList(new InnerContext(selector), entities); + } + + default List selectByCoating(Selector selector, Object coating) { + return selectByCoating(new InnerContext(selector), coating); + } + + default Page selectPageByCoating(Selector selector, Object coating) { + return selectPageByCoating(new InnerContext(selector), coating); + } + +} 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 8903d4c48be85a7adad88714a0510c966e616b63..584731f343b8a2ad97774090b37cfc4bc7fe67d1 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 @@ -42,17 +42,6 @@ public class RefImpl extends ProxyRepository implements Ref { this.entityHandler = entityHandler; } - @Override - @SuppressWarnings("unchecked") - public > R get() { - return (R) repository; - } - - @Override - public RefObj forObj(Object object) { - return new RefObjImpl(this, object); - } - @Override public int insertList(Context context, List entities) { return repository.insertList(context, entities); @@ -83,4 +72,15 @@ public class RefImpl extends ProxyRepository implements Ref { return repository.selectPageByCoating(context, coating); } + @Override + @SuppressWarnings("unchecked") + public > R get() { + return (R) repository; + } + + @Override + public RefObj forObj(Object object) { + return new RefObjImpl(this, object); + } + } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefInjector.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefInjector.java index 055b71619bd8adf80da7384aa79cedd1bd21493e..f2bc4ae05174fbda0dc7259ddfa7c3fc865100da 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefInjector.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefInjector.java @@ -21,21 +21,34 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.ref.api.Ref; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import lombok.AllArgsConstructor; import lombok.Data; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @Data -@AllArgsConstructor public class RefInjector { private AbstractRefRepository repository; private EntityHandler entityHandler; private Class entityClass; - public Field getField() { + public RefInjector(AbstractRefRepository repository, EntityHandler entityHandler, Class entityClass) { + this.repository = repository; + this.entityHandler = entityHandler; + this.entityClass = entityClass; + inject(); + } + + private void inject() { + Field staticRefField = findStaticRefField(); + if (staticRefField != null) { + Ref ref = newRefImpl(); + doInject(staticRefField, ref); + } + } + + private Field findStaticRefField() { try { Field field = entityClass.getDeclaredField("ref"); return Modifier.isStatic(field.getModifiers()) ? field : null; @@ -44,9 +57,9 @@ public class RefInjector { } return null; } - + @SuppressWarnings("unchecked") - public Ref createRef() { + private Ref newRefImpl() { RefImpl refImpl = new RefImpl((AbstractRefRepository) repository, entityHandler); refImpl.setEntityDef(repository.getEntityDef()); refImpl.setEntityEle(repository.getEntityEle()); @@ -56,7 +69,7 @@ public class RefInjector { return refImpl; } - public void inject(Field field, Ref ref) { + private void doInject(Field field, Ref ref) { ReflectUtil.setFieldValue(null, field, ref); } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java index 4f94e734c8a868cd4c18fc9985e73b5c60c3a9f6..5fd2bead635c8e28dbddd49b057ea8f1a54c0455 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java @@ -36,30 +36,36 @@ public class RefObjImpl implements RefObj { private Object object; @Override - public int select(Context context) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } + public long select(Context context) { EntityHandler entityHandler = ref.getEntityHandler(); return entityHandler.handle(context, Collections.singletonList(object)); } @Override public int insertOrUpdate(Context context) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } AbstractRepository repository = ref.getProxyRepository(); return repository.insertOrUpdate(context, object); } @Override public int delete(Context context) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } AbstractRepository repository = ref.getProxyRepository(); return repository.delete(context, object); } + @Override + public long select(Selector selector) { + return select(new InnerContext(selector)); + } + + @Override + public int insertOrUpdate(Selector selector) { + return insertOrUpdate(new InnerContext(selector)); + } + + @Override + public int delete(Selector selector) { + return delete(new InnerContext(selector)); + } + } 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 dcdf53a1333ed77e083e742e3e94030d99aaf8af..0aeed35cb0e633e4cf62c29b3b21c53fa6a7db9f 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 @@ -18,162 +18,16 @@ package com.gitee.dorive.ref.repository; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.entity.context.InnerContext; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.ref.api.SimpleRepository; import com.gitee.dorive.ref.impl.RefInjector; -import java.lang.reflect.Field; -import java.util.List; - -public abstract class AbstractRefRepository extends AbstractCoatingRepository { - - @Override - protected void processEntityClass(EntityHandler entityHandler) { - RefInjector refInjector = new RefInjector(this, entityHandler, getEntityClass()); - Field field = refInjector.getField(); - if (field != null) { - refInjector.inject(field, refInjector.createRef()); - } - } - - @Override - public E selectByPrimaryKey(Context context, PK primaryKey) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectByPrimaryKey(context, primaryKey); - } - - @Override - public List selectByExample(Context context, Example example) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectByExample(context, example); - } - - @Override - public Page selectPageByExample(Context context, Example example) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectPageByExample(context, example); - } - - @Override - public long selectCountByExample(Context context, Example example) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectCountByExample(context, example); - } - - @Override - public int insert(Context context, E entity) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.insert(context, entity); - } - - @Override - public int update(Context context, E entity) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.update(context, entity); - } - - @Override - public int updateByExample(Context context, Object entity, Example example) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.updateByExample(context, entity, example); - } - - @Override - public int insertOrUpdate(Context context, E entity) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.insertOrUpdate(context, entity); - } - - @Override - public int delete(Context context, E entity) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.delete(context, entity); - } - - @Override - public int deleteByPrimaryKey(Context context, PK primaryKey) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.deleteByPrimaryKey(context, primaryKey); - } - - @Override - public int deleteByExample(Context context, Example example) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.deleteByExample(context, example); - } - - @Override - public int insertList(Context context, List entities) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.insertList(context, entities); - } - - @Override - public int updateList(Context context, List entities) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.updateList(context, entities); - } - - @Override - public int insertOrUpdateList(Context context, List entities) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.insertOrUpdateList(context, entities); - } - - @Override - public int deleteList(Context context, List entities) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.deleteList(context, entities); - } - - @Override - public List selectByCoating(Context context, Object coating) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectByCoating(context, coating); - } +public abstract class AbstractRefRepository extends AbstractCoatingRepository implements SimpleRepository { @Override - public Page selectPageByCoating(Context context, Object coating) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.selectPageByCoating(context, coating); + protected EntityHandler processEntityHandler(EntityHandler entityHandler) { + new RefInjector(this, entityHandler, getEntityClass()); + return entityHandler; } } diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 9f2350ac95666ab7ec3b752fbb730d07f0d478e4..75832e37825b12fbeea8a2b9f0a4a5657c9dec61 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.3.8 + 3.3.9 dorive-spring-boot-starter diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java index dbc287a94619ceae2b186cf829b5094d98c6ce52..5978338fb4d321b3a4ccf4fc56c3e02b795a7ae9 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java @@ -39,7 +39,4 @@ public @interface RootRepository { @AliasFor(annotation = Repository.class) String value() default ""; - @AliasFor(annotation = Repository.class) - String querier() default "SQL"; - } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java index 2c7b0e3b4bb15cc6aeeb8f6c821b66d781b80b4f..c7b892f29edc8d2d52af698149e8ce66546195c0 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/Keys.java @@ -18,6 +18,7 @@ package com.gitee.dorive.spring.boot.starter.api; public interface Keys { + String QUERIER = "QUERIER"; String TABLE_INFO = "TABLE_INFO"; String ALIAS_EXECUTOR = "ALIAS_EXECUTOR"; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java index 552e2e6a6a81a9c6c4c7b27e1eb2eab5031757f4..e9a8bc44f16d204e1f6ab62bcd9ae11a98ad3281 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java @@ -53,12 +53,12 @@ public class AliasExecutor extends AbstractExecutor { } @Override - public long executeCountQuery(Context context, Query query) { + public long executeCount(Context context, Query query) { Example example = query.getExample(); if (example != null) { convert(example); } - return executor.executeCountQuery(context, query); + return executor.executeCount(context, query); } @Override diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java index 93d24a8dd31c707ef3342ba0da1ad4151bc2d119..7d2205fce3740c8b2920006ebf3355c23dfaf324 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.spring.boot.starter.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.common.EntityFactory; +import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Example; @@ -116,8 +116,8 @@ public class FactoryExecutor extends AbstractExecutor { } @Override - public long executeCountQuery(Context context, Query query) { - return executor.executeCountQuery(context, query); + public long executeCount(Context context, Query query) { + return executor.executeCount(context, query); } @Override 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 830fd61a8473438647570c4ef289c1247e96401c..115b807975b07dadb4fc79488f3a9eeaaaf5777a 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 @@ -114,7 +114,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { } @Override - public long executeCountQuery(Context context, Query query) { + public long executeCount(Context context, Query query) { Example example = query.getExample(); if (example != null) { QueryWrapper queryWrapper = buildQueryWrapper(example); 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 9e5b11f8dd2ee191abb3e48b8e62f559e961ed52..94dcacc3da1ee8e1d53f4b24c890aee7eadf9954 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 @@ -24,8 +24,11 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.core.api.common.EntityFactory; +import com.gitee.dorive.coating.api.ExampleBuilder; +import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.spring.boot.starter.api.Keys; @@ -43,19 +46,19 @@ import java.lang.reflect.Type; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Data @EqualsAndHashCode(callSuper = false) public class MybatisPlusRepository extends AbstractRefRepository { + private ExampleBuilder sqlExampleBuilder; private CountQuerier countQuerier; @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - if ("SQL".equals(getQuerier())) { - setExampleBuilder(new SQLExampleBuilder(this)); - } + this.sqlExampleBuilder = new SQLExampleBuilder(this); this.countQuerier = new CountQuerier(this); } @@ -77,13 +80,20 @@ public class MybatisPlusRepository extends AbstractRefRepository { } } } - Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); - assert tableInfo != null; attachments.put(Keys.TABLE_INFO, tableInfo); + EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, pojoClass, tableInfo); + + 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; + } + private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, Class pojoClass, TableInfo tableInfo) { Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { @@ -96,34 +106,50 @@ public class MybatisPlusRepository extends AbstractRefRepository { defaultEntityFactory.setEntityEle(entityEle); defaultEntityFactory.setPojoClass(pojoClass); - Map aliasFieldMapping = entityEle.newAliasFieldMapping(); + Map aliasFieldMapping = newAliasFieldMapping(entityEle); defaultEntityFactory.setAliasFieldMapping(aliasFieldMapping); - String keyColumn = tableInfo.getKeyColumn(); - String keyProperty = tableInfo.getKeyProperty(); - List tableFieldInfos = tableInfo.getFieldList(); + Map fieldPropMapping = newFieldPropMapping(tableInfo, aliasFieldMapping); + defaultEntityFactory.setFieldPropMapping(fieldPropMapping); + } + return entityFactory; + } - Map fieldPropMapping = new LinkedHashMap<>(); - if (StringUtils.isNotBlank(keyColumn) && StringUtils.isNotBlank(keyProperty)) { - String field = aliasFieldMapping.get(keyColumn); - if (field != null) { - fieldPropMapping.put(field, keyProperty); - } + private Map newAliasFieldMapping(EntityEle entityEle) { + Map propAliasMap = entityEle.getPropAliasMap(); + return propAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + } + + private Map newFieldPropMapping(TableInfo tableInfo, Map aliasFieldMapping) { + String keyColumn = tableInfo.getKeyColumn(); + String keyProperty = tableInfo.getKeyProperty(); + List tableFieldInfos = tableInfo.getFieldList(); + Map fieldPropMapping = new LinkedHashMap<>(); + + if (StringUtils.isNotBlank(keyColumn) && StringUtils.isNotBlank(keyProperty)) { + String field = aliasFieldMapping.get(keyColumn); + if (field != null) { + fieldPropMapping.put(field, keyProperty); } - for (TableFieldInfo tableFieldInfo : tableFieldInfos) { - String field = aliasFieldMapping.get(tableFieldInfo.getColumn()); - if (field != null) { - fieldPropMapping.put(field, tableFieldInfo.getProperty()); - } + } + for (TableFieldInfo tableFieldInfo : tableFieldInfos) { + String field = aliasFieldMapping.get(tableFieldInfo.getColumn()); + if (field != null) { + fieldPropMapping.put(field, tableFieldInfo.getProperty()); } - defaultEntityFactory.setFieldPropMapping(fieldPropMapping); } + return fieldPropMapping; + } - 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; + @Override + public Example buildExample(Context context, Object coating) { + Map attachments = context.getAttachments(); + String querier = (String) attachments.get(Keys.QUERIER); + if (querier == null || "SQL".equals(querier)) { + return sqlExampleBuilder.buildExample(context, coating); + } else { + return getExampleBuilder().buildExample(context, coating); + } } } diff --git a/pom.xml b/pom.xml index c87f77dbfd78f892130defbf36e5f895277d0264..8ed72e3fd5d910ef16b86c7d1e7c04a1264eaf10 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.3.8 + 3.3.9 pom