From 5bf29df0e9bb5a0e3e0bb84427f65b4b46e3e1ff Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Mon, 24 Jun 2024 16:07:12 +0800 Subject: [PATCH 01/77] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-proxy/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 12 ++++++------ 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 9dc5d6e3..42742fd6 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index beb350c8..cd99288b 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index a616159c..f886a5fc 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index a4712941..fe2c84f0 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index cb2b08d7..feae78e0 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index 259cda17..c8f1722b 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-mybatis-plus diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index 2ebc2817..1b976ea1 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-proxy diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 01693f19..00cdbadc 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index d99ab5d1..ed48a060 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 8e11f924..3d6cb0f5 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 767cbbc0..2ac56e41 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index b42367f7..9d1fdb69 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 dorive-web diff --git a/pom.xml b/pom.xml index 97d7ee16..2b5aca38 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.3.6 + 3.5.0.0 pom @@ -55,17 +55,17 @@ org.springframework.boot spring-boot-starter - 2.7.8 + 2.7.18 org.springframework.boot spring-boot-starter-web - 2.7.8 + 2.7.18 org.springframework spring-tx - 5.3.9 + 5.3.31 org.projectlombok @@ -81,7 +81,7 @@ cn.hutool hutool-all - 5.8.12 + 5.8.25 org.javassist @@ -91,7 +91,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.3.1 + 3.5.7 -- Gitee From b4bdcc1c5fc5660df8197aca37bd1befe29e1af0 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Mon, 24 Jun 2024 16:15:06 +0800 Subject: [PATCH 02/77] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/resolver/ElementResolver.java | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/resolver/ElementResolver.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/resolver/ElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/resolver/ElementResolver.java deleted file mode 100644 index c64d22ec..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/resolver/ElementResolver.java +++ /dev/null @@ -1,49 +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.api.resolver; - -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.api.entity.EntityType; -import lombok.Data; - -import java.util.LinkedHashMap; -import java.util.Map; - -@Data -public class ElementResolver { - - private Map entityEleMap = new LinkedHashMap<>(); - - public ElementResolver(EntityType entityType) { - this.entityEleMap.put("/", entityType); - resolve("", entityType); - } - - private void resolve(String lastAccessPath, EntityType entityType) { - for (EntityField entityField : entityType.getEntityFieldMap().values()) { - String accessPath = lastAccessPath + "/" + entityField.getName(); - entityEleMap.put(accessPath, entityField); - EntityType fieldEntityType = entityField.getEntityType(); - if (fieldEntityType != null) { - resolve(accessPath, fieldEntityType); - } - } - } - -} -- Gitee From 4190e3717853c60ba849ca5b443b647dd38478ec Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Mon, 24 Jun 2024 16:16:14 +0800 Subject: [PATCH 03/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Entity.java | 8 ++++---- .../src/main/java/com/gitee/dorive/api/def/EntityDef.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index 261c013c..c8b96e77 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -47,14 +47,14 @@ public @interface Entity { Class factory() default Object.class; /** - * 是否聚合 + * 指定仓储 */ - boolean aggregate() default false; + Class repository() default Object.class; /** - * 指定仓储 + * 是否聚合 */ - Class repository() default Object.class; + boolean aggregate() default false; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java index f95eac63..de224a51 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java @@ -36,8 +36,8 @@ public class EntityDef { private String name; private Class source; private Class factory; - private boolean aggregate; private Class repository; + private boolean aggregate; public static EntityDef fromElement(AnnotatedElement element) { Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Entity.class); -- Gitee From 312d7cfc0d40729ff1f217246d72e31b54eeacb5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Mon, 24 Jun 2024 19:37:38 +0800 Subject: [PATCH 04/77] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/annotation/Entity.java | 5 + .../gitee/dorive/api/annotation/Order.java | 5 - .../com/gitee/dorive/api/def/BindingDef.java | 22 -- .../com/gitee/dorive/api/def/EntityDef.java | 27 +-- .../com/gitee/dorive/api/def/FieldDef.java | 13 -- .../com/gitee/dorive/api/def/OrderDef.java | 14 -- .../EntityEle.java => ele/EntityElement.java} | 75 +++--- .../gitee/dorive/api/ele/FieldElement.java | 26 +++ .../BindingDefinition.java} | 19 +- .../EntityDefinition.java} | 51 +++-- .../gitee/dorive/api/entity/EntityField.java | 107 --------- .../gitee/dorive/api/entity/EntityType.java | 143 ------------ .../dorive/api/entity/FieldDefinition.java | 33 +++ ...pChain.java => FieldEntityDefinition.java} | 69 +----- .../dorive/api/factory/PropProxyFactory.java | 94 -------- .../api/impl/EntityDefinitionReader.java | 213 ++++++++++++++++++ .../api/impl/EntityElementResolver.java | 119 ++++++++++ .../com/gitee/dorive/api/impl/PropChain.java | 29 +++ .../gitee/dorive/api/impl/SpELPropProxy.java | 37 +++ .../dorive/core/impl/binder/BoundBinder.java | 4 +- .../dorive/core/impl/binder/FieldBinder.java | 4 +- .../dorive/core/impl/binder/StrongBinder.java | 4 +- .../core/impl/binder/ValueFilterBinder.java | 4 +- .../core/impl/binder/ValueRouteBinder.java | 4 +- .../dorive/core/impl/binder/WeakBinder.java | 2 +- .../core/impl/converter/MapExpConverter.java | 12 +- .../core/impl/executor/ContextExecutor.java | 14 +- .../core/impl/executor/ExampleExecutor.java | 14 +- .../core/impl/executor/FactoryExecutor.java | 10 +- .../impl/factory/DefaultEntityFactory.java | 6 +- .../core/impl/factory/OperationFactory.java | 8 +- .../impl/joiner/AbstractEntityJoiner.java | 8 +- .../core/impl/joiner/UnionEntityJoiner.java | 7 - .../core/impl/resolver/BinderResolver.java | 63 +++--- .../impl/resolver/EntityMapperResolver.java | 40 ++-- .../repository/AbstractContextRepository.java | 117 +++++----- .../core/repository/AbstractRepository.java | 6 +- .../core/repository/CommonRepository.java | 10 +- .../dorive/event/entity/ExecutorEvent.java | 6 +- .../dorive/event/entity/RepositoryEvent.java | 6 +- .../dorive/event/executor/EventExecutor.java | 8 +- .../repository/AbstractEventRepository.java | 6 +- .../plus/executor/MybatisPlusExecutor.java | 8 +- .../repository/MybatisPlusRepository.java | 8 +- .../impl/resolver/QueryTypeResolver.java | 2 +- .../gitee/dorive/ref/impl/RefInjector.java | 2 +- .../dorive/sql/entity/common/SegmentInfo.java | 4 +- .../sql/impl/count/DefaultCountQuerier.java | 14 +- .../sql/impl/executor/SqlQueryExecutor.java | 8 +- .../sql/impl/segment/SegmentBuilder.java | 10 +- 50 files changed, 752 insertions(+), 768 deletions(-) rename dorive-api/src/main/java/com/gitee/dorive/api/{entity/EntityEle.java => ele/EntityElement.java} (60%) create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java rename dorive-api/src/main/java/com/gitee/dorive/api/{exception/DefineEntityException.java => entity/BindingDefinition.java} (76%) rename dorive-api/src/main/java/com/gitee/dorive/api/{resolver/PropChainResolver.java => entity/EntityDefinition.java} (44%) delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java rename dorive-api/src/main/java/com/gitee/dorive/api/entity/{PropChain.java => FieldEntityDefinition.java} (33%) delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/factory/PropProxyFactory.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index c8b96e77..15c7b8b2 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -51,6 +51,11 @@ public @interface Entity { */ Class repository() default Object.class; + /** + * 操作优先级 + */ + int priority() default 0; + /** * 是否聚合 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java index 385846d0..e22ac71b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java @@ -36,11 +36,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Order { - /** - * 操作优先级 - */ - int priority() default 0; - /** * 默认排序字段 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java index 15fe48e4..9051cf51 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java @@ -17,40 +17,18 @@ package com.gitee.dorive.api.def; -import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.Binding; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.core.annotation.AnnotationUtils; - -import java.lang.reflect.AnnotatedElement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; @Data @NoArgsConstructor @AllArgsConstructor public class BindingDef { - private String field; private String value; private String bindExp; private String processExp; private Class processor; private String bindField; - - public static List fromElement(AnnotatedElement element) { - Set bindingAnnotations = AnnotatedElementUtils.getMergedRepeatableAnnotations(element, Binding.class); - List bindingDefs = new ArrayList<>(bindingAnnotations.size()); - for (Binding bindingAnnotation : bindingAnnotations) { - Map attributes = AnnotationUtils.getAnnotationAttributes(bindingAnnotation); - bindingDefs.add(BeanUtil.copyProperties(attributes, BindingDef.class)); - } - return bindingDefs; - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java index de224a51..ab46936f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java @@ -17,43 +17,18 @@ package com.gitee.dorive.api.def; -import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.Entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.core.annotation.AnnotatedElementUtils; - -import java.lang.reflect.AnnotatedElement; -import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor public class EntityDef { - private String name; private Class source; private Class factory; private Class repository; + private int priority; private boolean aggregate; - - public static EntityDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Entity.class); - return attributes != null ? BeanUtil.copyProperties(attributes, EntityDef.class) : null; - } - - public void mergeDef(EntityDef entityDef) { - if (StringUtils.isBlank(name)) { - name = entityDef.getName(); - } - if (source == null || source == Object.class) { - source = entityDef.getSource(); - } - if (factory == null || factory == Object.class) { - factory = entityDef.getFactory(); - } - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java index c62cfa30..c2c8bc79 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java @@ -17,30 +17,17 @@ package com.gitee.dorive.api.def; -import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.Field; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.core.annotation.AnnotatedElementUtils; - -import java.lang.reflect.AnnotatedElement; -import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor public class FieldDef { - private boolean id; private String alias; private boolean valueObj; private String mapExp; private Class converter; - - public static FieldDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Field.class); - return attributes != null ? BeanUtil.copyProperties(attributes, FieldDef.class) : null; - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java index 84e025d6..e8fa927a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java @@ -17,28 +17,14 @@ package com.gitee.dorive.api.def; -import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.annotation.Order; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.core.annotation.AnnotatedElementUtils; - -import java.lang.reflect.AnnotatedElement; -import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor public class OrderDef { - - private int priority; private String sortBy; private String order; - - public static OrderDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Order.class); - return attributes != null ? BeanUtil.copyProperties(attributes, OrderDef.class) : null; - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java similarity index 60% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java rename to dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java index f645ef5f..c270259d 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java @@ -15,52 +15,65 @@ * limitations under the License. */ -package com.gitee.dorive.api.entity; +package com.gitee.dorive.api.ele; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.def.BindingDef; import com.gitee.dorive.api.def.EntityDef; import com.gitee.dorive.api.def.OrderDef; +import com.gitee.dorive.api.entity.EntityDefinition; +import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; -import java.lang.reflect.AnnotatedElement; -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Data -@NoArgsConstructor -public abstract class EntityEle { +@AllArgsConstructor +public class EntityElement implements PropProxy { - private AnnotatedElement element; + private EntityDefinition entityDefinition; + private String accessPath; + private Class genericType; private EntityDef entityDef; - private OrderDef orderDef; private List bindingDefs; - private PropProxy idProxy; + private OrderDef orderDef; + private List fieldElements; private Map fieldAliasMapping; - public EntityEle(AnnotatedElement element) { - this.element = element; - this.entityDef = EntityDef.fromElement(element); - this.orderDef = OrderDef.fromElement(element); - this.bindingDefs = BindingDef.fromElement(element); + public String getPrimaryKey() { + return entityDefinition.getPrimaryKey(); } - public boolean isEntityDef() { - return entityDef != null; + public Object getPrimaryKey(Object entity) { + return ReflectUtil.getFieldValue(entity, getPrimaryKey()); } - public void initialize() { - if (entityDef != null && idProxy == null) { - doInitialize(); - } + public void setPrimaryKey(Object entity, Object value) { + ReflectUtil.setFieldValue(entity, getPrimaryKey(), value); + } + + public boolean isCollection() { + return entityDefinition.isCollection(); } public boolean hasField(String field) { - return fieldAliasMapping.containsKey(field); + return ReflectUtil.hasField(genericType, field); + } + + @Override + public Object getValue(Object entity) { + return ReflectUtil.getFieldValue(entity, entityDefinition.getFieldName()); + } + + @Override + public void setValue(Object entity, Object value) { + ReflectUtil.setFieldValue(entity, entityDefinition.getFieldName(), value); + } + + public FieldElement getFieldElement(String fieldName) { + return CollUtil.findOne(fieldElements, fieldElement -> fieldName.equals(fieldElement.getFieldName())); } public String toAlias(String field) { @@ -91,16 +104,4 @@ public abstract class EntityEle { return fields; } - protected abstract void doInitialize(); - - public abstract boolean isCollection(); - - public abstract Class getGenericType(); - - public abstract EntityType getEntityType(); - - public abstract Map getEntityFieldMap(); - - public abstract String getIdName(); - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java new file mode 100644 index 00000000..350fc529 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java @@ -0,0 +1,26 @@ +package com.gitee.dorive.api.ele; + +import com.gitee.dorive.api.def.FieldDef; +import com.gitee.dorive.api.entity.FieldDefinition; +import lombok.Data; + +@Data +public class FieldElement { + + private FieldDefinition fieldDefinition; + private Class genericType; + private FieldDef fieldDef; + + public boolean isCollection() { + return fieldDefinition.isCollection(); + } + + public String getFieldName() { + return fieldDefinition.getFieldName(); + } + + public boolean isSameType(FieldElement fieldElement) { + return fieldDefinition.getTypeName().equals(fieldElement.getFieldDefinition().getTypeName()) && fieldDefinition.getGenericTypeName().equals(fieldElement.getFieldDefinition().getGenericTypeName()); + } + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java similarity index 76% rename from dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java index b865065e..25007fbe 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java @@ -15,17 +15,16 @@ * limitations under the License. */ -package com.gitee.dorive.api.exception; +package com.gitee.dorive.api.entity; import lombok.Data; -import lombok.EqualsAndHashCode; @Data -@EqualsAndHashCode(callSuper = false) -public class DefineEntityException extends RuntimeException { - - public DefineEntityException(String message) { - super(message); - } - -} +public class BindingDefinition { + private String field; + private String value; + private String bindExp; + private String processExp; + private String processorName; + private String bindField; +} \ No newline at end of file diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/resolver/PropChainResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java similarity index 44% rename from dorive-api/src/main/java/com/gitee/dorive/api/resolver/PropChainResolver.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java index 1fc64a4c..8ea5c336 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/resolver/PropChainResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java @@ -15,35 +15,46 @@ * limitations under the License. */ -package com.gitee.dorive.api.resolver; +package com.gitee.dorive.api.entity; -import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.api.entity.EntityType; -import com.gitee.dorive.api.entity.PropChain; import lombok.Data; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.Collections; +import java.util.List; @Data -public class PropChainResolver { +public class EntityDefinition { + private String name; + private String sourceName; + private String factoryName; + private String repositoryName; + private int priority; + private String genericTypeName; + private String primaryKey; + private List fieldDefinitions; + private List fieldEntityDefinitions; + + public boolean isAggregate() { + return false; + } - private Map propChainMap = new LinkedHashMap<>(); + public List getBindingDefinitions() { + return Collections.emptyList(); + } - public PropChainResolver(EntityType entityType) { - resolve("", entityType); + public String getSortBy() { + return null; } - private void resolve(String lastAccessPath, EntityType entityType) { - PropChain lastPropChain = propChainMap.get(lastAccessPath); - for (EntityField entityField : entityType.getEntityFieldMap().values()) { - String accessPath = lastAccessPath + "/" + entityField.getName(); - PropChain propChain = new PropChain(lastPropChain, entityType, accessPath, entityField); - propChainMap.put(accessPath, propChain); - if (EntityField.isComplexType(entityField.getType()) && !entityField.isEntityDef()) { - resolve(accessPath, entityField.getEntityType()); - } - } + public String getOrder() { + return null; } + public boolean isCollection() { + return false; + } + + public String getFieldName() { + return null; + } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java deleted file mode 100644 index 4a4ed5a8..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java +++ /dev/null @@ -1,107 +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.api.entity; - -import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.def.FieldDef; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.Collection; -import java.util.Map; - -@Data -@EqualsAndHashCode(callSuper = false) -public class EntityField extends EntityEle { - - private Field field; - private Class type; - private boolean collection; - private Class genericType; - private String name; - private FieldDef fieldDef; - private EntityType entityType; - - public static boolean isComplexType(Class type) { - String className = type.getName(); - return !className.startsWith("java.lang.") && !className.startsWith("java.util.") && !type.isEnum(); - } - - public EntityField(Field field) { - super(field); - this.field = field; - this.type = field.getType(); - this.collection = false; - this.genericType = field.getType(); - this.name = field.getName(); - if (Collection.class.isAssignableFrom(field.getType())) { - this.collection = true; - ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); - Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; - this.genericType = (Class) actualTypeArgument; - } - this.fieldDef = FieldDef.fromElement(field); - resolveGenericType(this.genericType); - initialize(); - } - - private void resolveGenericType(Class genericType) { - EntityDef entityDef = getEntityDef(); - if (entityDef != null) { - EntityDef genericEntityDef = EntityDef.fromElement(genericType); - if (genericEntityDef != null) { - entityDef.mergeDef(genericEntityDef); - } - } - if (isComplexType(genericType)) { - entityType = EntityType.getInstance(genericType); - } - } - - @Override - protected void doInitialize() { - if (entityType != null) { - entityType.initialize(); - setIdProxy(entityType.getIdProxy()); - setFieldAliasMapping(entityType.getFieldAliasMapping()); - } - } - - @Override - public Map getEntityFieldMap() { - return entityType != null ? entityType.getEntityFieldMap() : null; - } - - @Override - public String getIdName() { - return entityType != null ? entityType.getIdName() : null; - } - - public boolean isSameType(EntityField entityField) { - return type == entityField.getType() && genericType == entityField.getGenericType(); - } - - public Object getFieldValue(Object object) { - return ReflectUtil.getFieldValue(object, field); - } - -} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java deleted file mode 100644 index b173f83c..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java +++ /dev/null @@ -1,143 +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.api.entity; - -import cn.hutool.core.collection.ConcurrentHashSet; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.exception.DefineEntityException; -import com.gitee.dorive.api.factory.PropProxyFactory; -import com.gitee.dorive.api.util.ReflectUtils; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -@Data -@Slf4j -@EqualsAndHashCode(callSuper = false) -public class EntityType extends EntityEle { - - private static final Map, EntityType> CACHE = new ConcurrentHashMap<>(); - private static final Set> LOCK = new ConcurrentHashSet<>(); - - private Class type; - private String name; - private EntityField idField; - private Map entityFieldMap; - - public static synchronized EntityType getInstance(Class type) { - EntityType entityType = CACHE.get(type); - if (entityType == null) { - if (LOCK.add(type)) { - entityType = new EntityType(type); - CACHE.put(type, entityType); - LOCK.remove(type); - } else { - throw new DefineEntityException("The entity nested itself! type: " + type.getName()); - } - } - return entityType; - } - - private EntityType(Class type) { - super(type); - this.type = type; - this.name = type.getName(); - List fields = ReflectUtils.getAllFields(type); - this.entityFieldMap = new LinkedHashMap<>(fields.size() * 4 / 3 + 1); - for (Field field : fields) { - if (!Modifier.isStatic(field.getModifiers())) { - try { - EntityField entityField = new EntityField(field); - String fieldName = entityField.getName(); - if (idField == null) { - FieldDef fieldDef = entityField.getFieldDef(); - if ("id".equals(fieldName) || (fieldDef != null && fieldDef.isId())) { - idField = entityField; - } - } - entityFieldMap.put(fieldName, entityField); - - } catch (DefineEntityException e) { - log.warn(e.getMessage()); - } - } - } - initialize(); - } - - @Override - protected void doInitialize() { - Class genericType = getGenericType(); - Assert.notNull(idField, "The id field cannot be null! type: {}", genericType.getName()); - PropProxy idProxy = PropProxyFactory.newPropProxy(genericType, idField.getName()); - setIdProxy(idProxy); - - Map fieldAliasMapping = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); - for (EntityField entityField : entityFieldMap.values()) { - String name = entityField.getName(); - String alias = StrUtil.toUnderlineCase(name); - FieldDef fieldDef = entityField.getFieldDef(); - if (fieldDef != null) { - String aliasDef = fieldDef.getAlias(); - if (StringUtils.isNotBlank(aliasDef)) { - alias = aliasDef; - } - } - fieldAliasMapping.put(name, alias); - } - setFieldAliasMapping(fieldAliasMapping); - } - - @Override - public boolean isCollection() { - return false; - } - - @Override - public Class getGenericType() { - return type; - } - - @Override - public EntityType getEntityType() { - return this; - } - - @Override - public Map getEntityFieldMap() { - return entityFieldMap; - } - - @Override - public String getIdName() { - return idField.getName(); - } - -} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java new file mode 100644 index 00000000..6d11db24 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.entity; + +import lombok.Data; + +@Data +public class FieldDefinition { + private boolean primary; + private String alias; + private boolean valueObj; + private String mapExp; + private String converterName; + private String typeName; + private boolean collection; + private String genericTypeName; + private String fieldName; +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java similarity index 33% rename from dorive-api/src/main/java/com/gitee/dorive/api/entity/PropChain.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java index 7fa20da8..64c70e85 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/PropChain.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java @@ -17,66 +17,19 @@ package com.gitee.dorive.api.entity; -import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.factory.PropProxyFactory; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.ToString; -@Data -@ToString(exclude = "lastPropChain") -@EqualsAndHashCode(callSuper = false) -public class PropChain implements PropProxy { - - private PropChain lastPropChain; - private EntityType entityType; - private String accessPath; - private EntityField entityField; - private PropProxy propProxy; - - public PropChain(PropChain lastPropChain, EntityType entityType, String accessPath, EntityField entityField) { - this.lastPropChain = lastPropChain; - this.entityType = entityType; - this.accessPath = accessPath; - this.entityField = entityField; - if (entityField.isEntityDef()) { - newPropProxy(); - } - } - - public void newPropProxy() { - if (propProxy == null) { - propProxy = PropProxyFactory.newPropProxy(entityType.getType(), entityField.getField()); - if (lastPropChain != null) { - lastPropChain.newPropProxy(); - } - } - } - - public boolean isEntityDef() { - return entityField.isEntityDef(); - } - - public boolean isSameType(PropChain propChain) { - return entityField.isSameType(propChain.getEntityField()); - } - - @Override - public Object getValue(Object entity) { - if (lastPropChain != null) { - entity = lastPropChain.getValue(entity); - } - return entity != null ? propProxy.getValue(entity) : null; - } - - @Override - public void setValue(Object entity, Object value) { - if (lastPropChain != null) { - entity = lastPropChain.getValue(entity); - } - if (entity != null) { - propProxy.setValue(entity, value); - } - } +import java.util.List; +@Data +@EqualsAndHashCode(callSuper = true) +public class FieldEntityDefinition extends EntityDefinition { + private boolean aggregate; + private List bindingDefinitions; + private String sortBy; + private String order; + private String typeName; + private boolean collection; + private String fieldName; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/factory/PropProxyFactory.java b/dorive-api/src/main/java/com/gitee/dorive/api/factory/PropProxyFactory.java deleted file mode 100644 index a67bc4d7..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/factory/PropProxyFactory.java +++ /dev/null @@ -1,94 +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.api.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.JavassistCompiler; -import com.gitee.dorive.proxy.ProxyCompiler; - -import java.lang.reflect.Field; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -public class PropProxyFactory { - - private static final AtomicInteger COUNT = new AtomicInteger(0); - private static final ProxyCompiler PROXY_COMPILER = new JavassistCompiler(); - private static final Map GENERATED_PROXY_CACHE = new ConcurrentHashMap<>(); - - public static PropProxy newPropProxy(Class entityClass, Field declaredField) { - return newPropProxy(entityClass, declaredField.getType(), declaredField.getName()); - } - - public static PropProxy newPropProxy(Class entityClass, String fieldName) { - try { - Field field = ReflectUtil.getField(entityClass, fieldName); - Class fieldClass = field.getType(); - return newPropProxy(entityClass, fieldClass, fieldName); - - } catch (Exception e) { - throw new RuntimeException("Failed to generate class!", e); - } - } - - public static PropProxy newPropProxy(Class entityClass, Class fieldClass, String fieldName) { - String cacheKey = entityClass.getTypeName() + ":" + fieldClass.getTypeName() + ":" + fieldName; - if (!GENERATED_PROXY_CACHE.containsKey(cacheKey)) { - synchronized (GENERATED_PROXY_CACHE) { - if (!GENERATED_PROXY_CACHE.containsKey(cacheKey)) { - try { - String generatedCode = generateCode(entityClass, fieldClass, fieldName); - Class generatedClass = PROXY_COMPILER.compile(generatedCode, null); - PropProxy propProxy = (PropProxy) ReflectUtil.newInstance(generatedClass); - GENERATED_PROXY_CACHE.put(cacheKey, propProxy); - - } catch (Exception e) { - throw new RuntimeException("Failed to generate class!", e); - } - } - } - } - return GENERATED_PROXY_CACHE.get(cacheKey); - } - - private static String generateCode(Class entityClass, Class fieldClass, String fieldName) { - Class interfaceClass = PropProxy.class; - StringBuilder builder = new StringBuilder(); - String simpleName = interfaceClass.getSimpleName() + "$Proxy" + COUNT.getAndIncrement(); - builder.append(String.format("package %s;\n", interfaceClass.getPackage().getName())); - builder.append(String.format("public class %s implements %s {\n", simpleName, interfaceClass.getName())); - - builder.append("\t").append(String.format("public %s getValue(%s arg0) {\n", Object.class.getTypeName(), Object.class.getTypeName())); - builder.append("\t\t").append(String.format("%s arg1 = (%s)arg0;\n", entityClass.getTypeName(), entityClass.getTypeName())); - builder.append("\t\t").append(String.format("return arg1.get%s();\n", StrUtil.upperFirst(fieldName))); - builder.append("\t").append("}\n"); - - builder.append("\t").append(String.format("public void setValue(%s arg0, %s arg1) {\n", Object.class.getTypeName(), Object.class.getTypeName())); - builder.append("\t\t").append(String.format("%s arg2 = (%s)arg0;\n", entityClass.getTypeName(), entityClass.getTypeName())); - builder.append("\t\t").append(String.format("%s arg3 = (%s)arg1;\n", fieldClass.getTypeName(), fieldClass.getTypeName())); - builder.append("\t\t").append(String.format("arg2.set%s(arg3);\n", StrUtil.upperFirst(fieldName))); - builder.append("\t").append("}\n"); - - builder.append("}\n"); - return builder.toString(); - } - -} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java new file mode 100644 index 00000000..4491cb93 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ConcurrentHashSet; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.api.annotation.Binding; +import com.gitee.dorive.api.annotation.Entity; +import com.gitee.dorive.api.annotation.Order; +import com.gitee.dorive.api.util.ReflectUtils; +import com.gitee.dorive.api.entity.BindingDefinition; +import com.gitee.dorive.api.entity.EntityDefinition; +import com.gitee.dorive.api.entity.FieldDefinition; +import com.gitee.dorive.api.entity.FieldEntityDefinition; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +public class EntityDefinitionReader { + + private static final Map CACHE = new ConcurrentHashMap<>(); + private static final Set LOCK = new ConcurrentHashSet<>(); + + public EntityDefinition read(Class type) { + synchronized (CACHE) { + String typeName = type.getName(); + EntityDefinition entityDefinition = CACHE.get(typeName); + if (entityDefinition == null) { + if (LOCK.add(typeName)) { + entityDefinition = doRead(type); + CACHE.put(typeName, entityDefinition); + LOCK.remove(typeName); + } else { + log.info("The entity nested itself! type: " + type.getName()); + } + } + return entityDefinition; + } + } + + private EntityDefinition doRead(Class type) { + Entity entity = AnnotationUtils.getAnnotation(type, Entity.class); + Assert.notNull(entity, "The @Entity does not exist!"); + assert entity != null; + String name = entity.name(); + Class source = entity.source(); + Class factory = entity.factory(); + Class repository = entity.repository(); + int priority = entity.priority(); + + EntityDefinition entityDefinition = new EntityDefinition(); + entityDefinition.setName(StringUtils.isNotBlank(name) ? name : type.getSimpleName()); + entityDefinition.setSourceName(source.getName()); + entityDefinition.setFactoryName(factory.getName()); + entityDefinition.setRepositoryName(repository.getName()); + entityDefinition.setPriority(priority); + entityDefinition.setGenericTypeName(type.getName()); + readFields(type, entityDefinition); + return entityDefinition; + } + + private void readFields(Class type, EntityDefinition entityDefinition) { + List fieldDefinitions = new ArrayList<>(); + List fieldEntityDefinitions = new ArrayList<>(); + List fields = ReflectUtils.getAllFields(type); + for (Field field : fields) { + if (!Modifier.isStatic(field.getModifiers())) { + Entity entity = AnnotationUtils.getAnnotation(field, Entity.class); + if (entity == null) { + FieldDefinition fieldDefinition = readField(field); + if (fieldDefinition.isPrimary()) { + entityDefinition.setPrimaryKey(fieldDefinition.getFieldName()); + } + fieldDefinitions.add(fieldDefinition); + } else { + FieldEntityDefinition fieldEntityDefinition = readFieldEntity(entity, field); + if (fieldEntityDefinition != null) { + fieldEntityDefinitions.add(fieldEntityDefinition); + } + } + } + } + entityDefinition.setFieldDefinitions(fieldDefinitions); + entityDefinition.setFieldEntityDefinitions(fieldEntityDefinitions); + } + + private FieldDefinition readField(Field field) { + com.gitee.dorive.api.annotation.Field fieldAnnotation = AnnotationUtils.getAnnotation(field, com.gitee.dorive.api.annotation.Field.class); + Class type = field.getType(); + boolean collection = false; + Class genericType = field.getType(); + String fieldName = field.getName(); + if (Collection.class.isAssignableFrom(field.getType())) { + collection = true; + ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); + Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; + genericType = (Class) actualTypeArgument; + } + + FieldDefinition fieldDefinition = new FieldDefinition(); + if (fieldAnnotation != null) { + fieldDefinition.setPrimary(fieldAnnotation.id()); + fieldDefinition.setAlias(fieldAnnotation.alias()); + fieldDefinition.setValueObj(fieldAnnotation.valueObj()); + fieldDefinition.setMapExp(fieldAnnotation.mapExp()); + fieldDefinition.setConverterName(fieldAnnotation.converter().getName()); + } else { + fieldDefinition.setPrimary(false); + fieldDefinition.setAlias(StrUtil.toUnderlineCase(fieldName)); + fieldDefinition.setValueObj(false); + fieldDefinition.setMapExp(""); + fieldDefinition.setConverterName(Object.class.getName()); + } + if ("id".equals(fieldName)) { + fieldDefinition.setPrimary(true); + } + fieldDefinition.setTypeName(type.getName()); + fieldDefinition.setCollection(collection); + fieldDefinition.setGenericTypeName(genericType.getName()); + fieldDefinition.setFieldName(fieldName); + return fieldDefinition; + } + + private FieldEntityDefinition readFieldEntity(Entity entity, Field field) { + boolean aggregate = entity.aggregate(); + Order order = AnnotationUtils.getAnnotation(field, Order.class); + Class type = field.getType(); + boolean collection = false; + Class genericType = field.getType(); + String fieldName = field.getName(); + if (Collection.class.isAssignableFrom(field.getType())) { + collection = true; + ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); + Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; + genericType = (Class) actualTypeArgument; + } + + EntityDefinition entityDefinition = read(genericType); + if (entityDefinition == null) { + return null; + } + FieldEntityDefinition fieldEntityDefinition = BeanUtil.copyProperties(entityDefinition, FieldEntityDefinition.class); + + fieldEntityDefinition.setAggregate(aggregate); + fieldEntityDefinition.setBindingDefinitions(readBindingDefinitions(field)); + if (order != null) { + fieldEntityDefinition.setSortBy(order.sortBy()); + fieldEntityDefinition.setOrder(order.order()); + } + fieldEntityDefinition.setTypeName(type.getName()); + fieldEntityDefinition.setCollection(collection); + fieldEntityDefinition.setFieldName(fieldName); + + // 可重写 + String name = entity.name(); + if (StringUtils.isNotBlank(name)) { + fieldEntityDefinition.setName(name); + } + Class source = entity.source(); + if (source != Object.class) { + fieldEntityDefinition.setSourceName(source.getName()); + } + Class factory = entity.factory(); + if (factory != Object.class) { + fieldEntityDefinition.setFactoryName(factory.getName()); + } + + return fieldEntityDefinition; + } + + private List readBindingDefinitions(Field field) { + Set bindings = AnnotatedElementUtils.getMergedRepeatableAnnotations(field, Binding.class); + List bindingDefinitions = new ArrayList<>(bindings.size()); + for (Binding binding : bindings) { + BindingDefinition bindingDefinition = new BindingDefinition(); + bindingDefinition.setField(binding.field()); + bindingDefinition.setValue(binding.value()); + bindingDefinition.setBindExp(binding.bindExp()); + bindingDefinition.setProcessExp(binding.processExp()); + bindingDefinition.setProcessorName(binding.processor().getName()); + bindingDefinition.setBindField(binding.bindField()); + bindingDefinitions.add(bindingDefinition); + } + return bindingDefinitions; + } + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java new file mode 100644 index 00000000..6fc276e5 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.impl; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.def.EntityDef; +import com.gitee.dorive.api.def.FieldDef; +import com.gitee.dorive.api.def.OrderDef; +import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.BindingDefinition; +import com.gitee.dorive.api.entity.EntityDefinition; +import com.gitee.dorive.api.entity.FieldDefinition; +import com.gitee.dorive.api.entity.FieldEntityDefinition; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class EntityElementResolver { + + public Map resolve(EntityDefinition entityDefinition) { + Map entityElementMap = new LinkedHashMap<>(); + + String accessPath = "/"; + EntityElement entityElement = resolveElement(accessPath, entityDefinition); + entityElementMap.put(accessPath, entityElement); + + List fieldEntityDefinitions = entityDefinition.getFieldEntityDefinitions(); + for (FieldEntityDefinition fieldEntityDefinition : fieldEntityDefinitions) { + String fieldAccessPath = "/" + fieldEntityDefinition.getFieldName(); + EntityElement fieldEntityElement = resolveElement(fieldAccessPath, fieldEntityDefinition); + entityElementMap.put(fieldAccessPath, fieldEntityElement); + } + + return entityElementMap; + } + + private EntityElement resolveElement(String accessPath, EntityDefinition entityDefinition) { + Class genericType = ClassUtil.loadClass(entityDefinition.getGenericTypeName()); + + EntityDef entityDef = new EntityDef(); + entityDef.setName(entityDefinition.getName()); + entityDef.setSource(ClassUtil.loadClass(entityDefinition.getSourceName())); + entityDef.setFactory(ClassUtil.loadClass(entityDefinition.getFactoryName())); + entityDef.setRepository(ClassUtil.loadClass(entityDefinition.getRepositoryName())); + entityDef.setPriority(entityDefinition.getPriority()); + entityDef.setAggregate(entityDefinition.isAggregate()); + + List bindingDefinitions = entityDefinition.getBindingDefinitions(); + List bindingDefs = new ArrayList<>(bindingDefinitions.size()); + for (BindingDefinition bindingDefinition : bindingDefinitions) { + BindingDef bindingDef = new BindingDef(); + bindingDef.setField(bindingDefinition.getField()); + bindingDef.setValue(bindingDefinition.getValue()); + bindingDef.setBindExp(bindingDefinition.getBindExp()); + bindingDef.setProcessExp(bindingDefinition.getProcessExp()); + bindingDef.setProcessor(ClassUtil.loadClass(bindingDefinition.getProcessorName())); + bindingDef.setBindField(bindingDefinition.getBindField()); + bindingDefs.add(bindingDef); + } + + OrderDef orderDef = new OrderDef(); + orderDef.setSortBy(entityDefinition.getSortBy()); + orderDef.setOrder(entityDefinition.getOrder()); + + List fieldDefinitions = entityDefinition.getFieldDefinitions(); + List fieldElements = new ArrayList<>(fieldDefinitions.size()); + for (FieldDefinition fieldDefinition : fieldDefinitions) { + FieldElement fieldElement = new FieldElement(); + fieldElement.setFieldDefinition(fieldDefinition); + fieldElement.setGenericType(ClassUtil.loadClass(fieldDefinition.getGenericTypeName())); + + FieldDef fieldDef = new FieldDef(); + fieldDef.setId(fieldDefinition.isPrimary()); + fieldDef.setAlias(fieldDefinition.getAlias()); + fieldDef.setValueObj(fieldDefinition.isValueObj()); + fieldDef.setMapExp(fieldDefinition.getMapExp()); + fieldDef.setConverter(ClassUtil.loadClass(fieldDefinition.getConverterName())); + fieldElement.setFieldDef(fieldDef); + + fieldElements.add(fieldElement); + } + + Map fieldAliasMapping = new LinkedHashMap<>(fieldDefinitions.size() * 4 / 3 + 1); + for (FieldDefinition fieldDefinition : fieldDefinitions) { + String alias = fieldDefinition.getAlias(); + String fieldName = fieldDefinition.getFieldName(); + if (StringUtils.isBlank(alias)) { + alias = StrUtil.toUnderlineCase(fieldName); + } + fieldAliasMapping.put(fieldName, alias); + } + + return new EntityElement(entityDefinition, accessPath, genericType, entityDef, bindingDefs, orderDef, fieldElements, fieldAliasMapping); + } + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java new file mode 100644 index 00000000..1217f206 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java @@ -0,0 +1,29 @@ +package com.gitee.dorive.api.impl; + +import com.gitee.dorive.api.api.PropProxy; +import com.gitee.dorive.api.ele.FieldElement; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class PropChain implements PropProxy { + + private FieldElement fieldElement; + private PropProxy propProxy; + + @Override + public Object getValue(Object entity) { + return propProxy.getValue(entity); + } + + @Override + public void setValue(Object entity, Object value) { + propProxy.setValue(entity, value); + } + + public boolean isSameType(PropChain boundPropChain) { + return fieldElement.isSameType(boundPropChain.getFieldElement()); + } + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java new file mode 100644 index 00000000..a95b0ce8 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java @@ -0,0 +1,37 @@ +package com.gitee.dorive.api.impl; + +import com.gitee.dorive.api.api.PropProxy; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +@Data +@AllArgsConstructor +public class SpELPropProxy implements PropProxy { + + private final Expression expression; + + public static PropProxy newPropProxy(String expression) { + ExpressionParser parser = new SpelExpressionParser(); + return new SpELPropProxy(parser.parseExpression(expression)); + } + + @Override + public Object getValue(Object entity) { + EvaluationContext context = new StandardEvaluationContext(); + context.setVariable("root", entity); + return expression.getValue(context); + } + + @Override + public void setValue(Object entity, Object value) { + EvaluationContext context = new StandardEvaluationContext(); + context.setVariable("root", entity); + expression.setValue(context, value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java index 70a9489b..ac55e072 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; @@ -64,7 +64,7 @@ public class BoundBinder implements Binder { if (StringUtils.isNotBlank(bindField)) { return bindField; } - return boundPropChain.getEntityField().getName(); + return boundPropChain.getFieldElement().getFieldName(); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java index 3d88313c..18e0289e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; @@ -36,7 +36,7 @@ public class FieldBinder implements Binder { @Override public String getFieldName() { - return fieldPropChain.getEntityField().getName(); + return fieldPropChain.getFieldElement().getFieldName(); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java index ae0dfff2..50eb0c64 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; @@ -55,7 +55,7 @@ public class StrongBinder extends FieldBinder { } public boolean isCollection() { - return boundBinder.getBoundPropChain().getEntityField().isCollection(); + return boundBinder.getBoundPropChain().getFieldElement().isCollection(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java index f290d8e3..8baa8d0c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; @@ -33,7 +33,7 @@ public class ValueFilterBinder extends FieldBinder { public ValueFilterBinder(BindingDef bindingDef, Processor processor, PropChain fieldPropChain, String alias) { super(bindingDef, processor, fieldPropChain, alias); - Class genericType = fieldPropChain.getEntityField().getGenericType(); + Class genericType = fieldPropChain.getFieldElement().getGenericType(); this.value = Convert.convert(genericType, bindingDef.getValue()); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java index 822ce81d..d30aa9ad 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; @@ -38,7 +38,7 @@ public class ValueRouteBinder extends BoundBinder { @Override public void setBoundPropChain(PropChain boundPropChain) { super.setBoundPropChain(boundPropChain); - Class genericType = boundPropChain.getEntityField().getGenericType(); + Class genericType = boundPropChain.getFieldElement().getGenericType(); this.value = Convert.convert(genericType, bindingDef.getValue()); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java index 8a7018a6..87e5aa81 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java index d5325926..c6e89321 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.entity.EntityField; +import com.gitee.dorive.api.ele.FieldElement; import com.gitee.dorive.core.api.factory.Converter; import lombok.Getter; import lombok.Setter; @@ -34,14 +34,14 @@ import java.util.Map; @Setter public class MapExpConverter implements Converter { - private EntityField entityField; + private FieldElement fieldElement; private Map reMapping = Collections.emptyMap(); private Map deMapping = Collections.emptyMap(); - public MapExpConverter(EntityField entityField) { - this.entityField = entityField; - FieldDef fieldDef = entityField.getFieldDef(); - Class genericType = entityField.getGenericType(); + public MapExpConverter(FieldElement fieldElement) { + this.fieldElement = fieldElement; + FieldDef fieldDef = fieldElement.getFieldDef(); + Class genericType = fieldElement.getGenericType(); String mapExp = fieldDef.getMapExp(); if (StringUtils.isNotBlank(mapExp)) { this.reMapping = new LinkedHashMap<>(8); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 337a7566..63e2a6f5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Pair; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Result; @@ -135,8 +135,8 @@ public class ContextExecutor extends AbstractExecutor { } List rootEntities = insert.getEntities(); for (Object rootEntity : rootEntities) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); + EntityElement entityElement = repository.getEntityElement(); + Object targetEntity = entityElement.getValue(rootEntity); if (targetEntity == null) { continue; } @@ -176,8 +176,8 @@ public class ContextExecutor extends AbstractExecutor { } List rootEntities = entityOp.getEntities(); for (Object rootEntity : rootEntities) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); + EntityElement entityElement = repository.getEntityElement(); + Object targetEntity = entityElement.getValue(rootEntity); if (targetEntity == null) { continue; } @@ -211,8 +211,8 @@ public class ContextExecutor extends AbstractExecutor { } List rootEntities = insertOrUpdate.getEntities(); for (Object rootEntity : rootEntities) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); + EntityElement entityElement = repository.getEntityElement(); + Object targetEntity = entityElement.getValue(rootEntity); if (targetEntity == null) { continue; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 574a2c4f..0cfae98d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; @@ -43,12 +43,12 @@ import java.util.Set; @Setter public class ExampleExecutor extends AbstractProxyExecutor { - private EntityEle entityEle; + private EntityElement entityElement; private EntityMapper entityMapper; - public ExampleExecutor(Executor executor, EntityEle entityEle, EntityMapper entityMapper) { + public ExampleExecutor(Executor executor, EntityElement entityElement, EntityMapper entityMapper) { super(executor); - this.entityEle = entityEle; + this.entityElement = entityElement; this.entityMapper = entityMapper; } @@ -104,7 +104,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void convertUpdate(Update update) { Set nullableProps = update.getNullableProps(); if (nullableProps != null && !nullableProps.isEmpty()) { - nullableProps = entityEle.toAliases(nullableProps); + nullableProps = entityElement.toAliases(nullableProps); update.setNullableProps(nullableProps); } } @@ -112,7 +112,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void convertSelectProps(Example example) { List properties = example.getSelectProps(); if (properties != null && !properties.isEmpty()) { - properties = entityEle.toAliases(properties); + properties = entityElement.toAliases(properties); example.setSelectProps(properties); } } @@ -154,7 +154,7 @@ public class ExampleExecutor extends AbstractProxyExecutor { OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { List properties = orderBy.getProperties(); - properties = entityEle.toAliases(properties); + properties = entityElement.toAliases(properties); orderBy.setProperties(properties); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 3a2788ce..28c0c5fb 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; @@ -44,13 +44,13 @@ import java.util.Map; @Setter public class FactoryExecutor extends AbstractProxyExecutor { - private EntityEle entityEle; + private EntityElement entityElement; private EntityStoreInfo entityStoreInfo; private EntityFactory entityFactory; - public FactoryExecutor(Executor executor, EntityEle entityEle, EntityStoreInfo entityStoreInfo, EntityFactory entityFactory) { + public FactoryExecutor(Executor executor, EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityFactory entityFactory) { super(executor); - this.entityEle = entityEle; + this.entityElement = entityElement; this.entityStoreInfo = entityStoreInfo; this.entityFactory = entityFactory; } @@ -112,7 +112,7 @@ public class FactoryExecutor extends AbstractProxyExecutor { Object persistent = persistentObjs.get(index); Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); if (primaryKey != null) { - entityEle.getIdProxy().setValue(entity, primaryKey); + entityElement.setPrimaryKey(entity, primaryKey); } } } 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 63658d3c..13623a6d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; @@ -37,7 +37,7 @@ import lombok.Setter; @AllArgsConstructor public class DefaultEntityFactory implements EntityFactory { - private EntityEle entityEle; + private EntityElement entityElement; private EntityStoreInfo entityStoreInfo; private EntityMapper entityMapper; private CopyOptions reCopyOptions; @@ -73,7 +73,7 @@ public class DefaultEntityFactory implements EntityFactory { @Override public Object reconstitute(Context context, Object persistent) { - return BeanUtil.toBean(persistent, entityEle.getGenericType(), reCopyOptions); + return BeanUtil.toBean(persistent, entityElement.getGenericType(), reCopyOptions); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java index 01c3b233..337691fc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.factory; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; @@ -38,7 +38,7 @@ import java.util.List; @AllArgsConstructor public class OperationFactory { - private EntityEle entityEle; + private EntityElement entityElement; public Query buildQueryByPK(Object primaryKey) { return new Query(primaryKey); @@ -63,7 +63,7 @@ public class OperationFactory { public Operation buildInsertOrUpdate(Object entity) { List entities = Collections.singletonList(entity); InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); - Object primaryKey = entityEle.getIdProxy().getValue(entity); + Object primaryKey = entityElement.getPrimaryKey(entity); if (primaryKey == null) { insertOrUpdate.setInsert(new Insert(entities)); } else { @@ -77,7 +77,7 @@ public class OperationFactory { List insertList = new ArrayList<>(entities.size()); List updateList = new ArrayList<>(entities.size()); for (Object entity : entities) { - Object primaryKey = entityEle.getIdProxy().getValue(entity); + Object primaryKey = entityElement.getPrimaryKey(entity); if (primaryKey == null) { insertList.add(entity); } else { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java index 6b3cc1f3..ab5f0720 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.joiner; -import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; @@ -110,10 +110,10 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { if (entity == null || object == null) { return; } - PropChain anchorPoint = repository.getAnchorPoint(); - Object value = anchorPoint.getValue(entity); + EntityElement entityElement = repository.getEntityElement(); + Object value = entityElement.getValue(entity); if (value == null) { - anchorPoint.setValue(entity, object); + entityElement.setValue(entity, object); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java index a2c6225f..31662a6f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.impl.joiner; -import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; @@ -42,15 +41,9 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { @Override public Example newExample(Context context, List entities) { - PropChain anchorPoint = repository.getAnchorPoint(); - PropChain lastPropChain = anchorPoint.getLastPropChain(); UnionExample unionExample = new UnionExample(); for (int index = 0; index < entities.size(); index++) { Object entity = entities.get(index); - Object lastEntity = lastPropChain == null ? entity : lastPropChain.getValue(entity); - if (lastEntity == null) { - continue; - } Example example = newExample(context, entity); if (example.isEmpty()) { continue; 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 8cb6277f..d9556a84 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 @@ -23,22 +23,19 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.api.entity.PropChain; -import com.gitee.dorive.api.resolver.PropChainResolver; +import com.gitee.dorive.api.def.EntityDef; +import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.impl.SpELPropProxy; 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 com.gitee.dorive.core.entity.enums.BindingType; import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.binder.BoundBinder; -import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.binder.ValueFilterBinder; -import com.gitee.dorive.core.impl.binder.ValueRouteBinder; -import com.gitee.dorive.core.impl.binder.WeakBinder; +import com.gitee.dorive.core.impl.binder.*; import com.gitee.dorive.core.impl.processor.SpELProcessor; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -47,17 +44,12 @@ import lombok.Data; 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; +import java.util.*; @Data public class BinderResolver { private AbstractContextRepository repository; - private PropChainResolver propChainResolver; private List allBinders; private List strongBinders; @@ -70,17 +62,15 @@ public class BinderResolver { private List selfFields; private JoinType joinType; - public BinderResolver(AbstractContextRepository repository, EntityEle entityEle) { + public BinderResolver(AbstractContextRepository repository, EntityElement entityElement) { this.repository = repository; - this.propChainResolver = new PropChainResolver(entityEle.getEntityType()); } - public void resolve(String accessPath, OrderDef orderDef, EntityEle entityEle) { - Map propChainMap = propChainResolver.getPropChainMap(); - - Class genericType = entityEle.getGenericType(); - String idName = entityEle.getIdName(); - List bindingDefs = entityEle.getBindingDefs(); + public void resolve(String accessPath, EntityElement entityElement) { + Class genericType = entityElement.getGenericType(); + String primaryKey = entityElement.getPrimaryKey(); + EntityDef entityDef = entityElement.getEntityDef(); + List bindingDefs = entityElement.getBindingDefs(); this.allBinders = new ArrayList<>(bindingDefs.size()); this.strongBinders = new ArrayList<>(bindingDefs.size()); @@ -107,11 +97,11 @@ public class BinderResolver { } String field = bindingDef.getField(); - String alias = entityEle.toAlias(field); + String alias = entityElement.toAlias(field); - PropChain fieldPropChain = propChainMap.get("/" + field); + PropProxy propProxy = SpELPropProxy.newPropProxy("#root." + field); + PropChain fieldPropChain = new PropChain(entityElement.getFieldElement(field), propProxy); Assert.notNull(fieldPropChain, fieldErrorMsg, genericType.getName(), field); - fieldPropChain.newPropProxy(); if (bindingType == BindingType.STRONG) { StrongBinder strongBinder = new StrongBinder(bindingDef, processor, fieldPropChain, alias); @@ -124,9 +114,9 @@ public class BinderResolver { List strongBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); strongBinders.add(strongBinder); - if (strongBinder.isSameType() && idName.equals(field)) { - if (orderDef.getPriority() == 0) { - orderDef.setPriority(-1); + if (strongBinder.isSameType() && primaryKey.equals(field)) { + if (entityDef.getPriority() == 0) { + entityDef.setPriority(-1); } boundIdBinder = strongBinder; } @@ -236,14 +226,17 @@ public class BinderResolver { Assert.notNull(belongRepository, "The belong repository cannot be null! bindExp: {}", bindExp); belongRepository.setBoundEntity(true); - PropChainResolver propChainResolver = repository.getPropChainResolver(); - Map propChainMap = propChainResolver.getPropChainMap(); - PropChain boundPropChain = propChainMap.get(bindExp); + EntityElement entityElement = belongRepository.getEntityElement(); + + if (bindExp.startsWith("./")) { + bindExp = StrUtil.removePrefix(bindExp, "./"); + bindExp = "#root." + bindExp; + } + PropProxy propProxy = SpELPropProxy.newPropProxy(bindExp); + PropChain boundPropChain = new PropChain(entityElement.getFieldElement(bindField), propProxy); Assert.notNull(boundPropChain, "The bound property chain cannot be null! bindExp: {}", bindExp); - boundPropChain.newPropProxy(); - EntityEle entityEle = belongRepository.getEntityEle(); - String bindAlias = entityEle.toAlias(bindField); + String bindAlias = entityElement.toAlias(bindField); boundBinder.setBelongAccessPath(belongAccessPath); boundBinder.setBelongRepository(belongRepository); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index d08c52b2..92e43fc8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -19,8 +19,9 @@ package com.gitee.dorive.core.impl.resolver; import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.api.entity.EntityField; +import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.FieldDefinition; import com.gitee.dorive.core.api.factory.Converter; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; @@ -47,27 +48,30 @@ import java.util.Set; @AllArgsConstructor public class EntityMapperResolver { - private EntityEle entityEle; + private EntityElement entityElement; private EntityStoreInfo entityStoreInfo; public EntityMapper newEntityMapper() { - Map entityFieldMap = entityEle.getEntityFieldMap(); + List fieldElements = entityElement.getFieldElements(); Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); - Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); + Map fieldConverterMap = new LinkedHashMap<>(fieldElements.size() * 4 / 3 + 1); List valueObjFields = new ArrayList<>(4); List matchedValueObjFields = new ArrayList<>(4); List unmatchedValueObjFields = new ArrayList<>(4); Set valueObjTypes = new HashSet<>(6); - entityFieldMap.forEach((name, field) -> { - String expected = entityEle.toAlias(name); + for (FieldElement fieldElement : fieldElements) { + FieldDefinition fieldDefinition = fieldElement.getFieldDefinition(); + String fieldName = fieldDefinition.getFieldName(); + + String expected = entityElement.toAlias(fieldName); boolean isMatch = aliasPropMapping.containsKey(expected); String alias = isMatch ? expected : null; String prop = isMatch ? aliasPropMapping.get(alias) : null; Map names = new LinkedHashMap<>(5); - names.put(Domain.ENTITY.name(), name); + names.put(Domain.ENTITY.name(), fieldName); if (alias != null) { names.put(Domain.DATABASE.name(), alias); } @@ -75,10 +79,10 @@ public class EntityMapperResolver { names.put(Domain.POJO.name(), prop); } - FieldDef fieldDef = field.getFieldDef(); + FieldDef fieldDef = fieldElement.getFieldDef(); boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); - Converter converter = newConverter(field, isMatch, isValueObj); - FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, isMatch, names, converter); + Converter converter = newConverter(fieldElement, isMatch, isValueObj); + FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), fieldName, isMatch, names, converter); names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); if (isValueObj) { @@ -88,30 +92,30 @@ public class EntityMapperResolver { } else { unmatchedValueObjFields.add(fieldConverter); } - valueObjTypes.add(field.getGenericType()); + valueObjTypes.add(fieldElement.getGenericType()); } - }); + } return new DefaultEntityMapper(fieldConverterMap, valueObjFields, matchedValueObjFields, unmatchedValueObjFields, valueObjTypes); } - private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { - FieldDef fieldDef = entityField.getFieldDef(); + private Converter newConverter(FieldElement fieldElement, boolean isMatch, boolean isValueObj) { + FieldDef fieldDef = fieldElement.getFieldDef(); if (fieldDef != null) { Class converterClass = fieldDef.getConverter(); if (converterClass != Object.class) { return (Converter) ReflectUtil.newInstance(converterClass); } else if (isValueObj) { - Class genericType = entityField.getGenericType(); + Class genericType = fieldElement.getGenericType(); if (isMatch) { - return !entityField.isCollection() ? new JsonConverter(genericType) : new JsonArrayConverter(genericType); + return !fieldElement.isCollection() ? new JsonConverter(genericType) : new JsonArrayConverter(genericType); } else { return new MapConverter(genericType); } } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { - return new MapExpConverter(entityField); + return new MapExpConverter(fieldElement); } } return null; 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 281e2010..bb4b5887 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 @@ -23,10 +23,10 @@ import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.def.EntityDef; import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.api.entity.EntityType; -import com.gitee.dorive.api.entity.PropChain; -import com.gitee.dorive.api.resolver.PropChainResolver; +import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.EntityDefinition; +import com.gitee.dorive.api.impl.EntityDefinitionReader; +import com.gitee.dorive.api.impl.EntityElementResolver; import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; @@ -66,12 +66,11 @@ import java.util.concurrent.ConcurrentHashMap; @Setter public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { - private static final Map ENTITY_STORE_INFO_MAP = new ConcurrentHashMap<>(); - private static final Map EXAMPLE_EXECUTOR_MAP = new ConcurrentHashMap<>(); + private static final Map ENTITY_STORE_INFO_MAP = new ConcurrentHashMap<>(); + private static final Map EXAMPLE_EXECUTOR_MAP = new ConcurrentHashMap<>(); private ApplicationContext applicationContext; - private PropChainResolver propChainResolver; private DerivedResolver derivedResolver; private Map repositoryMap = new LinkedHashMap<>(); @@ -79,12 +78,12 @@ public abstract class AbstractContextRepository extends AbstractRepositor private List subRepositories = new ArrayList<>(); private List orderedRepositories = new ArrayList<>(); - public static EntityStoreInfo getEntityStoreInfo(EntityEle entityEle) { - return ENTITY_STORE_INFO_MAP.get(entityEle); + public static EntityStoreInfo getEntityStoreInfo(EntityElement entityElement) { + return ENTITY_STORE_INFO_MAP.get(entityElement); } - public static ExampleExecutor getExampleExecutor(EntityEle entityEle) { - return EXAMPLE_EXECUTOR_MAP.get(entityEle); + public static ExampleExecutor getExampleExecutor(EntityElement entityElement) { + return EXAMPLE_EXECUTOR_MAP.get(entityElement); } @Override @@ -95,31 +94,29 @@ public abstract class AbstractContextRepository extends AbstractRepositor @Override public void afterPropertiesSet() throws Exception { Class entityClass = ReflectUtils.getFirstArgumentType(this.getClass()); - EntityType entityType = EntityType.getInstance(entityClass); - Assert.isTrue(entityType.isEntityDef(), "No @Entity annotation found! type: {}", entityType.getName()); - - propChainResolver = new PropChainResolver(entityType); - - CommonRepository rootRepository = newRepository("/", entityType); - repositoryMap.put("/", rootRepository); - this.rootRepository = rootRepository; - orderedRepositories.add(rootRepository); - - Map propChainMap = propChainResolver.getPropChainMap(); - propChainMap.forEach((accessPath, propChain) -> { - if (propChain.isEntityDef()) { - CommonRepository subRepository = newRepository(accessPath, propChain.getEntityField()); - repositoryMap.put(accessPath, subRepository); - subRepositories.add(subRepository); - orderedRepositories.add(subRepository); + + EntityDefinitionReader entityDefinitionReader = new EntityDefinitionReader(); + EntityDefinition entityDefinition = entityDefinitionReader.read(entityClass); + + EntityElementResolver entityElementResolver = new EntityElementResolver(); + Map entityElementMap = entityElementResolver.resolve(entityDefinition); + + entityElementMap.forEach((accessPath, entityElement) -> { + CommonRepository repository = newRepository(accessPath, entityElement); + repositoryMap.put(accessPath, repository); + if ("/".equals(accessPath)) { + rootRepository = repository; + } else { + subRepositories.add(repository); } + orderedRepositories.add(repository); }); - orderedRepositories.sort(Comparator.comparingInt(repository -> repository.getOrderDef().getPriority())); + orderedRepositories.sort(Comparator.comparingInt(repository -> repository.getEntityDef().getPriority())); setEntityDef(rootRepository.getEntityDef()); setOrderDef(rootRepository.getOrderDef()); - setEntityEle(rootRepository.getEntityEle()); + setEntityElement(rootRepository.getEntityElement()); setOperationFactory(rootRepository.getOperationFactory()); derivedResolver = new DerivedResolver(this); @@ -129,28 +126,25 @@ public abstract class AbstractContextRepository extends AbstractRepositor setExecutor(executor); } - private CommonRepository newRepository(String accessPath, EntityEle entityEle) { - EntityDef entityDef = renewEntityDef(entityEle); - OrderDef orderDef = renewOrderDef(entityEle); - OperationFactory operationFactory = new OperationFactory(entityEle); + private CommonRepository newRepository(String accessPath, EntityElement entityElement) { + EntityDef entityDef = renewEntityDef(entityElement); + OrderDef orderDef = renewOrderDef(entityElement); + OperationFactory operationFactory = new OperationFactory(entityElement); - AbstractRepository actualRepository = doNewRepository(entityDef, entityEle, operationFactory); + AbstractRepository actualRepository = doNewRepository(entityDef, entityElement, operationFactory); AbstractRepository proxyRepository = processRepository(actualRepository); boolean isRoot = "/".equals(accessPath); boolean isAggregated = entityDef.getRepository() != Object.class; OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); - Map propChainMap = propChainResolver.getPropChainMap(); - PropChain anchorPoint = propChainMap.get(accessPath); - - BinderResolver binderResolver = new BinderResolver(this, entityEle); - binderResolver.resolve(accessPath, orderDef, entityEle); + BinderResolver binderResolver = new BinderResolver(this, entityElement); + binderResolver.resolve(accessPath, entityElement); CommonRepository repository = new CommonRepository(); repository.setEntityDef(entityDef); repository.setOrderDef(orderDef); - repository.setEntityEle(entityEle); + repository.setEntityElement(entityElement); repository.setOperationFactory(operationFactory); repository.setProxyRepository(proxyRepository); @@ -159,18 +153,17 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setAggregated(isAggregated); repository.setDefaultOrderBy(defaultOrderBy); - repository.setAnchorPoint(anchorPoint); repository.setBinderResolver(binderResolver); repository.setBoundEntity(false); repository.setMatcher(new SelectTypeMatcher(repository)); return repository; } - private EntityDef renewEntityDef(EntityEle entityEle) { - EntityDef entityDef = entityEle.getEntityDef(); + private EntityDef renewEntityDef(EntityElement entityElement) { + EntityDef entityDef = entityElement.getEntityDef(); entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); if (entityDef.isAggregate()) { - Class entityClass = entityEle.getGenericType(); + Class entityClass = entityElement.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); entityDef.setRepository(repositoryClass); @@ -178,13 +171,13 @@ public abstract class AbstractContextRepository extends AbstractRepositor return entityDef; } - private OrderDef renewOrderDef(EntityEle entityEle) { - OrderDef orderDef = entityEle.getOrderDef(); - return orderDef == null ? new OrderDef(0, "", "") : BeanUtil.copyProperties(orderDef, OrderDef.class); + private OrderDef renewOrderDef(EntityElement entityElement) { + OrderDef orderDef = entityElement.getOrderDef(); + return orderDef == null ? new OrderDef("", "") : BeanUtil.copyProperties(orderDef, OrderDef.class); } @SuppressWarnings("unchecked") - private AbstractRepository doNewRepository(EntityDef entityDef, EntityEle entityEle, OperationFactory operationFactory) { + private AbstractRepository doNewRepository(EntityDef entityDef, EntityElement entityElement, OperationFactory operationFactory) { Class repositoryClass = entityDef.getRepository(); Object repository; if (repositoryClass == Object.class) { @@ -195,26 +188,26 @@ public abstract class AbstractContextRepository extends AbstractRepositor if (repository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) repository; defaultRepository.setEntityDef(entityDef); - defaultRepository.setEntityEle(entityEle); + defaultRepository.setEntityElement(entityElement); defaultRepository.setOperationFactory(operationFactory); - EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityEle); - ENTITY_STORE_INFO_MAP.put(entityEle, entityStoreInfo); + EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityElement); + ENTITY_STORE_INFO_MAP.put(entityElement, entityStoreInfo); - EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityEle, entityStoreInfo); + EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); - EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); + EntityFactory entityFactory = newEntityFactory(entityDef, entityElement, entityStoreInfo, entityMapper); - Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); - executor = new FactoryExecutor(executor, entityEle, entityStoreInfo, entityFactory); - executor = new ExampleExecutor(executor, entityEle, entityMapper); - EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); + Executor executor = newExecutor(entityDef, entityElement, entityStoreInfo); + executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); + executor = new ExampleExecutor(executor, entityElement, entityMapper); + EXAMPLE_EXECUTOR_MAP.put(entityElement, (ExampleExecutor) executor); defaultRepository.setExecutor(executor); } return (AbstractRepository) repository; } - private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { + private EntityFactory newEntityFactory(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { @@ -225,7 +218,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor } if (entityFactory instanceof DefaultEntityFactory) { DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; - defaultEntityFactory.setEntityEle(entityEle); + defaultEntityFactory.setEntityElement(entityElement); defaultEntityFactory.setEntityStoreInfo(entityStoreInfo); defaultEntityFactory.setEntityMapper(entityMapper); } @@ -242,9 +235,9 @@ public abstract class AbstractContextRepository extends AbstractRepositor return null; } - protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle); + protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityElement entityElement); - protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo); + protected abstract Executor newExecutor(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo); protected abstract AbstractRepository processRepository(AbstractRepository repository); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java index a1cf2361..60dbc2ed 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 @@ -20,7 +20,7 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.def.EntityDef; import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.Executor; @@ -42,12 +42,12 @@ public abstract class AbstractRepository implements Repository, Ex private EntityDef entityDef; private OrderDef orderDef; - private EntityEle entityEle; + private EntityElement entityElement; private OperationFactory operationFactory; private Executor executor; public Class getEntityClass() { - return entityEle.getGenericType(); + return entityElement.getGenericType(); } @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 81260c3e..bd070449 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 @@ -17,7 +17,6 @@ package com.gitee.dorive.core.repository; -import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; @@ -50,7 +49,6 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher private boolean root; private boolean aggregated; private OrderBy defaultOrderBy; - private PropChain anchorPoint; private BinderResolver binderResolver; private boolean boundEntity; private Matcher matcher; @@ -60,15 +58,15 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher } public boolean isCollection() { - return getEntityEle().isCollection(); + return getEntityElement().isCollection(); } public Object getPrimaryKey(Object entity) { - return getEntityEle().getIdProxy().getValue(entity); + return getEntityElement().getPrimaryKey(entity); } public boolean hasField(String field) { - return getEntityEle().hasField(field); + return getEntityElement().hasField(field); } public JoinType getJoinType() { @@ -92,7 +90,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher if (properties != null && !properties.isEmpty()) { Object primaryKey = query.getPrimaryKey(); if (primaryKey != null) { - Example example = new InnerExample().eq(getEntityEle().getIdName(), primaryKey); + Example example = new InnerExample().eq(getEntityElement().getPrimaryKey(), primaryKey); query.setPrimaryKey(null); query.setExample(example); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 9a0da497..23fe8272 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; import lombok.Setter; @@ -32,8 +32,8 @@ public class ExecutorEvent extends CommonEvent { public Class getEntityClass() { EventExecutor eventExecutor = (EventExecutor) getSource(); - EntityEle entityEle = eventExecutor.getEntityEle(); - return entityEle.getGenericType(); + EntityElement entityElement = eventExecutor.getEntityElement(); + return entityElement.getGenericType(); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java index bceb1182..2918fb0e 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.event.repository.AbstractEventRepository; import lombok.Getter; import lombok.Setter; @@ -32,8 +32,8 @@ public class RepositoryEvent extends CommonEvent { public Class getEntityClass() { AbstractEventRepository repository = (AbstractEventRepository) getSource(); - EntityEle entityEle = repository.getEntityEle(); - return entityEle.getGenericType(); + EntityElement entityElement = repository.getEntityElement(); + return entityElement.getGenericType(); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java index e04bdada..5f3d106f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.executor; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; @@ -32,12 +32,12 @@ import org.springframework.context.ApplicationContext; public class EventExecutor extends AbstractProxyExecutor { private ApplicationContext applicationContext; - private EntityEle entityEle; + private EntityElement entityElement; - public EventExecutor(Executor executor, ApplicationContext applicationContext, EntityEle entityEle) { + public EventExecutor(Executor executor, ApplicationContext applicationContext, EntityElement entityElement) { super(executor); this.applicationContext = applicationContext; - this.entityEle = entityEle; + this.entityElement = entityElement; } @Override 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 5d76d38e..c000644b 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 @@ -17,7 +17,7 @@ package com.gitee.dorive.event.repository; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; @@ -53,9 +53,9 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo } if (actualRepository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) actualRepository; - EntityEle entityEle = defaultRepository.getEntityEle(); + EntityElement entityElement = defaultRepository.getEntityElement(); Executor executor = defaultRepository.getExecutor(); - executor = new EventExecutor(executor, getApplicationContext(), entityEle); + executor = new EventExecutor(executor, getApplicationContext(), entityElement); defaultRepository.setExecutor(executor); } } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java index c0a017c3..6b316710 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java @@ -25,7 +25,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; @@ -62,16 +62,16 @@ import java.util.Set; public class MybatisPlusExecutor extends AbstractExecutor { private EntityDef entityDef; - private EntityEle entityEle; + private EntityElement entityElement; private EntityStoreInfo entityStoreInfo; private BaseMapper baseMapper; private Class pojoClass; private boolean canInsertBatch; @SuppressWarnings("unchecked") - public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { + public MybatisPlusExecutor(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo) { this.entityDef = entityDef; - this.entityEle = entityEle; + this.entityElement = entityElement; this.entityStoreInfo = entityStoreInfo; this.baseMapper = (BaseMapper) entityStoreInfo.getMapper(); this.pojoClass = (Class) entityStoreInfo.getPojoClass(); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 9c5f38fd..b6e5f7ba 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -25,7 +25,7 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.api.ImplFactory; import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; @@ -70,7 +70,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i } @Override - protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle) { + protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityElement entityElement) { Class mapperClass = entityDef.getSource(); Object mapper = null; Class pojoClass = null; @@ -123,8 +123,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i } @Override - protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { - Executor executor = new MybatisPlusExecutor(entityDef, entityEle, entityStoreInfo); + protected Executor newExecutor(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo) { + Executor executor = new MybatisPlusExecutor(entityDef, entityElement, entityStoreInfo); return new UnionExecutor(executor, sqlRunner, entityStoreInfo); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index f2e22a19..c02e2edc 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -132,7 +132,7 @@ public class QueryTypeResolver { CommonRepository repository = mergedRepository.getExecutedRepository(); Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", - queryField.getField(), repository.getEntityEle().getElement(), field); + queryField.getField(), repository.getEntityElement().getGenericType(), field); mergedRepositorySet.add(mergedRepository); } 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 aedd37cd..29268e40 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 @@ -62,7 +62,7 @@ public class RefInjector { private Ref newRefImpl() { RefImpl refImpl = new RefImpl((AbstractRefRepository) repository, entityHandler); refImpl.setEntityDef(repository.getEntityDef()); - refImpl.setEntityEle(repository.getEntityEle()); + refImpl.setEntityElement(repository.getEntityElement()); refImpl.setOperationFactory(repository.getOperationFactory()); refImpl.setExecutor(repository.getExecutor()); return refImpl; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java index 2a027efc..2aeb1bbb 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java @@ -17,7 +17,7 @@ package com.gitee.dorive.sql.entity.common; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,5 +25,5 @@ import lombok.Data; @AllArgsConstructor public class SegmentInfo { private String tableAlias; - private EntityEle entityEle; + private EntityElement entityElement; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java index 2a29fdbe..e9aaa4f7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.count; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryWrapper; @@ -58,11 +58,11 @@ public class DefaultCountQuerier implements CountQuerier { List args = selectSegment.getArgs(); String tableAlias = tableSegment.getTableAlias(); - EntityEle entityEle = repository.getEntityEle(); - String countByExp = buildCountByExp(countQuery, segmentBuilder, tableAlias, entityEle); + EntityElement entityElement = repository.getEntityElement(); + String countByExp = buildCountByExp(countQuery, segmentBuilder, tableAlias, entityElement); String groupByPrefix = tableAlias + "."; - List groupBy = entityEle.toAliases(countQuery.getGroupBy()); + List groupBy = entityElement.toAliases(countQuery.getGroupBy()); String groupByColumns = CollUtil.join(groupBy, ",", groupByPrefix, null); List selectColumns = new ArrayList<>(2); @@ -77,15 +77,15 @@ public class DefaultCountQuerier implements CountQuerier { return countMap; } - private String buildCountByExp(CountQuery countQuery, SegmentBuilder segmentBuilder, String tableAlias, EntityEle entityEle) { + private String buildCountByExp(CountQuery countQuery, SegmentBuilder segmentBuilder, String tableAlias, EntityElement entityElement) { List segmentInfos = segmentBuilder.getMatchedSegmentInfos(); if (segmentInfos != null && !segmentInfos.isEmpty()) { SegmentInfo segmentInfo = segmentInfos.get(0); tableAlias = segmentInfo.getTableAlias(); - entityEle = segmentInfo.getEntityEle(); + entityElement = segmentInfo.getEntityElement(); } String countByPrefix = tableAlias + "."; - List countBy = entityEle.toAliases(countQuery.getCountBy()); + List countBy = entityElement.toAliases(countQuery.getCountBy()); String countByStr = CollUtil.join(countBy, ",',',", countByPrefix, null); StringBuilder countByExp = new StringBuilder(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 9718a04a..54007062 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.executor; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; @@ -62,8 +62,8 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); - EntityEle entityEle = repository.getEntityEle(); - EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); + EntityElement entityElement = repository.getEntityElement(); + EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityElement); String idColumn = entityStoreInfo.getIdColumn(); OrderBy orderBy = example.getOrderBy(); @@ -126,7 +126,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { List> resultMaps = sqlRunner.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get(idColumn), true); if (!primaryKeys.isEmpty()) { - Example newExample = new InnerExample().in(entityEle.getIdName(), primaryKeys); + Example newExample = new InnerExample().in(entityElement.getPrimaryKey(), primaryKeys); List entities = (List) repository.selectByExample(context, newExample); if (page != null) { page.setRecords(entities); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index 3ab1dbbc..7aaab06b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.segment; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.api.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.common.EntityStoreInfo; @@ -72,14 +72,14 @@ public class SegmentBuilder { CommonRepository definedRepository = mergedRepository.getDefinedRepository(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - EntityEle entityEle = executedRepository.getEntityEle(); - EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); - ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityEle); + EntityElement entityElement = executedRepository.getEntityElement(); + EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityElement); + ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityElement); String tableName = entityStoreInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); - SegmentInfo segmentInfo = new SegmentInfo(tableAlias, entityEle); + SegmentInfo segmentInfo = new SegmentInfo(tableAlias, entityElement); boolean isMatch = selector != null && definedRepository.matches(selector); if (isMatch) { matchedSegmentInfos.add(segmentInfo); -- Gitee From 1f2cc99444d72ba4428b5034ca9d4f5535ae13d0 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 22:10:43 +0800 Subject: [PATCH 05/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/ele/FieldElement.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java index 350fc529..5fa40378 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.gitee.dorive.api.ele; import com.gitee.dorive.api.def.FieldDef; @@ -20,7 +37,8 @@ public class FieldElement { } public boolean isSameType(FieldElement fieldElement) { - return fieldDefinition.getTypeName().equals(fieldElement.getFieldDefinition().getTypeName()) && fieldDefinition.getGenericTypeName().equals(fieldElement.getFieldDefinition().getGenericTypeName()); + return fieldDefinition.getTypeName().equals(fieldElement.getFieldDefinition().getTypeName()) + && fieldDefinition.getGenericTypeName().equals(fieldElement.getFieldDefinition().getGenericTypeName()); } } -- Gitee From 483e959565aa4ac1f56e0767cfd98ba5329bdc45 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 22:11:14 +0800 Subject: [PATCH 06/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/impl/PropChain.java | 17 +++++++++++++++++ .../gitee/dorive/api/impl/SpELPropProxy.java | 17 +++++++++++++++++ .../mybatis/plus/injector/EasySqlInjector.java | 17 +++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java index 1217f206..57610d59 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.gitee.dorive.api.impl; import com.gitee.dorive.api.api.PropProxy; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java index a95b0ce8..99a64d59 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.gitee.dorive.api.impl; import com.gitee.dorive.api.api.PropProxy; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java index 20b3b9bf..9941577c 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.gitee.dorive.mybatis.plus.injector; import com.baomidou.mybatisplus.annotation.FieldFill; -- Gitee From 4e221763ac159fb302ddea767e25690e311cbd93 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 22:19:25 +0800 Subject: [PATCH 07/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/ele/EntityElement.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java index c270259d..7e7e2eeb 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java @@ -46,22 +46,10 @@ public class EntityElement implements PropProxy { return entityDefinition.getPrimaryKey(); } - public Object getPrimaryKey(Object entity) { - return ReflectUtil.getFieldValue(entity, getPrimaryKey()); - } - - public void setPrimaryKey(Object entity, Object value) { - ReflectUtil.setFieldValue(entity, getPrimaryKey(), value); - } - public boolean isCollection() { return entityDefinition.isCollection(); } - public boolean hasField(String field) { - return ReflectUtil.hasField(genericType, field); - } - @Override public Object getValue(Object entity) { return ReflectUtil.getFieldValue(entity, entityDefinition.getFieldName()); @@ -72,6 +60,18 @@ public class EntityElement implements PropProxy { ReflectUtil.setFieldValue(entity, entityDefinition.getFieldName(), value); } + public Object getPrimaryKey(Object entity) { + return ReflectUtil.getFieldValue(entity, getPrimaryKey()); + } + + public void setPrimaryKey(Object entity, Object value) { + ReflectUtil.setFieldValue(entity, getPrimaryKey(), value); + } + + public boolean hasField(String field) { + return ReflectUtil.hasField(genericType, field); + } + public FieldElement getFieldElement(String fieldName) { return CollUtil.findOne(fieldElements, fieldElement -> fieldName.equals(fieldElement.getFieldName())); } -- Gitee From c1530fd255a2684142287df75765d614919ab079 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 22:49:16 +0800 Subject: [PATCH 08/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/api/ele/EntityElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java index 7e7e2eeb..9a39585a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java @@ -35,10 +35,10 @@ public class EntityElement implements PropProxy { private EntityDefinition entityDefinition; private String accessPath; - private Class genericType; private EntityDef entityDef; private List bindingDefs; private OrderDef orderDef; + private Class genericType; private List fieldElements; private Map fieldAliasMapping; -- Gitee From c64996be0908f17569cd2fbced30f5354f0b3e05 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 22:50:53 +0800 Subject: [PATCH 09/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/api/ele/FieldElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java index 5fa40378..4a19dcee 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java @@ -25,8 +25,8 @@ import lombok.Data; public class FieldElement { private FieldDefinition fieldDefinition; - private Class genericType; private FieldDef fieldDef; + private Class genericType; public boolean isCollection() { return fieldDefinition.isCollection(); -- Gitee From d3400f08c5f0948290772922eee6c99e97b84f45 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 24 Jun 2024 23:00:26 +0800 Subject: [PATCH 10/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/api/impl/EntityElementResolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index 6fc276e5..4f535e62 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -90,7 +90,6 @@ public class EntityElementResolver { for (FieldDefinition fieldDefinition : fieldDefinitions) { FieldElement fieldElement = new FieldElement(); fieldElement.setFieldDefinition(fieldDefinition); - fieldElement.setGenericType(ClassUtil.loadClass(fieldDefinition.getGenericTypeName())); FieldDef fieldDef = new FieldDef(); fieldDef.setId(fieldDefinition.isPrimary()); @@ -100,6 +99,7 @@ public class EntityElementResolver { fieldDef.setConverter(ClassUtil.loadClass(fieldDefinition.getConverterName())); fieldElement.setFieldDef(fieldDef); + fieldElement.setGenericType(ClassUtil.loadClass(fieldDefinition.getGenericTypeName())); fieldElements.add(fieldElement); } @@ -113,7 +113,7 @@ public class EntityElementResolver { fieldAliasMapping.put(fieldName, alias); } - return new EntityElement(entityDefinition, accessPath, genericType, entityDef, bindingDefs, orderDef, fieldElements, fieldAliasMapping); + return new EntityElement(entityDefinition, accessPath, entityDef, bindingDefs, orderDef, genericType, fieldElements, fieldAliasMapping); } } -- Gitee From afd6fcb746410fafd677100ed58378285477429a Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 10:28:49 +0800 Subject: [PATCH 11/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/annotation/Field.java | 2 +- .../com/gitee/dorive/api/annotation/Id.java | 2 +- .../api/{ => entity}/def/BindingDef.java | 2 +- .../api/{ => entity}/def/EntityDef.java | 2 +- .../dorive/api/{ => entity}/def/FieldDef.java | 4 +- .../dorive/api/{ => entity}/def/OrderDef.java | 2 +- .../api/{ => entity}/ele/EntityElement.java | 8 +- .../api/{ => entity}/ele/FieldElement.java | 4 +- .../api/impl/EntityDefinitionReader.java | 2 +- .../api/impl/EntityElementResolver.java | 24 +++--- .../com/gitee/dorive/api/impl/PropChain.java | 2 +- .../dorive/core/impl/binder/BoundBinder.java | 2 +- .../dorive/core/impl/binder/FieldBinder.java | 2 +- .../dorive/core/impl/binder/StrongBinder.java | 2 +- .../core/impl/binder/ValueFilterBinder.java | 2 +- .../core/impl/binder/ValueRouteBinder.java | 2 +- .../dorive/core/impl/binder/WeakBinder.java | 2 +- .../core/impl/converter/MapExpConverter.java | 4 +- .../core/impl/executor/ContextExecutor.java | 2 +- .../core/impl/executor/ExampleExecutor.java | 2 +- .../core/impl/executor/FactoryExecutor.java | 2 +- .../impl/factory/DefaultEntityFactory.java | 2 +- .../core/impl/factory/OperationFactory.java | 2 +- .../impl/joiner/AbstractEntityJoiner.java | 2 +- .../core/impl/processor/SpELProcessor.java | 2 +- .../core/impl/resolver/BinderResolver.java | 20 ++--- .../impl/resolver/EntityMapperResolver.java | 6 +- .../repository/AbstractContextRepository.java | 84 +++++++++---------- .../core/repository/AbstractRepository.java | 6 +- .../core/repository/CommonRepository.java | 2 +- .../dorive/event/entity/ExecutorEvent.java | 2 +- .../dorive/event/entity/RepositoryEvent.java | 2 +- .../dorive/event/executor/EventExecutor.java | 2 +- .../repository/AbstractEventRepository.java | 2 +- .../plus/executor/MybatisPlusExecutor.java | 4 +- .../repository/MybatisPlusRepository.java | 14 ++-- .../dorive/sql/entity/common/SegmentInfo.java | 2 +- .../sql/impl/count/DefaultCountQuerier.java | 2 +- .../sql/impl/executor/SqlQueryExecutor.java | 2 +- .../sql/impl/segment/SegmentBuilder.java | 2 +- 40 files changed, 111 insertions(+), 125 deletions(-) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/def/BindingDef.java (96%) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/def/EntityDef.java (96%) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/def/FieldDef.java (93%) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/def/OrderDef.java (96%) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/ele/EntityElement.java (94%) rename dorive-api/src/main/java/com/gitee/dorive/api/{ => entity}/ele/FieldElement.java (94%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index fc28e069..7150bcfc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -36,7 +36,7 @@ public @interface Field { /** * 是否主键 */ - boolean id() default false; + boolean primary() default false; /** * 别名 diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java index d1716eb1..4ecdbd0a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -34,7 +34,7 @@ import java.lang.annotation.Target; public @interface Id { @AliasFor(annotation = Field.class) - boolean id() default true; + boolean primary() default true; @AliasFor(annotation = Field.class) String value() default "id"; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java similarity index 96% rename from dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java index 9051cf51..3905bd31 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/BindingDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.api.def; +package com.gitee.dorive.api.entity.def; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java similarity index 96% rename from dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java index ab46936f..21f8ed9f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.api.def; +package com.gitee.dorive.api.entity.def; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java similarity index 93% rename from dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java index c2c8bc79..f1affe72 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.api.def; +package com.gitee.dorive.api.entity.def; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,7 +25,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class FieldDef { - private boolean id; + private boolean primary; private String alias; private boolean valueObj; private String mapExp; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/OrderDef.java similarity index 96% rename from dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/def/OrderDef.java index e8fa927a..db0f8d38 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/OrderDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/OrderDef.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.api.def; +package com.gitee.dorive.api.entity.def; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java similarity index 94% rename from dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java index 9a39585a..5a324d4b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.api.ele; +package com.gitee.dorive.api.entity.ele; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.def.OrderDef; +import com.gitee.dorive.api.entity.def.BindingDef; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.def.OrderDef; import com.gitee.dorive.api.entity.EntityDefinition; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java similarity index 94% rename from dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java index 4a19dcee..37d55787 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/ele/FieldElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.api.ele; +package com.gitee.dorive.api.entity.ele; -import com.gitee.dorive.api.def.FieldDef; +import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.FieldDefinition; import lombok.Data; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 4491cb93..7f3f41fc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -125,7 +125,7 @@ public class EntityDefinitionReader { FieldDefinition fieldDefinition = new FieldDefinition(); if (fieldAnnotation != null) { - fieldDefinition.setPrimary(fieldAnnotation.id()); + fieldDefinition.setPrimary(fieldAnnotation.primary()); fieldDefinition.setAlias(fieldAnnotation.alias()); fieldDefinition.setValueObj(fieldAnnotation.valueObj()); fieldDefinition.setMapExp(fieldAnnotation.mapExp()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index 4f535e62..6631b41c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -19,12 +19,12 @@ package com.gitee.dorive.api.impl; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.ele.EntityElement; -import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.def.BindingDef; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.def.FieldDef; +import com.gitee.dorive.api.entity.def.OrderDef; +import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.FieldElement; import com.gitee.dorive.api.entity.BindingDefinition; import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.entity.FieldDefinition; @@ -40,21 +40,21 @@ import java.util.Map; @Slf4j public class EntityElementResolver { - public Map resolve(EntityDefinition entityDefinition) { - Map entityElementMap = new LinkedHashMap<>(); + public List resolve(EntityDefinition entityDefinition) { + List entityElements = new ArrayList<>(); String accessPath = "/"; EntityElement entityElement = resolveElement(accessPath, entityDefinition); - entityElementMap.put(accessPath, entityElement); + entityElements.add(entityElement); List fieldEntityDefinitions = entityDefinition.getFieldEntityDefinitions(); for (FieldEntityDefinition fieldEntityDefinition : fieldEntityDefinitions) { String fieldAccessPath = "/" + fieldEntityDefinition.getFieldName(); EntityElement fieldEntityElement = resolveElement(fieldAccessPath, fieldEntityDefinition); - entityElementMap.put(fieldAccessPath, fieldEntityElement); + entityElements.add(fieldEntityElement); } - return entityElementMap; + return entityElements; } private EntityElement resolveElement(String accessPath, EntityDefinition entityDefinition) { @@ -92,7 +92,7 @@ public class EntityElementResolver { fieldElement.setFieldDefinition(fieldDefinition); FieldDef fieldDef = new FieldDef(); - fieldDef.setId(fieldDefinition.isPrimary()); + fieldDef.setPrimary(fieldDefinition.isPrimary()); fieldDef.setAlias(fieldDefinition.getAlias()); fieldDef.setValueObj(fieldDefinition.isValueObj()); fieldDef.setMapExp(fieldDefinition.getMapExp()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java index 57610d59..14cd1fcc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java @@ -18,7 +18,7 @@ package com.gitee.dorive.api.impl; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.ele.FieldElement; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java index ac55e072..d21b6cfa 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.binder; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java index 18e0289e..f5ccad75 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.binder; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java index 50eb0c64..818fa583 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.binder; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java index 8baa8d0c..c4193a97 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java index d30aa9ad..c454233d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java index 87e5aa81..75260612 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.binder; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java index c6e89321..a4ee615d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java @@ -18,8 +18,8 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.def.FieldDef; +import com.gitee.dorive.api.entity.ele.FieldElement; import com.gitee.dorive.core.api.factory.Converter; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 63e2a6f5..53d90850 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Pair; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Result; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 0cfae98d..c0d6ad76 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 28c0c5fb..2ec6c00d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; 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 13623a6d..b3f12911 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java index 337691fc..98fdfe1d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.factory; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java index ab5f0720..ffe0cea7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.joiner; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java index 1c84cb96..b9723d72 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.impl.processor; -import com.gitee.dorive.api.def.BindingDef; +import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import org.springframework.expression.EvaluationContext; 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 d9556a84..800623fc 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 @@ -17,16 +17,15 @@ 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.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.def.BindingDef; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.def.BindingDef; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.api.impl.SpELPropProxy; import com.gitee.dorive.core.api.binder.Binder; @@ -62,15 +61,15 @@ public class BinderResolver { private List selfFields; private JoinType joinType; - public BinderResolver(AbstractContextRepository repository, EntityElement entityElement) { + public BinderResolver(AbstractContextRepository repository) { this.repository = repository; } public void resolve(String accessPath, EntityElement entityElement) { - Class genericType = entityElement.getGenericType(); - String primaryKey = entityElement.getPrimaryKey(); EntityDef entityDef = entityElement.getEntityDef(); List bindingDefs = entityElement.getBindingDefs(); + Class genericType = entityElement.getGenericType(); + String primaryKey = entityElement.getPrimaryKey(); this.allBinders = new ArrayList<>(bindingDefs.size()); this.strongBinders = new ArrayList<>(bindingDefs.size()); @@ -85,7 +84,7 @@ public class BinderResolver { for (BindingDef bindingDef : bindingDefs) { BindingType bindingType = determineBindingType(bindingDef); - bindingDef = renewBindingDef(accessPath, bindingDef); + resetBindingDef(accessPath, bindingDef); Processor processor = newProcessor(bindingDef); if (bindingType == BindingType.VALUE_ROUTE) { @@ -165,8 +164,7 @@ public class BinderResolver { throw new RuntimeException("Unknown binding type!"); } - private BindingDef renewBindingDef(String accessPath, BindingDef bindingDef) { - bindingDef = BeanUtil.copyProperties(bindingDef, BindingDef.class); + private void resetBindingDef(String accessPath, BindingDef bindingDef) { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); String bindExp = StrUtil.trim(bindingDef.getBindExp()); @@ -193,7 +191,6 @@ public class BinderResolver { bindingDef.setProcessExp(processExp); bindingDef.setProcessor(processor); bindingDef.setBindField(bindField); - return bindingDef; } private Processor newProcessor(BindingDef bindingDef) { @@ -225,7 +222,6 @@ public class BinderResolver { CommonRepository belongRepository = repositoryMap.get(belongAccessPath); Assert.notNull(belongRepository, "The belong repository cannot be null! bindExp: {}", bindExp); belongRepository.setBoundEntity(true); - EntityElement entityElement = belongRepository.getEntityElement(); if (bindExp.startsWith("./")) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 92e43fc8..1d07f754 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -18,9 +18,9 @@ package com.gitee.dorive.core.impl.resolver; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.def.FieldDef; -import com.gitee.dorive.api.ele.EntityElement; -import com.gitee.dorive.api.ele.FieldElement; +import com.gitee.dorive.api.entity.def.FieldDef; +import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.FieldElement; import com.gitee.dorive.api.entity.FieldDefinition; import com.gitee.dorive.core.api.factory.Converter; import com.gitee.dorive.core.api.factory.EntityMapper; 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 bb4b5887..fdd9e977 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 @@ -17,30 +17,29 @@ package com.gitee.dorive.core.repository; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Order; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.def.OrderDef; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.impl.EntityDefinitionReader; import com.gitee.dorive.api.impl.EntityElementResolver; import com.gitee.dorive.api.util.ReflectUtils; -import com.gitee.dorive.core.api.factory.EntityFactory; -import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.impl.context.SelectTypeMatcher; -import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; +import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; @@ -55,11 +54,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Getter @@ -99,10 +94,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityDefinition entityDefinition = entityDefinitionReader.read(entityClass); EntityElementResolver entityElementResolver = new EntityElementResolver(); - Map entityElementMap = entityElementResolver.resolve(entityDefinition); + List entityElements = entityElementResolver.resolve(entityDefinition); - entityElementMap.forEach((accessPath, entityElement) -> { - CommonRepository repository = newRepository(accessPath, entityElement); + for (EntityElement entityElement : entityElements) { + String accessPath = entityElement.getAccessPath(); + CommonRepository repository = newRepository(entityElement); repositoryMap.put(accessPath, repository); if ("/".equals(accessPath)) { rootRepository = repository; @@ -110,12 +106,10 @@ public abstract class AbstractContextRepository extends AbstractRepositor subRepositories.add(repository); } orderedRepositories.add(repository); - }); + } - orderedRepositories.sort(Comparator.comparingInt(repository -> repository.getEntityDef().getPriority())); + orderedRepositories.sort(Comparator.comparingInt(repository -> repository.getEntityElement().getEntityDef().getPriority())); - setEntityDef(rootRepository.getEntityDef()); - setOrderDef(rootRepository.getOrderDef()); setEntityElement(rootRepository.getEntityElement()); setOperationFactory(rootRepository.getOperationFactory()); @@ -126,24 +120,26 @@ public abstract class AbstractContextRepository extends AbstractRepositor setExecutor(executor); } - private CommonRepository newRepository(String accessPath, EntityElement entityElement) { - EntityDef entityDef = renewEntityDef(entityElement); - OrderDef orderDef = renewOrderDef(entityElement); + private CommonRepository newRepository(EntityElement entityElement) { + resetEntityDef(entityElement); + + String accessPath = entityElement.getAccessPath(); + EntityDef entityDef = entityElement.getEntityDef(); + OrderDef orderDef = entityElement.getOrderDef(); + OperationFactory operationFactory = new OperationFactory(entityElement); - AbstractRepository actualRepository = doNewRepository(entityDef, entityElement, operationFactory); + AbstractRepository actualRepository = doNewRepository(entityElement, operationFactory); AbstractRepository proxyRepository = processRepository(actualRepository); boolean isRoot = "/".equals(accessPath); boolean isAggregated = entityDef.getRepository() != Object.class; OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); - BinderResolver binderResolver = new BinderResolver(this, entityElement); + BinderResolver binderResolver = new BinderResolver(this); binderResolver.resolve(accessPath, entityElement); CommonRepository repository = new CommonRepository(); - repository.setEntityDef(entityDef); - repository.setOrderDef(orderDef); repository.setEntityElement(entityElement); repository.setOperationFactory(operationFactory); repository.setProxyRepository(proxyRepository); @@ -159,25 +155,19 @@ public abstract class AbstractContextRepository extends AbstractRepositor return repository; } - private EntityDef renewEntityDef(EntityElement entityElement) { + private void resetEntityDef(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); - entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); if (entityDef.isAggregate()) { Class entityClass = entityElement.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); entityDef.setRepository(repositoryClass); } - return entityDef; - } - - private OrderDef renewOrderDef(EntityElement entityElement) { - OrderDef orderDef = entityElement.getOrderDef(); - return orderDef == null ? new OrderDef("", "") : BeanUtil.copyProperties(orderDef, OrderDef.class); } @SuppressWarnings("unchecked") - private AbstractRepository doNewRepository(EntityDef entityDef, EntityElement entityElement, OperationFactory operationFactory) { + private AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { + EntityDef entityDef = entityElement.getEntityDef(); Class repositoryClass = entityDef.getRepository(); Object repository; if (repositoryClass == Object.class) { @@ -187,18 +177,17 @@ public abstract class AbstractContextRepository extends AbstractRepositor } if (repository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) repository; - defaultRepository.setEntityDef(entityDef); defaultRepository.setEntityElement(entityElement); defaultRepository.setOperationFactory(operationFactory); - EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityElement); + EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityElement); ENTITY_STORE_INFO_MAP.put(entityElement, entityStoreInfo); EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); EntityFactory entityFactory = newEntityFactory(entityDef, entityElement, entityStoreInfo, entityMapper); - Executor executor = newExecutor(entityDef, entityElement, entityStoreInfo); + Executor executor = newExecutor(entityElement, entityStoreInfo); executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); executor = new ExampleExecutor(executor, entityElement, entityMapper); EXAMPLE_EXECUTOR_MAP.put(entityElement, (ExampleExecutor) executor); @@ -226,18 +215,23 @@ public abstract class AbstractContextRepository extends AbstractRepositor } private OrderBy newDefaultOrderBy(OrderDef orderDef) { - String sortBy = orderDef.getSortBy(); - String order = orderDef.getOrder().toUpperCase(); - if (StringUtils.isNotBlank(sortBy) && (Order.ASC.equals(order) || Order.DESC.equals(order))) { - List properties = StrUtil.splitTrim(sortBy, ","); - return new OrderBy(properties, order); + if (orderDef != null) { + String sortBy = orderDef.getSortBy(); + String order = orderDef.getOrder(); + if (StringUtils.isNotBlank(sortBy) && StringUtils.isNotBlank(order)) { + order = order.toUpperCase(); + if (Order.ASC.equals(order) || Order.DESC.equals(order)) { + List properties = StrUtil.splitTrim(sortBy, ","); + return new OrderBy(properties, order); + } + } } return null; } - protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityElement entityElement); + protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityElement entityElement); - protected abstract Executor newExecutor(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo); + protected abstract Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo); protected abstract AbstractRepository processRepository(AbstractRepository repository); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java index 60dbc2ed..3882ff2a 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 @@ -18,9 +18,7 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.def.OrderDef; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.Executor; @@ -40,8 +38,6 @@ import java.util.List; @Setter public abstract class AbstractRepository implements Repository, Executor { - private EntityDef entityDef; - private OrderDef orderDef; private EntityElement entityElement; private OperationFactory operationFactory; private Executor executor; 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 bd070449..67ed268e 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 @@ -54,7 +54,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher private Matcher matcher; public String getName() { - return getEntityDef().getName(); + return getEntityElement().getEntityDef().getName(); } public boolean isCollection() { diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 23fe8272..f032014d 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java index 2918fb0e..da579ba8 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.event.repository.AbstractEventRepository; import lombok.Getter; import lombok.Setter; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java index 5f3d106f..707dd30d 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.executor; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; 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 c000644b..482b648f 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 @@ -17,7 +17,7 @@ package com.gitee.dorive.event.repository; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java index 6b316710..518ca3b3 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java @@ -24,8 +24,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gitee.dorive.api.constant.Order; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index b6e5f7ba..d3d399f6 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -24,8 +24,8 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.api.ImplFactory; -import com.gitee.dorive.api.def.EntityDef; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; @@ -70,7 +70,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i } @Override - protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityElement entityElement) { + protected EntityStoreInfo resolveEntityStoreInfo(EntityElement entityElement) { + EntityDef entityDef = entityElement.getEntityDef(); Class mapperClass = entityDef.getSource(); Object mapper = null; Class pojoClass = null; @@ -118,13 +119,12 @@ public class MybatisPlusRepository extends AbstractRefRepository i List columns = new ArrayList<>(propAliasMapping.values()); String selectColumns = StrUtil.join(",", columns); - return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, - propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns); + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns); } @Override - protected Executor newExecutor(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo) { - Executor executor = new MybatisPlusExecutor(entityDef, entityElement, entityStoreInfo); + protected Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo) { + Executor executor = new MybatisPlusExecutor(entityElement.getEntityDef(), entityElement, entityStoreInfo); return new UnionExecutor(executor, sqlRunner, entityStoreInfo); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java index 2aeb1bbb..00e24d8a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java @@ -17,7 +17,7 @@ package com.gitee.dorive.sql.entity.common; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java index e9aaa4f7..ba2beeb4 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.count; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryWrapper; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 54007062..3b042b33 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.executor; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index 7aaab06b..0c633a59 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.sql.impl.segment; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.api.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -- Gitee From 9207866e3ed05ef391a67f2aee362c2ea2254cfa Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 11:10:54 +0800 Subject: [PATCH 12/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/impl/EntityDefinitionReader.java | 5 +++++ .../java/com/gitee/dorive/query/entity/MergedRepository.java | 2 +- .../src/main/java/com/gitee/dorive/ref/impl/RefInjector.java | 1 - 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 7f3f41fc..fe36f4dc 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -89,7 +89,12 @@ public class EntityDefinitionReader { List fieldDefinitions = new ArrayList<>(); List fieldEntityDefinitions = new ArrayList<>(); List fields = ReflectUtils.getAllFields(type); + // 去重 + Map fieldMap = new LinkedHashMap<>(); for (Field field : fields) { + fieldMap.put(field.getName(), field); + } + for (Field field : fieldMap.values()) { if (!Modifier.isStatic(field.getModifiers())) { Entity entity = AnnotationUtils.getAnnotation(field, Entity.class); if (entity == null) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index 3221e7be..a4aabb8a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -41,7 +41,7 @@ public class MergedRepository { private Integer order; public String getName() { - return definedRepository.getEntityDef().getName(); + return definedRepository.getEntityElement().getEntityDef().getName(); } } 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 29268e40..b95b86b5 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 @@ -61,7 +61,6 @@ public class RefInjector { @SuppressWarnings("unchecked") private Ref newRefImpl() { RefImpl refImpl = new RefImpl((AbstractRefRepository) repository, entityHandler); - refImpl.setEntityDef(repository.getEntityDef()); refImpl.setEntityElement(repository.getEntityElement()); refImpl.setOperationFactory(repository.getOperationFactory()); refImpl.setExecutor(repository.getExecutor()); -- Gitee From 1f5fb0bfda463d934e7f6350d96716c26eaf5ace Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 11:24:21 +0800 Subject: [PATCH 13/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/api/impl/EntityDefinitionReader.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index fe36f4dc..522bc7b6 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -145,6 +145,9 @@ public class EntityDefinitionReader { if ("id".equals(fieldName)) { fieldDefinition.setPrimary(true); } + if (StringUtils.isBlank(fieldDefinition.getAlias())) { + fieldDefinition.setAlias(StrUtil.toUnderlineCase(fieldName)); + } fieldDefinition.setTypeName(type.getName()); fieldDefinition.setCollection(collection); fieldDefinition.setGenericTypeName(genericType.getName()); -- Gitee From b41416d39be7bb0f26932e642be6d877cc008b86 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 13:13:35 +0800 Subject: [PATCH 14/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/impl/EntityElementResolver.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index 6631b41c..97771e3d 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -43,14 +43,13 @@ public class EntityElementResolver { public List resolve(EntityDefinition entityDefinition) { List entityElements = new ArrayList<>(); - String accessPath = "/"; - EntityElement entityElement = resolveElement(accessPath, entityDefinition); + EntityElement entityElement = resolveElement("/", entityDefinition); entityElements.add(entityElement); List fieldEntityDefinitions = entityDefinition.getFieldEntityDefinitions(); for (FieldEntityDefinition fieldEntityDefinition : fieldEntityDefinitions) { - String fieldAccessPath = "/" + fieldEntityDefinition.getFieldName(); - EntityElement fieldEntityElement = resolveElement(fieldAccessPath, fieldEntityDefinition); + String fieldName = fieldEntityDefinition.getFieldName(); + EntityElement fieldEntityElement = resolveElement("/" + fieldName, fieldEntityDefinition); entityElements.add(fieldEntityElement); } @@ -58,8 +57,6 @@ public class EntityElementResolver { } private EntityElement resolveElement(String accessPath, EntityDefinition entityDefinition) { - Class genericType = ClassUtil.loadClass(entityDefinition.getGenericTypeName()); - EntityDef entityDef = new EntityDef(); entityDef.setName(entityDefinition.getName()); entityDef.setSource(ClassUtil.loadClass(entityDefinition.getSourceName())); @@ -85,6 +82,8 @@ public class EntityElementResolver { orderDef.setSortBy(entityDefinition.getSortBy()); orderDef.setOrder(entityDefinition.getOrder()); + Class genericType = ClassUtil.loadClass(entityDefinition.getGenericTypeName()); + List fieldDefinitions = entityDefinition.getFieldDefinitions(); List fieldElements = new ArrayList<>(fieldDefinitions.size()); for (FieldDefinition fieldDefinition : fieldDefinitions) { @@ -105,8 +104,8 @@ public class EntityElementResolver { Map fieldAliasMapping = new LinkedHashMap<>(fieldDefinitions.size() * 4 / 3 + 1); for (FieldDefinition fieldDefinition : fieldDefinitions) { - String alias = fieldDefinition.getAlias(); String fieldName = fieldDefinition.getFieldName(); + String alias = fieldDefinition.getAlias(); if (StringUtils.isBlank(alias)) { alias = StrUtil.toUnderlineCase(fieldName); } -- Gitee From 232b7342ac855c69026f91199604980ad3908a40 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 13:53:59 +0800 Subject: [PATCH 15/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/api/entity/ele/FieldElement.java | 5 +++-- .../com/gitee/dorive/core/impl/resolver/BinderResolver.java | 5 ++--- pom.xml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java index 37d55787..33d2097c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java @@ -37,8 +37,9 @@ public class FieldElement { } public boolean isSameType(FieldElement fieldElement) { - return fieldDefinition.getTypeName().equals(fieldElement.getFieldDefinition().getTypeName()) - && fieldDefinition.getGenericTypeName().equals(fieldElement.getFieldDefinition().getGenericTypeName()); + FieldDefinition targetFieldDefinition = fieldElement.getFieldDefinition(); + return fieldDefinition.getTypeName().equals(targetFieldDefinition.getTypeName()) + && fieldDefinition.getGenericTypeName().equals(targetFieldDefinition.getGenericTypeName()); } } 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 800623fc..92c110d8 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 @@ -224,9 +224,8 @@ public class BinderResolver { belongRepository.setBoundEntity(true); EntityElement entityElement = belongRepository.getEntityElement(); - if (bindExp.startsWith("./")) { - bindExp = StrUtil.removePrefix(bindExp, "./"); - bindExp = "#root." + bindExp; + if (bindExp.startsWith("/")) { + bindExp = "#root" + StrUtil.replace(bindExp, "/", "."); } PropProxy propProxy = SpELPropProxy.newPropProxy(bindExp); PropChain boundPropChain = new PropChain(entityElement.getFieldElement(bindField), propProxy); diff --git a/pom.xml b/pom.xml index 2b5aca38..652a449d 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ cn.hutool hutool-all - 5.8.25 + 5.8.12 org.javassist -- Gitee From 552ee70b532e9fab0f240f668db9c057590f05e8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 14:22:52 +0800 Subject: [PATCH 16/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/impl/EntityDefinitionReader.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 522bc7b6..f11501b7 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -24,15 +24,14 @@ import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.annotation.Binding; import com.gitee.dorive.api.annotation.Entity; import com.gitee.dorive.api.annotation.Order; -import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.api.entity.BindingDefinition; import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.entity.FieldDefinition; import com.gitee.dorive.api.entity.FieldEntityDefinition; +import com.gitee.dorive.api.util.ReflectUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.core.annotation.AnnotationUtils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -65,7 +64,7 @@ public class EntityDefinitionReader { } private EntityDefinition doRead(Class type) { - Entity entity = AnnotationUtils.getAnnotation(type, Entity.class); + Entity entity = AnnotatedElementUtils.getMergedAnnotation(type, Entity.class); Assert.notNull(entity, "The @Entity does not exist!"); assert entity != null; String name = entity.name(); @@ -96,7 +95,7 @@ public class EntityDefinitionReader { } for (Field field : fieldMap.values()) { if (!Modifier.isStatic(field.getModifiers())) { - Entity entity = AnnotationUtils.getAnnotation(field, Entity.class); + Entity entity = AnnotatedElementUtils.getMergedAnnotation(field, Entity.class); if (entity == null) { FieldDefinition fieldDefinition = readField(field); if (fieldDefinition.isPrimary()) { @@ -116,7 +115,7 @@ public class EntityDefinitionReader { } private FieldDefinition readField(Field field) { - com.gitee.dorive.api.annotation.Field fieldAnnotation = AnnotationUtils.getAnnotation(field, com.gitee.dorive.api.annotation.Field.class); + com.gitee.dorive.api.annotation.Field fieldAnnotation = AnnotatedElementUtils.getMergedAnnotation(field, com.gitee.dorive.api.annotation.Field.class); Class type = field.getType(); boolean collection = false; Class genericType = field.getType(); @@ -157,7 +156,7 @@ public class EntityDefinitionReader { private FieldEntityDefinition readFieldEntity(Entity entity, Field field) { boolean aggregate = entity.aggregate(); - Order order = AnnotationUtils.getAnnotation(field, Order.class); + Order order = AnnotatedElementUtils.getMergedAnnotation(field, Order.class); Class type = field.getType(); boolean collection = false; Class genericType = field.getType(); -- Gitee From 7520ee6d2e92cccce4dcc6f6265084f97574c53c Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 15:01:43 +0800 Subject: [PATCH 17/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/impl/SpELPropProxy.java | 6 +++--- .../com/gitee/dorive/core/impl/resolver/BinderResolver.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java index 99a64d59..ac7c81c3 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java @@ -40,14 +40,14 @@ public class SpELPropProxy implements PropProxy { @Override public Object getValue(Object entity) { EvaluationContext context = new StandardEvaluationContext(); - context.setVariable("root", entity); - return expression.getValue(context); + context.setVariable("entity", entity); + return expression.getValue(context, Object.class); } @Override public void setValue(Object entity, Object value) { EvaluationContext context = new StandardEvaluationContext(); - context.setVariable("root", entity); + context.setVariable("entity", entity); expression.setValue(context, value); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java index 92c110d8..c96263ec 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 @@ -98,7 +98,7 @@ public class BinderResolver { String field = bindingDef.getField(); String alias = entityElement.toAlias(field); - PropProxy propProxy = SpELPropProxy.newPropProxy("#root." + field); + PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + field); PropChain fieldPropChain = new PropChain(entityElement.getFieldElement(field), propProxy); Assert.notNull(fieldPropChain, fieldErrorMsg, genericType.getName(), field); @@ -225,7 +225,7 @@ public class BinderResolver { EntityElement entityElement = belongRepository.getEntityElement(); if (bindExp.startsWith("/")) { - bindExp = "#root" + StrUtil.replace(bindExp, "/", "."); + bindExp = "#entity" + StrUtil.replace(bindExp, "/", "."); } PropProxy propProxy = SpELPropProxy.newPropProxy(bindExp); PropChain boundPropChain = new PropChain(entityElement.getFieldElement(bindField), propProxy); -- Gitee From f83ac5cf3607a79561134dac39e0880ce3aa17d5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 15:31:36 +0800 Subject: [PATCH 18/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmap=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=B8=8D=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/entity/ele/EntityElement.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java index 5a324d4b..729f4d0c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java @@ -20,16 +20,18 @@ package com.gitee.dorive.api.entity.ele; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.api.PropProxy; +import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.def.OrderDef; -import com.gitee.dorive.api.entity.EntityDefinition; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.util.*; -@Data +@Getter +@Setter @AllArgsConstructor public class EntityElement implements PropProxy { -- Gitee From cf344bfcd53178d223616ec1a5312da86fb8472c Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 16:28:06 +0800 Subject: [PATCH 19/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E9=9D=9E=E5=AD=97=E6=AE=B5=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/impl/EntityDefinitionReader.java | 15 ++++++++------- .../dorive/core/impl/resolver/BinderResolver.java | 11 ++++++++--- .../repository/AbstractContextRepository.java | 2 -- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index f11501b7..63950683 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -95,14 +95,15 @@ public class EntityDefinitionReader { } for (Field field : fieldMap.values()) { if (!Modifier.isStatic(field.getModifiers())) { + // 所有字段 + FieldDefinition fieldDefinition = readField(field); + if (fieldDefinition.isPrimary()) { + entityDefinition.setPrimaryKey(fieldDefinition.getFieldName()); + } + fieldDefinitions.add(fieldDefinition); + // 实体字段 Entity entity = AnnotatedElementUtils.getMergedAnnotation(field, Entity.class); - if (entity == null) { - FieldDefinition fieldDefinition = readField(field); - if (fieldDefinition.isPrimary()) { - entityDefinition.setPrimaryKey(fieldDefinition.getFieldName()); - } - fieldDefinitions.add(fieldDefinition); - } else { + if (entity != null) { FieldEntityDefinition fieldEntityDefinition = readFieldEntity(entity, field); if (fieldEntityDefinition != null) { fieldEntityDefinitions.add(fieldEntityDefinition); 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 c96263ec..9bf5187c 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 @@ -26,6 +26,7 @@ import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.api.entity.ele.FieldElement; import com.gitee.dorive.api.impl.PropChain; import com.gitee.dorive.api.impl.SpELPropProxy; import com.gitee.dorive.core.api.binder.Binder; @@ -222,16 +223,20 @@ public class BinderResolver { CommonRepository belongRepository = repositoryMap.get(belongAccessPath); Assert.notNull(belongRepository, "The belong repository cannot be null! bindExp: {}", bindExp); belongRepository.setBoundEntity(true); - EntityElement entityElement = belongRepository.getEntityElement(); + CommonRepository rootRepository = repository.getRootRepository(); + EntityElement entityElement = rootRepository.getEntityElement(); + String field = PathUtils.getLastName(bindExp); + FieldElement fieldElement = entityElement.getFieldElement(field); if (bindExp.startsWith("/")) { bindExp = "#entity" + StrUtil.replace(bindExp, "/", "."); } PropProxy propProxy = SpELPropProxy.newPropProxy(bindExp); - PropChain boundPropChain = new PropChain(entityElement.getFieldElement(bindField), propProxy); + PropChain boundPropChain = new PropChain(fieldElement, propProxy); Assert.notNull(boundPropChain, "The bound property chain cannot be null! bindExp: {}", bindExp); - String bindAlias = entityElement.toAlias(bindField); + EntityElement belongEntityElement = belongRepository.getEntityElement(); + String bindAlias = belongEntityElement.toAlias(bindField); boundBinder.setBelongAccessPath(belongAccessPath); boundBinder.setBelongRepository(belongRepository); 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 fdd9e977..ac3d90df 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 @@ -107,14 +107,12 @@ public abstract class AbstractContextRepository extends AbstractRepositor } orderedRepositories.add(repository); } - orderedRepositories.sort(Comparator.comparingInt(repository -> repository.getEntityElement().getEntityDef().getPriority())); setEntityElement(rootRepository.getEntityElement()); setOperationFactory(rootRepository.getOperationFactory()); derivedResolver = new DerivedResolver(this); - EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); Executor executor = new ContextExecutor(this, entityHandler); setExecutor(executor); -- Gitee From 0593eee4f29c1794bcab095fb2abec077a66812b Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 16:57:19 +0800 Subject: [PATCH 20/77] =?UTF-8?q?=E8=A7=A3=E5=86=B3hutool=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=B8=A6=E6=9D=A5=E7=9A=84bean?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/def/EntityListenerDef.java | 14 ++++++++++---- .../dorive/query/entity/def/QueryScanDef.java | 13 +++++++++---- pom.xml | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java index 323bacbd..ca506bee 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java @@ -17,7 +17,6 @@ package com.gitee.dorive.event.def; -import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.event.annotation.EntityListener; import com.gitee.dorive.event.enums.OperationType; import lombok.AllArgsConstructor; @@ -26,7 +25,6 @@ import lombok.NoArgsConstructor; import org.springframework.core.annotation.AnnotatedElementUtils; import java.lang.reflect.AnnotatedElement; -import java.util.Map; @Data @NoArgsConstructor @@ -39,8 +37,16 @@ public class EntityListenerDef { private Class[] rollbackFor; public static EntityListenerDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, EntityListener.class); - return attributes != null ? BeanUtil.copyProperties(attributes, EntityListenerDef.class) : null; + EntityListener entityListener = AnnotatedElementUtils.getMergedAnnotation(element, EntityListener.class); + if (entityListener != null) { + EntityListenerDef entityListenerDef = new EntityListenerDef(); + entityListenerDef.setValue(entityListener.value()); + entityListenerDef.setSubscribeTo(entityListener.subscribeTo()); + entityListenerDef.setAfterCommit(entityListener.afterCommit()); + entityListenerDef.setRollbackFor(entityListener.rollbackFor()); + return entityListenerDef; + } + return null; } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java index a3838549..a0386596 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java @@ -17,7 +17,6 @@ package com.gitee.dorive.query.entity.def; -import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.query.annotation.QueryScan; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,7 +24,6 @@ import lombok.NoArgsConstructor; import org.springframework.core.annotation.AnnotatedElementUtils; import java.lang.reflect.AnnotatedElement; -import java.util.Map; @Data @NoArgsConstructor @@ -37,8 +35,15 @@ public class QueryScanDef { private Class[] queries; public static QueryScanDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, QueryScan.class); - return attributes != null ? BeanUtil.copyProperties(attributes, QueryScanDef.class) : null; + QueryScan queryScan = AnnotatedElementUtils.getMergedAnnotation(element, QueryScan.class); + if (queryScan != null) { + QueryScanDef queryScanDef = new QueryScanDef(); + queryScanDef.setValue(queryScan.value()); + queryScanDef.setRegex(queryScan.regex()); + queryScanDef.setQueries(queryScan.queries()); + return queryScanDef; + } + return null; } } diff --git a/pom.xml b/pom.xml index 652a449d..2b5aca38 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ cn.hutool hutool-all - 5.8.12 + 5.8.25 org.javassist -- Gitee From d1c5fc23c2e635045b1e11520367c858b8723460 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 17:05:14 +0800 Subject: [PATCH 21/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Aggregate.java | 5 +---- .../src/main/java/com/gitee/dorive/api/annotation/Alias.java | 3 +++ .../main/java/com/gitee/dorive/api/annotation/Binding.java | 5 +---- .../main/java/com/gitee/dorive/api/annotation/Bindings.java | 3 +++ .../main/java/com/gitee/dorive/api/annotation/Entity.java | 5 +---- .../src/main/java/com/gitee/dorive/api/annotation/Field.java | 5 +---- .../src/main/java/com/gitee/dorive/api/annotation/Id.java | 3 +++ .../src/main/java/com/gitee/dorive/api/annotation/Order.java | 5 +---- .../java/com/gitee/dorive/api/annotation/Repository.java | 3 +++ .../main/java/com/gitee/dorive/api/annotation/ValueObj.java | 3 +++ 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index 303c5d2b..c28092cb 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -27,10 +27,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 聚合注解
- * wiki:https://gitee.com/digital-engine/dorive/wikis/pages - * - * @author tao.chen + * 聚合 */ @Entity @Inherited diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java index 4a482035..43de2fe1 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java @@ -26,6 +26,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 别名 + */ @Field @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java index c0c7c987..69069573 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java @@ -20,10 +20,7 @@ package com.gitee.dorive.api.annotation; import java.lang.annotation.*; /** - * 绑定注解
- * wiki:https://gitee.com/digital-engine/dorive/wikis/pages - * - * @author tao.chen + * 绑定 */ @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Bindings.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Bindings.java index 77f28544..ae4a6e94 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Bindings.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Bindings.java @@ -19,6 +19,9 @@ package com.gitee.dorive.api.annotation; import java.lang.annotation.*; +/** + * 绑定 + */ @Inherited @Documented @Target(ElementType.FIELD) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index 15c7b8b2..f959b2ec 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -20,10 +20,7 @@ package com.gitee.dorive.api.annotation; import java.lang.annotation.*; /** - * 实体注解
- * wiki:https://gitee.com/digital-engine/dorive/wikis/pages - * - * @author tao.chen + * 实体 */ @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index 7150bcfc..617ee141 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -22,10 +22,7 @@ import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; /** - * 字段注解
- * wiki:https://gitee.com/digital-engine/dorive/wikis/pages - * - * @author tao.chen + * 字段 */ @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java index 4ecdbd0a..04dc5938 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -26,6 +26,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 主键 + */ @Field @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java index e22ac71b..3242a597 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java @@ -25,10 +25,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 排序注解
- * wiki:https://gitee.com/digital-engine/dorive/wikis/pages - * - * @author tao.chen + * 排序 */ @Inherited @Documented 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 0e1b9cff..e17fa07a 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 @@ -22,6 +22,9 @@ import org.springframework.stereotype.Component; import java.lang.annotation.*; +/** + * 仓储 + */ @Component @Inherited @Documented diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java index 752f755d..929d4f1e 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java @@ -26,6 +26,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 值对象 + */ @Field @Inherited @Documented -- Gitee From 4f84819f510fe187844fdb8f55fec4a20f288168 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 17:07:26 +0800 Subject: [PATCH 22/77] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/{impl => entity/ele}/PropChain.java | 3 +-- .../java/com/gitee/dorive/core/impl/binder/BoundBinder.java | 2 +- .../java/com/gitee/dorive/core/impl/binder/FieldBinder.java | 2 +- .../java/com/gitee/dorive/core/impl/binder/StrongBinder.java | 2 +- .../com/gitee/dorive/core/impl/binder/ValueFilterBinder.java | 2 +- .../com/gitee/dorive/core/impl/binder/ValueRouteBinder.java | 2 +- .../java/com/gitee/dorive/core/impl/binder/WeakBinder.java | 2 +- .../com/gitee/dorive/core/impl/resolver/BinderResolver.java | 2 +- 8 files changed, 8 insertions(+), 9 deletions(-) rename dorive-api/src/main/java/com/gitee/dorive/api/{impl => entity/ele}/PropChain.java (94%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java similarity index 94% rename from dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java rename to dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java index 14cd1fcc..c15d3447 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/PropChain.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java @@ -15,10 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.api.impl; +package com.gitee.dorive.api.entity.ele; import com.gitee.dorive.api.api.PropProxy; -import com.gitee.dorive.api.entity.ele.FieldElement; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java index d21b6cfa..c31b4329 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java index f5ccad75..3832bd18 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java index 818fa583..46e404f8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java index c4193a97..c27eb070 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java index c454233d..9d6151e4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java index 75260612..b40f8e0c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; 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 9bf5187c..e6989a13 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java @@ -27,7 +27,7 @@ import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.api.entity.ele.FieldElement; -import com.gitee.dorive.api.impl.PropChain; +import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.api.impl.SpELPropProxy; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; -- Gitee From 98a3e803e5af14e6ea6c0e85a2f8c2ed9cfb7d2a Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 17:29:02 +0800 Subject: [PATCH 23/77] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/repository/AbstractContextRepository.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 ac3d90df..165ac998 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 @@ -183,7 +183,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); - EntityFactory entityFactory = newEntityFactory(entityDef, entityElement, entityStoreInfo, entityMapper); + EntityFactory entityFactory = newEntityFactory(entityElement, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityElement, entityStoreInfo); executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); @@ -194,7 +194,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor return (AbstractRepository) repository; } - private EntityFactory newEntityFactory(EntityDef entityDef, EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { + private EntityFactory newEntityFactory(EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { + EntityDef entityDef = entityElement.getEntityDef(); Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { -- Gitee From 12333bf8e0689f0180b665577ebee5c1c092a737 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 18:28:08 +0800 Subject: [PATCH 24/77] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 9 +- dorive-proxy/pom.xml | 22 - .../gitee/dorive/proxy/AbstractCompiler.java | 70 --- .../gitee/dorive/proxy/ClassLoaderUtils.java | 331 ------------- .../com/gitee/dorive/proxy/ClassUtils.java | 434 ------------------ .../gitee/dorive/proxy/CtClassBuilder.java | 170 ------- .../gitee/dorive/proxy/JavassistCompiler.java | 85 ---- .../com/gitee/dorive/proxy/JdkCompiler.java | 273 ----------- .../com/gitee/dorive/proxy/ProxyCompiler.java | 31 -- pom.xml | 6 - 10 files changed, 4 insertions(+), 1427 deletions(-) delete mode 100644 dorive-proxy/pom.xml delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/AbstractCompiler.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassLoaderUtils.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassUtils.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/CtClassBuilder.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/JavassistCompiler.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/JdkCompiler.java delete mode 100644 dorive-proxy/src/main/java/com/gitee/dorive/proxy/ProxyCompiler.java diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 42742fd6..bae9c570 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -10,11 +10,6 @@ dorive-api - - com.gitee.digital-engine - dorive-proxy - ${project.version} - org.springframework.boot spring-boot-starter @@ -23,6 +18,10 @@ org.projectlombok lombok + + org.apache.commons + commons-lang3 + cn.hutool hutool-all diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml deleted file mode 100644 index 1b976ea1..00000000 --- a/dorive-proxy/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 4.0.0 - - com.gitee.digital-engine - dorive - 3.5.0.0 - - dorive-proxy - - - org.javassist - javassist - - - org.apache.commons - commons-lang3 - - - \ No newline at end of file diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/AbstractCompiler.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/AbstractCompiler.java deleted file mode 100644 index 4eccc3d4..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/AbstractCompiler.java +++ /dev/null @@ -1,70 +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.proxy; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Abstract compiler. (SPI, Prototype, ThreadSafe) - */ -public abstract class AbstractCompiler implements ProxyCompiler { - - private static final Pattern PACKAGE_PATTERN = Pattern.compile("package\\s+([$_a-zA-Z][$_a-zA-Z0-9\\.]*);"); - - private static final Pattern CLASS_PATTERN = Pattern.compile("class\\s+([$_a-zA-Z][$_a-zA-Z0-9]*)\\s+"); - - @Override - public Class compile(String code, ClassLoader classLoader) { - code = code.trim(); - Matcher matcher = PACKAGE_PATTERN.matcher(code); - String pkg; - if (matcher.find()) { - pkg = matcher.group(1); - } else { - pkg = ""; - } - matcher = CLASS_PATTERN.matcher(code); - String cls; - if (matcher.find()) { - cls = matcher.group(1); - } else { - throw new IllegalArgumentException("No such class name in " + code); - } - String className = pkg != null && pkg.length() > 0 ? pkg + "." + cls : cls; - try { - return Class.forName(className, true, ClassLoaderUtils.getCallerClassLoader(getClass())); - - } catch (ClassNotFoundException e) { - if (!code.endsWith("}")) { - throw new IllegalStateException("The java code not endsWith \"}\", code: \n" + code + "\n"); - } - try { - return doCompile(className, code); - } catch (RuntimeException t) { - throw t; - } catch (Throwable t) { - throw new IllegalStateException("Failed to compile class, cause: " + t.getMessage() + ", class: " - + className + ", code: \n" + code + "\n, stack: " + ClassUtils.toString(t)); - } - } - } - - protected abstract Class doCompile(String name, String source) throws Throwable; - -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassLoaderUtils.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassLoaderUtils.java deleted file mode 100644 index 6e18f676..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassLoaderUtils.java +++ /dev/null @@ -1,331 +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.proxy; - -import java.lang.reflect.Array; -import java.util.*; - -public class ClassLoaderUtils { - /** - * Suffix for array class names: "[]" - */ - public static final String ARRAY_SUFFIX = "[]"; - /** - * Prefix for internal array class names: "[L" - */ - private static final String INTERNAL_ARRAY_PREFIX = "[L"; - /** - * Map with primitive type name as key and corresponding primitive type as - * value, for example: "int" -> "int.class". - */ - private static final Map> PRIMITIVE_TYPE_NAME_MAP = new HashMap>(32); - /** - * Map with primitive wrapper type as key and corresponding primitive type as - * value, for example: Integer.class -> int.class. - */ - private static final Map, Class> PRIMITIVE_WRAPPER_TYPE_MAP = new HashMap, Class>(16); - - private static final char PACKAGE_SEPARATOR_CHAR = '.'; - - static { - PRIMITIVE_WRAPPER_TYPE_MAP.put(Boolean.class, boolean.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Byte.class, byte.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Character.class, char.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Double.class, double.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Float.class, float.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Integer.class, int.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Long.class, long.class); - PRIMITIVE_WRAPPER_TYPE_MAP.put(Short.class, short.class); - - Set> primitiveTypeNames = new HashSet<>(32); - primitiveTypeNames.addAll(PRIMITIVE_WRAPPER_TYPE_MAP.values()); - primitiveTypeNames.addAll(Arrays.asList(boolean[].class, byte[].class, char[].class, double[].class, - float[].class, int[].class, long[].class, short[].class)); - for (Class primitiveTypeName : primitiveTypeNames) { - PRIMITIVE_TYPE_NAME_MAP.put(primitiveTypeName.getName(), primitiveTypeName); - } - } - - public static Class forNameWithThreadContextClassLoader(String name) throws ClassNotFoundException { - return forName(name, Thread.currentThread().getContextClassLoader()); - } - - public static Class forNameWithCallerClassLoader(String name, Class caller) throws ClassNotFoundException { - return forName(name, caller.getClassLoader()); - } - - public static ClassLoader getCallerClassLoader(Class caller) { - return caller.getClassLoader(); - } - - /** - * get class loader - * - * @param clazz - * @return class loader - */ - public static ClassLoader getClassLoader(Class clazz) { - ClassLoader cl = null; - try { - cl = Thread.currentThread().getContextClassLoader(); - } catch (Throwable ex) { - // Cannot access thread context ClassLoader - falling back to system class - // loader... - } - if (cl == null) { - // No thread context class loader -> use class loader of this class. - cl = clazz.getClassLoader(); - if (cl == null) { - // getClassLoader() returning null indicates the bootstrap ClassLoader - try { - cl = ClassLoader.getSystemClassLoader(); - } catch (Throwable ex) { - // Cannot access system ClassLoader - oh well, maybe the caller can live with - // null... - } - } - } - - return cl; - } - - /** - * Return the default ClassLoader to use: typically the thread context - * ClassLoader, if available; the ClassLoader that loaded the ClassUtils class - * will be used as fallback. - *

- * Call this method if you intend to use the thread context ClassLoader in a - * scenario where you absolutely need a non-null ClassLoader reference: for - * example, for class path resource loading (but not necessarily for - * Class.forName, which accepts a null ClassLoader - * reference as well). - * - * @return the default ClassLoader (never null) - * @see Thread#getContextClassLoader() - */ - public static ClassLoader getClassLoader() { - return getClassLoader(ClassLoaderUtils.class); - } - - /** - * Same as Class.forName(), except that it works for primitive - * types. - */ - public static Class forName(String name) throws ClassNotFoundException { - return forName(name, getClassLoader()); - } - - /** - * Replacement for Class.forName() that also returns Class - * instances for primitives (like "int") and array class names (like - * "String[]"). - * - * @param name the name of the Class - * @param classLoader the class loader to use (may be null, which - * indicates the default class loader) - * @return Class instance for the supplied name - * @throws ClassNotFoundException if the class was not found - * @throws LinkageError if the class file could not be loaded - * @see Class#forName(String, boolean, ClassLoader) - */ - public static Class forName(String name, ClassLoader classLoader) throws ClassNotFoundException, LinkageError { - - Class clazz = resolvePrimitiveClassName(name); - if (clazz != null) { - return clazz; - } - - // "java.lang.String[]" style arrays - if (name.endsWith(ARRAY_SUFFIX)) { - String elementClassName = name.substring(0, name.length() - ARRAY_SUFFIX.length()); - Class elementClass = forName(elementClassName, classLoader); - return Array.newInstance(elementClass, 0).getClass(); - } - - // "[Ljava.lang.String;" style arrays - int internalArrayMarker = name.indexOf(INTERNAL_ARRAY_PREFIX); - if (internalArrayMarker != -1 && name.endsWith(";")) { - String elementClassName = null; - if (internalArrayMarker == 0) { - elementClassName = name.substring(INTERNAL_ARRAY_PREFIX.length(), name.length() - 1); - } else if (name.startsWith("[")) { - elementClassName = name.substring(1); - } - Class elementClass = forName(elementClassName, classLoader); - return Array.newInstance(elementClass, 0).getClass(); - } - - ClassLoader classLoaderToUse = classLoader; - if (classLoaderToUse == null) { - classLoaderToUse = getClassLoader(); - } - return classLoaderToUse.loadClass(name); - } - - /** - * Resolve the given class name as primitive class, if appropriate, according to - * the JVM's naming rules for primitive classes. - *

- * Also supports the JVM's internal class names for primitive arrays. Does - * not support the "[]" suffix notation for primitive arrays; this is - * only supported by {@link #forName}. - * - * @param name the name of the potentially primitive class - * @return the primitive class, or null if the name does not denote - * a primitive class or primitive array class - */ - public static Class resolvePrimitiveClassName(String name) { - Class result = null; - // Most class names will be quite long, considering that they - // SHOULD sit in a package, so a length check is worthwhile. - if (name != null && name.length() <= 8) { - // Could be a primitive - likely. - result = (Class) PRIMITIVE_TYPE_NAME_MAP.get(name); - } - return result; - } - - public static String toShortString(Object obj) { - if (obj == null) { - return "null"; - } - return obj.getClass().getSimpleName() + "@" + System.identityHashCode(obj); - - } - - public static String simpleClassName(Class clazz) { - if (clazz == null) { - throw new NullPointerException("clazz"); - } - String className = clazz.getName(); - final int lastDotIdx = className.lastIndexOf(PACKAGE_SEPARATOR_CHAR); - if (lastDotIdx > -1) { - return className.substring(lastDotIdx + 1); - } - return className; - } - - public static Object convertPrimitive(Class type, String value) { - if (value == null) { - return null; - } else if (type == char.class || type == Character.class) { - return value.length() > 0 ? value.charAt(0) : '\0'; - } else if (type == boolean.class || type == Boolean.class) { - return Boolean.valueOf(value); - } - try { - if (type == byte.class || type == Byte.class) { - return Byte.valueOf(value); - } else if (type == short.class || type == Short.class) { - return Short.valueOf(value); - } else if (type == int.class || type == Integer.class) { - return Integer.valueOf(value); - } else if (type == long.class || type == Long.class) { - return Long.valueOf(value); - } else if (type == float.class || type == Float.class) { - return Float.valueOf(value); - } else if (type == double.class || type == Double.class) { - return Double.valueOf(value); - } - } catch (NumberFormatException e) { - return null; - } - return value; - } - - /** - * We only check boolean value at this moment. - * - * @param type - * @param value - * @return - */ - public static boolean isTypeMatch(Class type, String value) { - if ((type == boolean.class || type == Boolean.class) && !("true".equals(value) || "false".equals(value))) { - return false; - } - return true; - } - - /** - * the semantics is same as {@link Class#isAssignableFrom(Class)} - * - * @param superType the super type - * @param targetType the target type - * @return see {@link Class#isAssignableFrom(Class)} - * @since 2.7.6 - */ - public static boolean isAssignableFrom(Class superType, Class targetType) { - // any argument is null - if (superType == null || targetType == null) { - return false; - } - // equals - if (Objects.equals(superType, targetType)) { - return true; - } - // isAssignableFrom - return superType.isAssignableFrom(targetType); - } - - /** - * Test the specified class name is present in the {@link ClassLoader} - * - * @param className the name of {@link Class} - * @param classLoader {@link ClassLoader} - * @return If found, return true - * @since 2.7.6 - */ - public static boolean isPresent(String className, ClassLoader classLoader) { - try { - forName(className, classLoader); - } catch (Throwable ignored) { // Ignored - return false; - } - return true; - } - - /** - * Resolve the {@link Class} by the specified name and {@link ClassLoader} - * - * @param className the name of {@link Class} - * @param classLoader {@link ClassLoader} - * @return If can't be resolved , return null - * @since 2.7.6 - */ - public static Class resolveClass(String className, ClassLoader classLoader) { - Class targetClass = null; - try { - targetClass = forName(className, classLoader); - } catch (Throwable ignored) { // Ignored - } - return targetClass; - } - - /** - * Is generic class or not? - * - * @param type the target type - * @return if the target type is not null or void or Void.class, - * return true, or false - * @since 2.7.6 - */ - public static boolean isGenericClass(Class type) { - return type != null && !void.class.equals(type) && !Void.class.equals(type); - } -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassUtils.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassUtils.java deleted file mode 100644 index 0f7d81c6..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ClassUtils.java +++ /dev/null @@ -1,434 +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.proxy; - -import org.apache.commons.lang3.StringUtils; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.reflect.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -/** - * ClassUtils. (Tool, Static, ThreadSafe) - */ -public class ClassUtils { - - public static final String CLASS_EXTENSION = ".class"; - - public static final String JAVA_EXTENSION = ".java"; - private static final int JIT_LIMIT = 5 * 1024; - - private ClassUtils() { - } - - public static Object newInstance(String name) { - try { - return forName(name).newInstance(); - } catch (InstantiationException e) { - throw new IllegalStateException(e.getMessage(), e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - public static Class forName(String[] packages, String className) { - try { - return classForName(className); - } catch (ClassNotFoundException e) { - if (packages != null && packages.length > 0) { - for (String pkg : packages) { - try { - return classForName(pkg + "." + className); - } catch (ClassNotFoundException e2) { - } - } - } - throw new IllegalStateException(e.getMessage(), e); - } - } - - public static Class forName(String className) { - try { - return classForName(className); - } catch (ClassNotFoundException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - public static Class classForName(String className) throws ClassNotFoundException { - switch (className) { - case "boolean": - return boolean.class; - case "byte": - return byte.class; - case "char": - return char.class; - case "short": - return short.class; - case "int": - return int.class; - case "long": - return long.class; - case "float": - return float.class; - case "double": - return double.class; - case "boolean[]": - return boolean[].class; - case "byte[]": - return byte[].class; - case "char[]": - return char[].class; - case "short[]": - return short[].class; - case "int[]": - return int[].class; - case "long[]": - return long[].class; - case "float[]": - return float[].class; - case "double[]": - return double[].class; - default: - } - try { - return arrayForName(className); - } catch (ClassNotFoundException e) { - // try to load from java.lang package - if (className.indexOf('.') == -1) { - try { - return arrayForName("java.lang." + className); - } catch (ClassNotFoundException e2) { - // ignore, let the original exception be thrown - } - } - throw e; - } - } - - private static Class arrayForName(String className) throws ClassNotFoundException { - return Class.forName( - className.endsWith("[]") ? "[L" + className.substring(0, className.length() - 2) + ";" : className, - true, Thread.currentThread().getContextClassLoader()); - } - - public static Class getBoxedClass(Class type) { - if (type == boolean.class) { - return Boolean.class; - } else if (type == char.class) { - return Character.class; - } else if (type == byte.class) { - return Byte.class; - } else if (type == short.class) { - return Short.class; - } else if (type == int.class) { - return Integer.class; - } else if (type == long.class) { - return Long.class; - } else if (type == float.class) { - return Float.class; - } else if (type == double.class) { - return Double.class; - } else { - return type; - } - } - - public static Boolean boxed(boolean v) { - return Boolean.valueOf(v); - } - - public static Character boxed(char v) { - return Character.valueOf(v); - } - - public static Byte boxed(byte v) { - return Byte.valueOf(v); - } - - public static Short boxed(short v) { - return Short.valueOf(v); - } - - public static Integer boxed(int v) { - return Integer.valueOf(v); - } - - public static Long boxed(long v) { - return Long.valueOf(v); - } - - public static Float boxed(float v) { - return Float.valueOf(v); - } - - public static Double boxed(double v) { - return Double.valueOf(v); - } - - public static Object boxed(Object v) { - return v; - } - - public static boolean unboxed(Boolean v) { - return v == null ? false : v.booleanValue(); - } - - public static char unboxed(Character v) { - return v == null ? '\0' : v.charValue(); - } - - public static byte unboxed(Byte v) { - return v == null ? 0 : v.byteValue(); - } - - public static short unboxed(Short v) { - return v == null ? 0 : v.shortValue(); - } - - public static int unboxed(Integer v) { - return v == null ? 0 : v.intValue(); - } - - public static long unboxed(Long v) { - return v == null ? 0 : v.longValue(); - } - - public static float unboxed(Float v) { - return v == null ? 0 : v.floatValue(); - } - - public static double unboxed(Double v) { - return v == null ? 0 : v.doubleValue(); - } - - public static Object unboxed(Object v) { - return v; - } - - public static boolean isNotEmpty(Object object) { - return getSize(object) > 0; - } - - public static int getSize(Object object) { - if (object == null) { - return 0; - } - if (object instanceof Collection) { - return ((Collection) object).size(); - } else if (object instanceof Map) { - return ((Map) object).size(); - } else if (object.getClass().isArray()) { - return Array.getLength(object); - } else { - return -1; - } - } - - public static URI toURI(String name) { - try { - return new URI(name); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - - public static Class getGenericClass(Class cls) { - return getGenericClass(cls, 0); - } - - public static Class getGenericClass(Class cls, int i) { - try { - ParameterizedType parameterizedType = ((ParameterizedType) cls.getGenericInterfaces()[0]); - Object genericClass = parameterizedType.getActualTypeArguments()[i]; - if (genericClass instanceof ParameterizedType) { - return (Class) ((ParameterizedType) genericClass).getRawType(); - } else if (genericClass instanceof GenericArrayType) { - Type type = ((GenericArrayType) genericClass).getGenericComponentType(); - if (type instanceof TypeVariable) { - return type.getClass(); - } - return (((GenericArrayType) genericClass).getGenericComponentType() instanceof Class) - ? (Class) ((GenericArrayType) genericClass).getGenericComponentType() - : ((GenericArrayType) genericClass).getGenericComponentType().getClass(); - } else if (genericClass != null) { - if (genericClass instanceof TypeVariable) { - return genericClass.getClass(); - } - return (Class) genericClass; - } - } catch (Throwable e) { - - } - if (cls.getSuperclass() != null) { - return getGenericClass(cls.getSuperclass(), i); - } else { - throw new IllegalArgumentException(cls.getName() + " generic type undefined!"); - } - } - - public static boolean isBeforeJava5(String javaVersion) { - return (StringUtils.isEmpty(javaVersion) || "1.0".equals(javaVersion) || "1.1".equals(javaVersion) - || "1.2".equals(javaVersion) || "1.3".equals(javaVersion) || "1.4".equals(javaVersion)); - } - - public static boolean isBeforeJava6(String javaVersion) { - return isBeforeJava5(javaVersion) || "1.5".equals(javaVersion); - } - - public static String toString(Throwable e) { - StringWriter w = new StringWriter(); - PrintWriter p = new PrintWriter(w); - p.print(e.getClass().getName() + ": "); - if (e.getMessage() != null) { - p.print(e.getMessage() + "\n"); - } - p.println(); - try { - e.printStackTrace(p); - return w.toString(); - } finally { - p.close(); - } - } - - public static void checkBytecode(String name, byte[] bytecode) { - if (bytecode.length > JIT_LIMIT) { - System.err - .println("The template bytecode too long, may be affect the JIT compiler. template class: " + name); - } - } - - public static String getSizeMethod(Class cls) { - try { - return cls.getMethod("size", new Class[0]).getName() + "()"; - } catch (NoSuchMethodException e) { - try { - return cls.getMethod("length", new Class[0]).getName() + "()"; - } catch (NoSuchMethodException e2) { - try { - return cls.getMethod("getSize", new Class[0]).getName() + "()"; - } catch (NoSuchMethodException e3) { - try { - return cls.getMethod("getLength", new Class[0]).getName() + "()"; - } catch (NoSuchMethodException e4) { - return null; - } - } - } - } - } - - public static String getMethodName(Method method, Class[] parameterClasses, String rightCode) { - if (method.getParameterTypes().length > parameterClasses.length) { - Class[] types = method.getParameterTypes(); - StringBuilder buf = new StringBuilder(rightCode); - for (int i = parameterClasses.length; i < types.length; i++) { - if (buf.length() > 0) { - buf.append(","); - } - Class type = types[i]; - String def; - if (type == boolean.class) { - def = "false"; - } else if (type == char.class) { - def = "\'\\0\'"; - } else if (type == byte.class || type == short.class || type == int.class || type == long.class - || type == float.class || type == double.class) { - def = "0"; - } else { - def = "null"; - } - buf.append(def); - } - } - return method.getName() + "(" + rightCode + ")"; - } - - public static Method searchMethod(Class currentClass, String name, Class[] parameterTypes) - throws NoSuchMethodException { - if (currentClass == null) { - throw new NoSuchMethodException("class == null"); - } - try { - return currentClass.getMethod(name, parameterTypes); - } catch (NoSuchMethodException e) { - for (Method method : currentClass.getMethods()) { - if (method.getName().equals(name) && parameterTypes.length == method.getParameterTypes().length - && Modifier.isPublic(method.getModifiers())) { - if (parameterTypes.length > 0) { - Class[] types = method.getParameterTypes(); - boolean match = true; - for (int i = 0; i < parameterTypes.length; i++) { - if (!types[i].isAssignableFrom(parameterTypes[i])) { - match = false; - break; - } - } - if (!match) { - continue; - } - } - return method; - } - } - throw e; - } - } - - public static String getInitCode(Class type) { - if (byte.class.equals(type) || short.class.equals(type) || int.class.equals(type) || long.class.equals(type) - || float.class.equals(type) || double.class.equals(type)) { - return "0"; - } else if (char.class.equals(type)) { - return "'\\0'"; - } else if (boolean.class.equals(type)) { - return "false"; - } else { - return "null"; - } - } - - public static Map toMap(Map.Entry[] entries) { - Map map = new HashMap(); - if (entries != null && entries.length > 0) { - for (Map.Entry entry : entries) { - map.put(entry.getKey(), entry.getValue()); - } - } - return map; - } - - /** - * get simple class name from qualified class name - */ - public static String getSimpleClassName(String qualifiedName) { - if (null == qualifiedName) { - return null; - } - - int i = qualifiedName.lastIndexOf('.'); - return i < 0 ? qualifiedName : qualifiedName.substring(i + 1); - } - -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/CtClassBuilder.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/CtClassBuilder.java deleted file mode 100644 index f051458d..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/CtClassBuilder.java +++ /dev/null @@ -1,170 +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.proxy; - -import javassist.*; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * CtClassBuilder is builder for CtClass - *

- * contains all the information, including: - *

- * class name, imported packages, super class name, implemented interfaces, - * constructors, fields, methods. - */ -public class CtClassBuilder { - - private String className; - - private String superClassName = "java.lang.Object"; - - private List imports = new ArrayList<>(); - - private Map fullNames = new HashMap<>(); - - private List ifaces = new ArrayList<>(); - - private List constructors = new ArrayList<>(); - - private List fields = new ArrayList<>(); - - private List methods = new ArrayList<>(); - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public String getSuperClassName() { - return superClassName; - } - - public void setSuperClassName(String superClassName) { - this.superClassName = getQualifiedClassName(superClassName); - } - - public List getImports() { - return imports; - } - - public void addImports(String pkg) { - int pi = pkg.lastIndexOf('.'); - if (pi > 0) { - String pkgName = pkg.substring(0, pi); - this.imports.add(pkgName); - if (!pkg.endsWith(".*")) { - fullNames.put(pkg.substring(pi + 1), pkg); - } - } - } - - public List getInterfaces() { - return ifaces; - } - - public void addInterface(String iface) { - this.ifaces.add(getQualifiedClassName(iface)); - } - - public List getConstructors() { - return constructors; - } - - public void addConstructor(String constructor) { - this.constructors.add(constructor); - } - - public List getFields() { - return fields; - } - - public void addField(String field) { - this.fields.add(field); - } - - public List getMethods() { - return methods; - } - - public void addMethod(String method) { - this.methods.add(method); - } - - /** - * get full qualified class name - * - * @param className super class name, maybe qualified or not - */ - protected String getQualifiedClassName(String className) { - if (className.contains(".")) { - return className; - } - - if (fullNames.containsKey(className)) { - return fullNames.get(className); - } - - return ClassUtils.forName(imports.toArray(new String[0]), className).getName(); - } - - /** - * build CtClass object - */ - public CtClass build(ClassLoader classLoader) throws NotFoundException, CannotCompileException { - ClassPool pool = new ClassPool(true); - pool.appendClassPath(new LoaderClassPath(classLoader)); - - // create class - CtClass ctClass = pool.makeClass(className, pool.get(superClassName)); - - // add imported packages - imports.stream().forEach(pool::importPackage); - - // add implemented interfaces - for (String iface : ifaces) { - ctClass.addInterface(pool.get(iface)); - } - - // dubbo didn't consider the order,so we fixed it. - // add fields - for (String field : fields) { - ctClass.addField(CtField.make(field, ctClass)); - } - - // add constructors - for (String constructor : constructors) { - ctClass.addConstructor(CtNewConstructor.make(constructor, ctClass)); - } - - // add methods - for (String method : methods) { - ctClass.addMethod(CtNewMethod.make(method, ctClass)); - } - - return ctClass; - } - -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JavassistCompiler.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JavassistCompiler.java deleted file mode 100644 index da7c086b..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JavassistCompiler.java +++ /dev/null @@ -1,85 +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.proxy; - -import javassist.CtClass; - -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * JavassistCompiler. (SPI, Singleton, ThreadSafe) - */ -public class JavassistCompiler extends AbstractCompiler { - - private static final Pattern IMPORT_PATTERN = Pattern.compile("import\\s+([\\w\\.\\*]+);\n"); - - private static final Pattern EXTENDS_PATTERN = Pattern.compile("\\s+extends\\s+([\\w\\.]+)[^\\{]*\\{\n"); - - private static final Pattern IMPLEMENTS_PATTERN = Pattern.compile("\\s+implements\\s+([\\w\\.]+)\\s*\\{\n"); - // dubbo don't have (\t)? - private static final Pattern METHODS_PATTERN = Pattern.compile("\n(\t)?(private|public|protected)\\s+"); - - private static final Pattern FIELD_PATTERN = Pattern.compile("[^\n]+=[^\n]+;"); - - @Override - public Class doCompile(String name, String source) throws Throwable { - CtClassBuilder builder = new CtClassBuilder(); - builder.setClassName(name); - - // process imported classes - Matcher matcher = IMPORT_PATTERN.matcher(source); - while (matcher.find()) { - builder.addImports(matcher.group(1).trim()); - } - - // process extended super class - matcher = EXTENDS_PATTERN.matcher(source); - if (matcher.find()) { - builder.setSuperClassName(matcher.group(1).trim()); - } - - // process implemented interfaces - matcher = IMPLEMENTS_PATTERN.matcher(source); - if (matcher.find()) { - String[] ifaces = matcher.group(1).trim().split("\\,"); - Arrays.stream(ifaces).forEach(i -> builder.addInterface(i.trim())); - } - - // process constructors, fields, methods - String body = source.substring(source.indexOf('{') + 1, source.length() - 1); - String[] methods = METHODS_PATTERN.split(body); - String className = ClassUtils.getSimpleClassName(name); - Arrays.stream(methods).map(String::trim).filter(m -> !m.isEmpty()).forEach(method -> { - if (method.startsWith(className)) { - builder.addConstructor("public " + method); - } else if (FIELD_PATTERN.matcher(method).matches()) { - builder.addField("private " + method); - } else { - builder.addMethod("public " + method); - } - }); - - // compile - ClassLoader classLoader = ClassLoaderUtils.getCallerClassLoader(getClass()); - CtClass cls = builder.build(classLoader); - return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain()); - } - -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JdkCompiler.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JdkCompiler.java deleted file mode 100644 index 7c3f282d..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/JdkCompiler.java +++ /dev/null @@ -1,273 +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.proxy; - -import javax.tools.*; -import javax.tools.JavaFileObject.Kind; -import java.io.*; -import java.net.URI; -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.*; - -/** - * JdkCompiler. (SPI, Singleton, ThreadSafe) - */ -public class JdkCompiler extends AbstractCompiler { - - private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - - private final DiagnosticCollector diagnosticCollector = new DiagnosticCollector(); - - private final ClassLoaderImpl classLoader; - - private final JavaFileManagerImpl javaFileManager; - - private volatile List options; - - public JdkCompiler() { - options = new ArrayList(); - options.add("-source"); - options.add("1.6"); - options.add("-target"); - options.add("1.6"); - StandardJavaFileManager manager = compiler.getStandardFileManager(diagnosticCollector, null, null); - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if (loader instanceof URLClassLoader - && (!"sun.misc.Launcher$AppClassLoader".equals(loader.getClass().getName()))) { - try { - @SuppressWarnings("resource") - URLClassLoader urlClassLoader = (URLClassLoader) loader; - List files = new ArrayList(); - for (URL url : urlClassLoader.getURLs()) { - files.add(new File(url.getFile())); - } - manager.setLocation(StandardLocation.CLASS_PATH, files); - } catch (IOException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - classLoader = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public ClassLoaderImpl run() { - return new ClassLoaderImpl(loader); - } - }); - javaFileManager = new JavaFileManagerImpl(manager, classLoader); - } - - @Override - public Class doCompile(String name, String sourceCode) throws Throwable { - int i = name.lastIndexOf('.'); - String packageName = i < 0 ? "" : name.substring(0, i); - String className = i < 0 ? name : name.substring(i + 1); - JavaFileObjectImpl javaFileObject = new JavaFileObjectImpl(className, sourceCode); - javaFileManager.putFileForInput(StandardLocation.SOURCE_PATH, packageName, - className + ClassUtils.JAVA_EXTENSION, javaFileObject); - Boolean result = compiler - .getTask(null, javaFileManager, diagnosticCollector, options, null, Arrays.asList(javaFileObject)) - .call(); - if (result == null || !result) { - throw new IllegalStateException( - "Compilation failed. class: " + name + ", diagnostics: " + diagnosticCollector); - } - return classLoader.loadClass(name); - } - - private static final class JavaFileObjectImpl extends SimpleJavaFileObject { - - private final CharSequence source; - private ByteArrayOutputStream bytecode; - - public JavaFileObjectImpl(final String baseName, final CharSequence source) { - super(ClassUtils.toURI(baseName + ClassUtils.JAVA_EXTENSION), Kind.SOURCE); - this.source = source; - } - - JavaFileObjectImpl(final String name, final Kind kind) { - super(ClassUtils.toURI(name), kind); - source = null; - } - - public JavaFileObjectImpl(URI uri, Kind kind) { - super(uri, kind); - source = null; - } - - @Override - public CharSequence getCharContent(final boolean ignoreEncodingErrors) throws UnsupportedOperationException { - if (source == null) { - throw new UnsupportedOperationException("source == null"); - } - return source; - } - - @Override - public InputStream openInputStream() { - return new ByteArrayInputStream(getByteCode()); - } - - @Override - public OutputStream openOutputStream() { - return bytecode = new ByteArrayOutputStream(); - } - - public byte[] getByteCode() { - return bytecode.toByteArray(); - } - } - - private static final class JavaFileManagerImpl extends ForwardingJavaFileManager { - - private final ClassLoaderImpl classLoader; - - private final Map fileObjects = new HashMap(); - - public JavaFileManagerImpl(JavaFileManager fileManager, ClassLoaderImpl classLoader) { - super(fileManager); - this.classLoader = classLoader; - } - - @Override - public FileObject getFileForInput(Location location, String packageName, String relativeName) - throws IOException { - FileObject o = fileObjects.get(uri(location, packageName, relativeName)); - if (o != null) { - return o; - } - return super.getFileForInput(location, packageName, relativeName); - } - - public void putFileForInput(StandardLocation location, String packageName, String relativeName, - JavaFileObject file) { - fileObjects.put(uri(location, packageName, relativeName), file); - } - - private URI uri(Location location, String packageName, String relativeName) { - return ClassUtils.toURI(location.getName() + '/' + packageName + '/' + relativeName); - } - - @Override - public JavaFileObject getJavaFileForOutput(Location location, String qualifiedName, Kind kind, - FileObject outputFile) throws IOException { - JavaFileObject file = new JavaFileObjectImpl(qualifiedName, kind); - classLoader.add(qualifiedName, file); - return file; - } - - @Override - public ClassLoader getClassLoader(Location location) { - return classLoader; - } - - @Override - public String inferBinaryName(Location loc, JavaFileObject file) { - if (file instanceof JavaFileObjectImpl) { - return file.getName(); - } - return super.inferBinaryName(loc, file); - } - - @Override - public Iterable list(Location location, String packageName, Set kinds, boolean recurse) - throws IOException { - Iterable result = super.list(location, packageName, kinds, recurse); - - @SuppressWarnings("unused") - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - - ArrayList files = new ArrayList(); - - if (location == StandardLocation.CLASS_PATH && kinds.contains(Kind.CLASS)) { - for (JavaFileObject file : fileObjects.values()) { - if (file.getKind() == Kind.CLASS && file.getName().startsWith(packageName)) { - files.add(file); - } - } - - files.addAll(classLoader.files()); - } else if (location == StandardLocation.SOURCE_PATH && kinds.contains(Kind.SOURCE)) { - for (JavaFileObject file : fileObjects.values()) { - if (file.getKind() == Kind.SOURCE && file.getName().startsWith(packageName)) { - files.add(file); - } - } - } - - for (JavaFileObject file : result) { - files.add(file); - } - - return files; - } - } - - private final class ClassLoaderImpl extends ClassLoader { - - private final Map classes = new HashMap(); - - ClassLoaderImpl(final ClassLoader parentClassLoader) { - super(parentClassLoader); - } - - Collection files() { - return Collections.unmodifiableCollection(classes.values()); - } - - @Override - protected Class findClass(final String qualifiedClassName) throws ClassNotFoundException { - JavaFileObject file = classes.get(qualifiedClassName); - if (file != null) { - byte[] bytes = ((JavaFileObjectImpl) file).getByteCode(); - return defineClass(qualifiedClassName, bytes, 0, bytes.length); - } - try { - return ClassLoaderUtils.forNameWithCallerClassLoader(qualifiedClassName, - getClass()); - } catch (ClassNotFoundException nf) { - return super.findClass(qualifiedClassName); - } - } - - void add(final String qualifiedClassName, final JavaFileObject javaFile) { - classes.put(qualifiedClassName, javaFile); - } - - @Override - protected synchronized Class loadClass(final String name, final boolean resolve) - throws ClassNotFoundException { - return super.loadClass(name, resolve); - } - - @Override - public InputStream getResourceAsStream(final String name) { - if (name.endsWith(ClassUtils.CLASS_EXTENSION)) { - String qualifiedClassName = name.substring(0, name.length() - ClassUtils.CLASS_EXTENSION.length()) - .replace('/', '.'); - JavaFileObjectImpl file = (JavaFileObjectImpl) classes.get(qualifiedClassName); - if (file != null) { - return new ByteArrayInputStream(file.getByteCode()); - } - } - return super.getResourceAsStream(name); - } - } - -} diff --git a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ProxyCompiler.java b/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ProxyCompiler.java deleted file mode 100644 index e5ef294d..00000000 --- a/dorive-proxy/src/main/java/com/gitee/dorive/proxy/ProxyCompiler.java +++ /dev/null @@ -1,31 +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.proxy; - -public interface ProxyCompiler { - - /** - * Compile java source code. - * - * @param code Java source code - * @param classLoader classloader - * @return Compiled class - */ - Class compile(String code, ClassLoader classLoader); - -} diff --git a/pom.xml b/pom.xml index 2b5aca38..f18b0865 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ dorive-inject dorive-env dorive-web - dorive-proxy dorive-api dorive-core dorive-event @@ -83,11 +82,6 @@ hutool-all 5.8.25 - - org.javassist - javassist - 3.29.2-GA - com.baomidou mybatis-plus-boot-starter -- Gitee From fc5e61aaec459c8f95ad3ae8b433c80bf979510a Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Tue, 25 Jun 2024 19:07:05 +0800 Subject: [PATCH 25/77] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/entity/ele/EntityElement.java | 3 +++ .../api/impl/EntityElementResolver.java | 17 +++++++++----- .../repository/AbstractContextRepository.java | 22 +++++-------------- .../sql/impl/executor/SqlQueryExecutor.java | 10 +++------ .../sql/impl/segment/SegmentBuilder.java | 18 +++++---------- 5 files changed, 29 insertions(+), 41 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java index 729f4d0c..5abed8f6 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java @@ -26,12 +26,14 @@ import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.def.OrderDef; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.*; @Getter @Setter +@NoArgsConstructor @AllArgsConstructor public class EntityElement implements PropProxy { @@ -43,6 +45,7 @@ public class EntityElement implements PropProxy { private Class genericType; private List fieldElements; private Map fieldAliasMapping; + private Map attributes; public String getPrimaryKey() { return entityDefinition.getPrimaryKey(); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index 97771e3d..3ca624a0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -32,10 +32,7 @@ import com.gitee.dorive.api.entity.FieldEntityDefinition; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Slf4j public class EntityElementResolver { @@ -112,7 +109,17 @@ public class EntityElementResolver { fieldAliasMapping.put(fieldName, alias); } - return new EntityElement(entityDefinition, accessPath, entityDef, bindingDefs, orderDef, genericType, fieldElements, fieldAliasMapping); + EntityElement entityElement = new EntityElement(); + entityElement.setEntityDefinition(entityDefinition); + entityElement.setAccessPath(accessPath); + entityElement.setEntityDef(entityDef); + entityElement.setBindingDefs(bindingDefs); + entityElement.setOrderDef(orderDef); + entityElement.setGenericType(genericType); + entityElement.setFieldElements(fieldElements); + entityElement.setFieldAliasMapping(fieldAliasMapping); + entityElement.setAttributes(new HashMap<>(4)); + return entityElement; } } 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 165ac998..487bc1d4 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 @@ -20,10 +20,10 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Order; +import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.def.OrderDef; import com.gitee.dorive.api.entity.ele.EntityElement; -import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.impl.EntityDefinitionReader; import com.gitee.dorive.api.impl.EntityElementResolver; import com.gitee.dorive.api.util.ReflectUtils; @@ -55,32 +55,18 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; @Getter @Setter public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { - private static final Map ENTITY_STORE_INFO_MAP = new ConcurrentHashMap<>(); - private static final Map EXAMPLE_EXECUTOR_MAP = new ConcurrentHashMap<>(); - private ApplicationContext applicationContext; - private DerivedResolver derivedResolver; - private Map repositoryMap = new LinkedHashMap<>(); private CommonRepository rootRepository; private List subRepositories = new ArrayList<>(); private List orderedRepositories = new ArrayList<>(); - public static EntityStoreInfo getEntityStoreInfo(EntityElement entityElement) { - return ENTITY_STORE_INFO_MAP.get(entityElement); - } - - public static ExampleExecutor getExampleExecutor(EntityElement entityElement) { - return EXAMPLE_EXECUTOR_MAP.get(entityElement); - } - @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; @@ -178,8 +164,10 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityElement(entityElement); defaultRepository.setOperationFactory(operationFactory); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityElement); - ENTITY_STORE_INFO_MAP.put(entityElement, entityStoreInfo); + attributes.put(EntityStoreInfo.class.getName(), entityStoreInfo); EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); @@ -188,7 +176,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor Executor executor = newExecutor(entityElement, entityStoreInfo); executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); executor = new ExampleExecutor(executor, entityElement, entityMapper); - EXAMPLE_EXECUTOR_MAP.put(entityElement, (ExampleExecutor) executor); + attributes.put(ExampleExecutor.class.getName(), executor); defaultRepository.setExecutor(executor); } return (AbstractRepository) repository; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 3b042b33..532d1810 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -21,12 +21,7 @@ import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.repository.AbstractContextRepository; +import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.enums.ResultType; @@ -63,7 +58,8 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { Example example = queryContext.getExample(); EntityElement entityElement = repository.getEntityElement(); - EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityElement); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); String idColumn = entityStoreInfo.getIdColumn(); OrderBy orderBy = example.getOrderBy(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index 0c633a59..1244cf3f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -31,7 +31,6 @@ import com.gitee.dorive.core.impl.binder.ValueFilterBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CriterionUtils; import com.gitee.dorive.query.entity.MergedRepository; @@ -73,8 +72,9 @@ public class SegmentBuilder { CommonRepository executedRepository = mergedRepository.getExecutedRepository(); EntityElement entityElement = executedRepository.getEntityElement(); - EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityElement); - ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityElement); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); + ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); String tableName = entityStoreInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); @@ -134,9 +134,7 @@ public class SegmentBuilder { if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment( - tableSegment.getTableAlias(), strongBinder.getAlias(), - targetTableSegment.getTableAlias(), boundBinder.getBindAlias()); + OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getAlias(), targetTableSegment.getTableAlias(), boundBinder.getBindAlias()); onSegments.add(onSegment); } } @@ -145,16 +143,12 @@ public class SegmentBuilder { Node targetNode = nodeMap.get(relativeAccessPath); if (targetNode != null) { TableSegment targetTableSegment = targetNode.getTableSegment(); - OnValueSegment onValueSegment = new OnValueSegment( - targetTableSegment.getTableAlias(), valueRouteBinder.getBindAlias(), - CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); + OnValueSegment onValueSegment = new OnValueSegment(targetTableSegment.getTableAlias(), valueRouteBinder.getBindAlias(), CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); onSegments.add(onValueSegment); } } for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { - OnValueSegment onValueSegment = new OnValueSegment( - tableSegment.getTableAlias(), valueFilterBinder.getAlias(), - CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); + OnValueSegment onValueSegment = new OnValueSegment(tableSegment.getTableAlias(), valueFilterBinder.getAlias(), CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); onSegments.add(onValueSegment); } return onSegments; -- Gitee From ef23d6e40611ca0515d1e67bec82059222dc6452 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 09:57:24 +0800 Subject: [PATCH 26/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/entity/ele/EntityElement.java | 8 ++++---- .../dorive/core/repository/AbstractContextRepository.java | 2 +- .../gitee/dorive/core/repository/CommonRepository.java | 4 ---- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java index 5abed8f6..25af9f7c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java @@ -47,10 +47,6 @@ public class EntityElement implements PropProxy { private Map fieldAliasMapping; private Map attributes; - public String getPrimaryKey() { - return entityDefinition.getPrimaryKey(); - } - public boolean isCollection() { return entityDefinition.isCollection(); } @@ -65,6 +61,10 @@ public class EntityElement implements PropProxy { ReflectUtil.setFieldValue(entity, entityDefinition.getFieldName(), value); } + public String getPrimaryKey() { + return entityDefinition.getPrimaryKey(); + } + public Object getPrimaryKey(Object entity) { return ReflectUtil.getFieldValue(entity, getPrimaryKey()); } 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 487bc1d4..9cb541e7 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 @@ -61,11 +61,11 @@ import java.util.*; public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; - private DerivedResolver derivedResolver; private Map repositoryMap = new LinkedHashMap<>(); private CommonRepository rootRepository; private List subRepositories = new ArrayList<>(); private List orderedRepositories = new ArrayList<>(); + private DerivedResolver derivedResolver; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 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 67ed268e..bec2d2d8 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 @@ -61,10 +61,6 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return getEntityElement().isCollection(); } - public Object getPrimaryKey(Object entity) { - return getEntityElement().getPrimaryKey(entity); - } - public boolean hasField(String field) { return getEntityElement().hasField(field); } -- Gitee From 7da990b12e678a46b27ad814e3a037040717cc33 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 13:17:43 +0800 Subject: [PATCH 27/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/binder/BoundBinder.java | 2 +- .../core/impl/resolver/BinderResolver.java | 45 +++++++++--------- .../repository/AbstractContextRepository.java | 2 +- .../core/repository/CommonRepository.java | 2 +- .../com/gitee/dorive/core/util/PathUtils.java | 47 ------------------- .../impl/resolver/QueryTypeResolver.java | 2 +- 6 files changed, 25 insertions(+), 75 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java index c31b4329..d77aa46b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java @@ -33,9 +33,9 @@ public class BoundBinder implements Binder { protected BindingDef bindingDef; protected Processor processor; + protected PropChain boundPropChain; protected String belongAccessPath; protected CommonRepository belongRepository; - protected PropChain boundPropChain; protected String bindAlias; public BoundBinder(BindingDef bindingDef, Processor processor) { 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 e6989a13..0ba39693 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 @@ -39,7 +39,6 @@ import com.gitee.dorive.core.impl.binder.*; import com.gitee.dorive.core.impl.processor.SpELProcessor; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.core.util.PathUtils; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; @@ -85,7 +84,7 @@ public class BinderResolver { for (BindingDef bindingDef : bindingDefs) { BindingType bindingType = determineBindingType(bindingDef); - resetBindingDef(accessPath, bindingDef); + resetBindingDef(bindingDef); Processor processor = newProcessor(bindingDef); if (bindingType == BindingType.VALUE_ROUTE) { @@ -99,8 +98,9 @@ public class BinderResolver { String field = bindingDef.getField(); String alias = entityElement.toAlias(field); + FieldElement fieldElement = entityElement.getFieldElement(field); PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + field); - PropChain fieldPropChain = new PropChain(entityElement.getFieldElement(field), propProxy); + PropChain fieldPropChain = new PropChain(fieldElement, propProxy); Assert.notNull(fieldPropChain, fieldErrorMsg, genericType.getName(), field); if (bindingType == BindingType.STRONG) { @@ -165,7 +165,7 @@ public class BinderResolver { throw new RuntimeException("Unknown binding type!"); } - private void resetBindingDef(String accessPath, BindingDef bindingDef) { + private void resetBindingDef(BindingDef bindingDef) { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); String bindExp = StrUtil.trim(bindingDef.getBindExp()); @@ -173,15 +173,19 @@ public class BinderResolver { Class processor = bindingDef.getProcessor(); String bindField = StrUtil.trim(bindingDef.getBindField()); - if (bindExp.startsWith(".")) { - bindExp = PathUtils.getAbsolutePath(accessPath, bindExp); + // 兼容以往版本 + if (bindExp.startsWith("/")) { + bindExp = StrUtil.removePrefix(bindExp, "/"); } - if (StringUtils.isNotBlank(bindExp)) { - if (StringUtils.isBlank(processExp) && StringUtils.isBlank(bindField)) { - bindField = PathUtils.getLastName(bindExp); - } + if (bindExp.startsWith("./")) { + bindExp = StrUtil.removePrefix(bindExp, "./"); + } + if (StringUtils.isNotBlank(bindExp) && StringUtils.isNotBlank(processExp)) { Assert.notEmpty(bindField, "The bindField of @Binding cannot be empty!"); } + if (StringUtils.isNotBlank(bindExp) && StringUtils.isBlank(bindField)) { + bindField = bindExp; + } if (StringUtils.isNotBlank(processExp) && processor == Object.class) { processor = SpELProcessor.class; } @@ -218,29 +222,22 @@ public class BinderResolver { String bindExp = bindingDef.getBindExp(); String bindField = bindingDef.getBindField(); - Map repositoryMap = repository.getRepositoryMap(); - String belongAccessPath = PathUtils.getBelongPath(repositoryMap.keySet(), bindExp); - CommonRepository belongRepository = repositoryMap.get(belongAccessPath); - Assert.notNull(belongRepository, "The belong repository cannot be null! bindExp: {}", bindExp); - belongRepository.setBoundEntity(true); - CommonRepository rootRepository = repository.getRootRepository(); EntityElement entityElement = rootRepository.getEntityElement(); - String field = PathUtils.getLastName(bindExp); - FieldElement fieldElement = entityElement.getFieldElement(field); - if (bindExp.startsWith("/")) { - bindExp = "#entity" + StrUtil.replace(bindExp, "/", "."); - } - PropProxy propProxy = SpELPropProxy.newPropProxy(bindExp); + FieldElement fieldElement = entityElement.getFieldElement(bindExp); + PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + bindExp); PropChain boundPropChain = new PropChain(fieldElement, propProxy); Assert.notNull(boundPropChain, "The bound property chain cannot be null! bindExp: {}", bindExp); + Map repositoryMap = repository.getRepositoryMap(); + CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bindExp, rootRepository); + belongRepository.setBound(true); EntityElement belongEntityElement = belongRepository.getEntityElement(); String bindAlias = belongEntityElement.toAlias(bindField); - boundBinder.setBelongAccessPath(belongAccessPath); - boundBinder.setBelongRepository(belongRepository); boundBinder.setBoundPropChain(boundPropChain); + boundBinder.setBelongAccessPath(belongRepository.getAccessPath()); + boundBinder.setBelongRepository(belongRepository); boundBinder.setBindAlias(bindAlias); } 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 9cb541e7..f5d0cdfb 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 @@ -134,7 +134,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setDefaultOrderBy(defaultOrderBy); repository.setBinderResolver(binderResolver); - repository.setBoundEntity(false); + repository.setBound(false); repository.setMatcher(new SelectTypeMatcher(repository)); return repository; } 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 bec2d2d8..f2595889 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 @@ -50,7 +50,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher private boolean aggregated; private OrderBy defaultOrderBy; private BinderResolver binderResolver; - private boolean boundEntity; + private boolean bound; private Matcher matcher; public String getName() { 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 deleted file mode 100644 index c173175c..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/PathUtils.java +++ /dev/null @@ -1,47 +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.util; - -import cn.hutool.core.util.URLUtil; - -import java.util.Set; - -public class PathUtils { - - public static String getAbsolutePath(String accessPath, String relativePath) { - accessPath = "https://dorive" + accessPath; - accessPath = URLUtil.completeUrl(accessPath, relativePath); - return accessPath.replace("https://dorive", ""); - } - - public static String getBelongPath(Set allAccessPath, String accessPath) { - while (!allAccessPath.contains(accessPath) && !"/".equals(accessPath)) { - accessPath = PathUtils.getPrevPath(accessPath); - } - 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-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index c02e2edc..c41876ec 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -139,7 +139,7 @@ public class QueryTypeResolver { for (MergedRepository mergedRepository : mergedRepositoryMap.values()) { CommonRepository repository = mergedRepository.getExecutedRepository(); - if (repository.isBoundEntity()) { + if (repository.isBound()) { mergedRepositorySet.add(mergedRepository); } } -- Gitee From bd7a0f8f36ab77b79316fb3f21d44ca8c8d23366 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 13:36:21 +0800 Subject: [PATCH 28/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/core/impl/resolver/BinderResolver.java | 2 +- .../gitee/dorive/core/repository/AbstractContextRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 0ba39693..7dec2bdc 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 @@ -65,7 +65,7 @@ public class BinderResolver { this.repository = repository; } - public void resolve(String accessPath, EntityElement entityElement) { + public void resolve(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); List bindingDefs = entityElement.getBindingDefs(); Class genericType = entityElement.getGenericType(); 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 f5d0cdfb..eab12fd7 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 @@ -121,7 +121,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); BinderResolver binderResolver = new BinderResolver(this); - binderResolver.resolve(accessPath, entityElement); + binderResolver.resolve(entityElement); CommonRepository repository = new CommonRepository(); repository.setEntityElement(entityElement); -- Gitee From 9ca0c930094ec71ca5d31215517d30cae880f7b6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 14:05:49 +0800 Subject: [PATCH 29/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/annotation/Binding.java | 4 +-- .../dorive/api/entity/BindingDefinition.java | 2 +- .../dorive/api/entity/def/BindingDef.java | 2 +- .../api/impl/EntityDefinitionReader.java | 2 +- .../api/impl/EntityElementResolver.java | 2 +- .../core/impl/resolver/BinderResolver.java | 34 +++++++++---------- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java index 69069573..ba9a3f08 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java @@ -42,12 +42,10 @@ public @interface Binding { /** * 绑定表达式 */ - String bindExp() default ""; + String bind() default ""; /** * 加工表达式 - * - * @see org.springframework.expression */ String processExp() default ""; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java index 25007fbe..cc996fe0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java @@ -23,7 +23,7 @@ import lombok.Data; public class BindingDefinition { private String field; private String value; - private String bindExp; + private String bind; private String processExp; private String processorName; private String bindField; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java index 3905bd31..1f52dc6c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java @@ -27,7 +27,7 @@ import lombok.NoArgsConstructor; public class BindingDef { private String field; private String value; - private String bindExp; + private String bind; private String processExp; private Class processor; private String bindField; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 63950683..5d918708 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -209,7 +209,7 @@ public class EntityDefinitionReader { BindingDefinition bindingDefinition = new BindingDefinition(); bindingDefinition.setField(binding.field()); bindingDefinition.setValue(binding.value()); - bindingDefinition.setBindExp(binding.bindExp()); + bindingDefinition.setBind(binding.bind()); bindingDefinition.setProcessExp(binding.processExp()); bindingDefinition.setProcessorName(binding.processor().getName()); bindingDefinition.setBindField(binding.bindField()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index 3ca624a0..d3a341d0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -68,7 +68,7 @@ public class EntityElementResolver { BindingDef bindingDef = new BindingDef(); bindingDef.setField(bindingDefinition.getField()); bindingDef.setValue(bindingDefinition.getValue()); - bindingDef.setBindExp(bindingDefinition.getBindExp()); + bindingDef.setBind(bindingDefinition.getBind()); bindingDef.setProcessExp(bindingDefinition.getProcessExp()); bindingDef.setProcessor(ClassUtil.loadClass(bindingDefinition.getProcessorName())); bindingDef.setBindField(bindingDefinition.getBindField()); 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 7dec2bdc..e7f44a96 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 @@ -148,15 +148,15 @@ public class BinderResolver { private BindingType determineBindingType(BindingDef bindingDef) { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); - String bindExp = StrUtil.trim(bindingDef.getBindExp()); + String bind = StrUtil.trim(bindingDef.getBind()); String processExp = StrUtil.trim(bindingDef.getProcessExp()); - if (ObjectUtil.isAllNotEmpty(field, bindExp)) { + if (ObjectUtil.isAllNotEmpty(field, bind)) { return BindingType.STRONG; } else if (ObjectUtil.isAllNotEmpty(field, processExp)) { return BindingType.WEAK; - } else if (ObjectUtil.isAllNotEmpty(value, bindExp)) { + } else if (ObjectUtil.isAllNotEmpty(value, bind)) { return BindingType.VALUE_ROUTE; } else if (ObjectUtil.isAllNotEmpty(field, value)) { @@ -168,23 +168,23 @@ public class BinderResolver { private void resetBindingDef(BindingDef bindingDef) { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); - String bindExp = StrUtil.trim(bindingDef.getBindExp()); + String bind = StrUtil.trim(bindingDef.getBind()); String processExp = StrUtil.trim(bindingDef.getProcessExp()); Class processor = bindingDef.getProcessor(); String bindField = StrUtil.trim(bindingDef.getBindField()); // 兼容以往版本 - if (bindExp.startsWith("/")) { - bindExp = StrUtil.removePrefix(bindExp, "/"); + if (bind.startsWith("/")) { + bind = StrUtil.removePrefix(bind, "/"); } - if (bindExp.startsWith("./")) { - bindExp = StrUtil.removePrefix(bindExp, "./"); + if (bind.startsWith("./")) { + bind = StrUtil.removePrefix(bind, "./"); } - if (StringUtils.isNotBlank(bindExp) && StringUtils.isNotBlank(processExp)) { + if (StringUtils.isNotBlank(bind) && StringUtils.isNotBlank(processExp)) { Assert.notEmpty(bindField, "The bindField of @Binding cannot be empty!"); } - if (StringUtils.isNotBlank(bindExp) && StringUtils.isBlank(bindField)) { - bindField = bindExp; + if (StringUtils.isNotBlank(bind) && StringUtils.isBlank(bindField)) { + bindField = bind; } if (StringUtils.isNotBlank(processExp) && processor == Object.class) { processor = SpELProcessor.class; @@ -192,7 +192,7 @@ public class BinderResolver { bindingDef.setField(field); bindingDef.setValue(value); - bindingDef.setBindExp(bindExp); + bindingDef.setBind(bind); bindingDef.setProcessExp(processExp); bindingDef.setProcessor(processor); bindingDef.setBindField(bindField); @@ -219,18 +219,18 @@ public class BinderResolver { } private void initBoundBinder(BindingDef bindingDef, BoundBinder boundBinder) { - String bindExp = bindingDef.getBindExp(); + String bind = bindingDef.getBind(); String bindField = bindingDef.getBindField(); CommonRepository rootRepository = repository.getRootRepository(); EntityElement entityElement = rootRepository.getEntityElement(); - FieldElement fieldElement = entityElement.getFieldElement(bindExp); - PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + bindExp); + FieldElement fieldElement = entityElement.getFieldElement(bind); + PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + bind); PropChain boundPropChain = new PropChain(fieldElement, propProxy); - Assert.notNull(boundPropChain, "The bound property chain cannot be null! bindExp: {}", bindExp); + Assert.notNull(boundPropChain, "The bound property chain cannot be null! bind: {}", bind); Map repositoryMap = repository.getRepositoryMap(); - CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bindExp, rootRepository); + CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bind, rootRepository); belongRepository.setBound(true); EntityElement belongEntityElement = belongRepository.getEntityElement(); String bindAlias = belongEntityElement.toAlias(bindField); -- Gitee From 719aae7ab49f2414f332a600f280a1899ade0cd2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 14:33:36 +0800 Subject: [PATCH 30/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/annotation/Binding.java | 4 ++-- .../gitee/dorive/api/entity/BindingDefinition.java | 2 +- .../com/gitee/dorive/api/entity/def/BindingDef.java | 2 +- .../dorive/api/impl/EntityDefinitionReader.java | 2 +- .../gitee/dorive/api/impl/EntityElementResolver.java | 2 +- .../dorive/core/impl/processor/SpELProcessor.java | 2 +- .../dorive/core/impl/resolver/BinderResolver.java | 12 ++++++------ 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java index ba9a3f08..46486d12 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java @@ -40,14 +40,14 @@ public @interface Binding { String value() default ""; /** - * 绑定表达式 + * 绑定的字段 */ String bind() default ""; /** * 加工表达式 */ - String processExp() default ""; + String expression() default ""; /** * 指定加工器 diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java index cc996fe0..5190640d 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/BindingDefinition.java @@ -24,7 +24,7 @@ public class BindingDefinition { private String field; private String value; private String bind; - private String processExp; + private String expression; private String processorName; private String bindField; } \ No newline at end of file diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java index 1f52dc6c..ff393332 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/BindingDef.java @@ -28,7 +28,7 @@ public class BindingDef { private String field; private String value; private String bind; - private String processExp; + private String expression; private Class processor; private String bindField; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 5d918708..5dc2aa62 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -210,7 +210,7 @@ public class EntityDefinitionReader { bindingDefinition.setField(binding.field()); bindingDefinition.setValue(binding.value()); bindingDefinition.setBind(binding.bind()); - bindingDefinition.setProcessExp(binding.processExp()); + bindingDefinition.setExpression(binding.expression()); bindingDefinition.setProcessorName(binding.processor().getName()); bindingDefinition.setBindField(binding.bindField()); bindingDefinitions.add(bindingDefinition); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index d3a341d0..e64127af 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -69,7 +69,7 @@ public class EntityElementResolver { bindingDef.setField(bindingDefinition.getField()); bindingDef.setValue(bindingDefinition.getValue()); bindingDef.setBind(bindingDefinition.getBind()); - bindingDef.setProcessExp(bindingDefinition.getProcessExp()); + bindingDef.setExpression(bindingDefinition.getExpression()); bindingDef.setProcessor(ClassUtil.loadClass(bindingDefinition.getProcessorName())); bindingDef.setBindField(bindingDefinition.getBindField()); bindingDefs.add(bindingDef); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java index b9723d72..56367cda 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/SpELProcessor.java @@ -32,7 +32,7 @@ public class SpELProcessor implements Processor { public SpELProcessor(BindingDef bindingDef) { ExpressionParser parser = new SpelExpressionParser(); - this.expression = parser.parseExpression(bindingDef.getProcessExp()); + this.expression = parser.parseExpression(bindingDef.getExpression()); } @Override 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 e7f44a96..b4de4df8 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 @@ -149,11 +149,11 @@ public class BinderResolver { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); String bind = StrUtil.trim(bindingDef.getBind()); - String processExp = StrUtil.trim(bindingDef.getProcessExp()); + String expression = StrUtil.trim(bindingDef.getExpression()); if (ObjectUtil.isAllNotEmpty(field, bind)) { return BindingType.STRONG; - } else if (ObjectUtil.isAllNotEmpty(field, processExp)) { + } else if (ObjectUtil.isAllNotEmpty(field, expression)) { return BindingType.WEAK; } else if (ObjectUtil.isAllNotEmpty(value, bind)) { @@ -169,7 +169,7 @@ public class BinderResolver { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); String bind = StrUtil.trim(bindingDef.getBind()); - String processExp = StrUtil.trim(bindingDef.getProcessExp()); + String expression = StrUtil.trim(bindingDef.getExpression()); Class processor = bindingDef.getProcessor(); String bindField = StrUtil.trim(bindingDef.getBindField()); @@ -180,20 +180,20 @@ public class BinderResolver { if (bind.startsWith("./")) { bind = StrUtil.removePrefix(bind, "./"); } - if (StringUtils.isNotBlank(bind) && StringUtils.isNotBlank(processExp)) { + if (StringUtils.isNotBlank(bind) && StringUtils.isNotBlank(expression)) { Assert.notEmpty(bindField, "The bindField of @Binding cannot be empty!"); } if (StringUtils.isNotBlank(bind) && StringUtils.isBlank(bindField)) { bindField = bind; } - if (StringUtils.isNotBlank(processExp) && processor == Object.class) { + if (StringUtils.isNotBlank(expression) && processor == Object.class) { processor = SpELProcessor.class; } bindingDef.setField(field); bindingDef.setValue(value); bindingDef.setBind(bind); - bindingDef.setProcessExp(processExp); + bindingDef.setExpression(expression); bindingDef.setProcessor(processor); bindingDef.setBindField(bindField); } -- Gitee From 08489954c42689c512b3b4ddb21f6270eaf83874 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 15:08:42 +0800 Subject: [PATCH 31/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Field.java | 2 +- .../java/com/gitee/dorive/api/entity/FieldDefinition.java | 2 +- .../main/java/com/gitee/dorive/api/entity/def/FieldDef.java | 2 +- .../com/gitee/dorive/api/impl/EntityDefinitionReader.java | 4 ++-- .../com/gitee/dorive/api/impl/EntityElementResolver.java | 2 +- .../gitee/dorive/core/impl/converter/MapExpConverter.java | 6 +++--- .../dorive/core/impl/resolver/EntityMapperResolver.java | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index 617ee141..12c821e8 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -55,7 +55,7 @@ public @interface Field { /** * 映射表达式 */ - String mapExp() default ""; + String expression() default ""; /** * 指定转换器 diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java index 6d11db24..5ed78c87 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java @@ -24,7 +24,7 @@ public class FieldDefinition { private boolean primary; private String alias; private boolean valueObj; - private String mapExp; + private String expression; private String converterName; private String typeName; private boolean collection; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java index f1affe72..9f70bb38 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/FieldDef.java @@ -28,6 +28,6 @@ public class FieldDef { private boolean primary; private String alias; private boolean valueObj; - private String mapExp; + private String expression; private Class converter; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 5dc2aa62..fdb30ad4 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -133,13 +133,13 @@ public class EntityDefinitionReader { fieldDefinition.setPrimary(fieldAnnotation.primary()); fieldDefinition.setAlias(fieldAnnotation.alias()); fieldDefinition.setValueObj(fieldAnnotation.valueObj()); - fieldDefinition.setMapExp(fieldAnnotation.mapExp()); + fieldDefinition.setExpression(fieldAnnotation.expression()); fieldDefinition.setConverterName(fieldAnnotation.converter().getName()); } else { fieldDefinition.setPrimary(false); fieldDefinition.setAlias(StrUtil.toUnderlineCase(fieldName)); fieldDefinition.setValueObj(false); - fieldDefinition.setMapExp(""); + fieldDefinition.setExpression(""); fieldDefinition.setConverterName(Object.class.getName()); } if ("id".equals(fieldName)) { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index e64127af..b6832d22 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -91,7 +91,7 @@ public class EntityElementResolver { fieldDef.setPrimary(fieldDefinition.isPrimary()); fieldDef.setAlias(fieldDefinition.getAlias()); fieldDef.setValueObj(fieldDefinition.isValueObj()); - fieldDef.setMapExp(fieldDefinition.getMapExp()); + fieldDef.setExpression(fieldDefinition.getExpression()); fieldDef.setConverter(ClassUtil.loadClass(fieldDefinition.getConverterName())); fieldElement.setFieldDef(fieldDef); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java index a4ee615d..99befb68 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java @@ -42,11 +42,11 @@ public class MapExpConverter implements Converter { this.fieldElement = fieldElement; FieldDef fieldDef = fieldElement.getFieldDef(); Class genericType = fieldElement.getGenericType(); - String mapExp = fieldDef.getMapExp(); - if (StringUtils.isNotBlank(mapExp)) { + String expression = fieldDef.getExpression(); + if (StringUtils.isNotBlank(expression)) { this.reMapping = new LinkedHashMap<>(8); this.deMapping = new LinkedHashMap<>(8); - List items = StrUtil.splitTrim(mapExp, ","); + List items = StrUtil.splitTrim(expression, ","); for (String item : items) { if (StringUtils.isNotBlank(item)) { List valueValuePair = StrUtil.splitTrim(item, "="); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 1d07f754..bc6d8199 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -114,7 +114,7 @@ public class EntityMapperResolver { return new MapConverter(genericType); } - } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { + } else if (StringUtils.isNotBlank(fieldDef.getExpression())) { return new MapExpConverter(fieldElement); } } -- Gitee From 17ff5427bcf821917db9fe225b1b1bc3f53445e9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 15:12:38 +0800 Subject: [PATCH 32/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/annotation/Aggregate.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index c28092cb..76249618 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -58,12 +58,18 @@ public @interface Aggregate { * @see Entity */ @AliasFor(annotation = Entity.class) - boolean aggregate() default true; + Class repository() default Object.class; + + /** + * 操作优先级 + */ + @AliasFor(annotation = Entity.class) + int priority() default 0; /** * @see Entity */ @AliasFor(annotation = Entity.class) - Class repository() default Object.class; + boolean aggregate() default true; } -- Gitee From bd10891b848e8ca9cde730523c6f93f55b6e96c1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 15:14:37 +0800 Subject: [PATCH 33/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/api/annotation/Order.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java index 3242a597..48f42699 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java @@ -40,8 +40,6 @@ public @interface Order { /** * 默认排序方式 - * - * @see com.gitee.dorive.api.constant.Order */ String order() default ""; -- Gitee From 7b1d3074d4841fcecd827ff2f729d42bf1f2cb85 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 15:53:40 +0800 Subject: [PATCH 34/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0=EF=BC=8C=E6=9B=B4=E5=8A=A0?= =?UTF-8?q?=E5=AE=B9=E6=98=93=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/api/annotation/Aggregate.java | 4 ++-- .../main/java/com/gitee/dorive/api/annotation/Alias.java | 3 +++ .../java/com/gitee/dorive/api/annotation/Entity.java | 4 ++-- .../main/java/com/gitee/dorive/api/annotation/Id.java | 6 ++++++ .../main/java/com/gitee/dorive/api/annotation/Order.java | 4 ++-- .../java/com/gitee/dorive/api/annotation/ValueObj.java | 9 +++++++++ .../com/gitee/dorive/api/entity/EntityDefinition.java | 2 +- .../gitee/dorive/api/entity/FieldEntityDefinition.java | 2 +- .../java/com/gitee/dorive/api/entity/def/EntityDef.java | 2 +- .../gitee/dorive/api/impl/EntityDefinitionReader.java | 4 ++-- .../com/gitee/dorive/api/impl/EntityElementResolver.java | 2 +- .../core/repository/AbstractContextRepository.java | 2 +- 12 files changed, 31 insertions(+), 13 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index 76249618..4931e60b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -61,7 +61,7 @@ public @interface Aggregate { Class repository() default Object.class; /** - * 操作优先级 + * @see Entity */ @AliasFor(annotation = Entity.class) int priority() default 0; @@ -70,6 +70,6 @@ public @interface Aggregate { * @see Entity */ @AliasFor(annotation = Entity.class) - boolean aggregate() default true; + boolean discovery() default true; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java index 43de2fe1..74f22fb7 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Alias.java @@ -36,6 +36,9 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Alias { + /** + * @see Field + */ @AliasFor(annotation = Field.class) String value() default ""; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index f959b2ec..768fb77a 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -54,9 +54,9 @@ public @interface Entity { int priority() default 0; /** - * 是否聚合 + * 是否自动发现 */ - boolean aggregate() default false; + boolean discovery() default false; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java index 04dc5938..6502c21e 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -36,9 +36,15 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface Id { + /** + * @see Field + */ @AliasFor(annotation = Field.class) boolean primary() default true; + /** + * @see Field + */ @AliasFor(annotation = Field.class) String value() default "id"; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java index 48f42699..aae6cfa0 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Order.java @@ -34,12 +34,12 @@ import java.lang.annotation.Target; public @interface Order { /** - * 默认排序字段 + * 排序字段 */ String sortBy() default ""; /** - * 默认排序方式 + * 排序方式 */ String order() default ""; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java index 929d4f1e..075e9069 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java @@ -36,12 +36,21 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface ValueObj { + /** + * @see Field + */ @AliasFor(annotation = Field.class) String value() default ""; + /** + * @see Field + */ @AliasFor(annotation = Field.class) boolean valueObj() default true; + /** + * @see Field + */ @AliasFor(annotation = Field.class) Class converter() default Object.class; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java index 8ea5c336..f1ceff2f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java @@ -34,7 +34,7 @@ public class EntityDefinition { private List fieldDefinitions; private List fieldEntityDefinitions; - public boolean isAggregate() { + public boolean isDiscovery() { return false; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java index 64c70e85..4bc30f5e 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java @@ -25,7 +25,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) public class FieldEntityDefinition extends EntityDefinition { - private boolean aggregate; + private boolean discovery; private List bindingDefinitions; private String sortBy; private String order; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java index 21f8ed9f..6970c9e4 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java @@ -30,5 +30,5 @@ public class EntityDef { private Class factory; private Class repository; private int priority; - private boolean aggregate; + private boolean discovery; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index fdb30ad4..363ddb35 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -156,7 +156,7 @@ public class EntityDefinitionReader { } private FieldEntityDefinition readFieldEntity(Entity entity, Field field) { - boolean aggregate = entity.aggregate(); + boolean discovery = entity.discovery(); Order order = AnnotatedElementUtils.getMergedAnnotation(field, Order.class); Class type = field.getType(); boolean collection = false; @@ -175,7 +175,7 @@ public class EntityDefinitionReader { } FieldEntityDefinition fieldEntityDefinition = BeanUtil.copyProperties(entityDefinition, FieldEntityDefinition.class); - fieldEntityDefinition.setAggregate(aggregate); + fieldEntityDefinition.setDiscovery(discovery); fieldEntityDefinition.setBindingDefinitions(readBindingDefinitions(field)); if (order != null) { fieldEntityDefinition.setSortBy(order.sortBy()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index b6832d22..f1820f98 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -60,7 +60,7 @@ public class EntityElementResolver { entityDef.setFactory(ClassUtil.loadClass(entityDefinition.getFactoryName())); entityDef.setRepository(ClassUtil.loadClass(entityDefinition.getRepositoryName())); entityDef.setPriority(entityDefinition.getPriority()); - entityDef.setAggregate(entityDefinition.isAggregate()); + entityDef.setDiscovery(entityDefinition.isDiscovery()); List bindingDefinitions = entityDefinition.getBindingDefinitions(); List bindingDefs = new ArrayList<>(bindingDefinitions.size()); 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 eab12fd7..5496cf28 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 @@ -141,7 +141,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor private void resetEntityDef(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); - if (entityDef.isAggregate()) { + if (entityDef.isDiscovery()) { Class entityClass = entityElement.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); -- Gitee From 420b5c9678bbc0d569f3894280f2a188f1224dca Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 16:13:16 +0800 Subject: [PATCH 35/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0=EF=BC=8C=E6=9B=B4=E5=8A=A0?= =?UTF-8?q?=E5=AE=B9=E6=98=93=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Binding.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java index 46486d12..ffe69004 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Binding.java @@ -40,7 +40,7 @@ public @interface Binding { String value() default ""; /** - * 绑定的字段 + * 绑定的上下文字段 */ String bind() default ""; @@ -55,7 +55,7 @@ public @interface Binding { Class processor() default Object.class; /** - * 绑定的字段名称 + * 绑定的真实字段 */ String bindField() default ""; -- Gitee From 324f23cdf5548ad776c0489fa75df939ce51e048 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Wed, 26 Jun 2024 17:49:25 +0800 Subject: [PATCH 36/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/repository/AbstractContextRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5496cf28..110f2162 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 @@ -86,7 +86,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor String accessPath = entityElement.getAccessPath(); CommonRepository repository = newRepository(entityElement); repositoryMap.put(accessPath, repository); - if ("/".equals(accessPath)) { + if (repository.isRoot()) { rootRepository = repository; } else { subRepositories.add(repository); -- Gitee From af388a6b3f1b28d52d8a2f59b62ecbfed5127281 Mon Sep 17 00:00:00 2001 From: "tao.chen1" <609580885@qq.com> Date: Thu, 27 Jun 2024 09:49:25 +0800 Subject: [PATCH 37/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Aggregate.java | 2 +- .../src/main/java/com/gitee/dorive/api/annotation/Entity.java | 2 +- .../java/com/gitee/dorive/api/entity/EntityDefinition.java | 2 +- .../com/gitee/dorive/api/entity/FieldEntityDefinition.java | 2 +- .../main/java/com/gitee/dorive/api/entity/def/EntityDef.java | 2 +- .../com/gitee/dorive/api/impl/EntityDefinitionReader.java | 4 ++-- .../java/com/gitee/dorive/api/impl/EntityElementResolver.java | 2 +- .../dorive/core/repository/AbstractContextRepository.java | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index 4931e60b..d893dae6 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -70,6 +70,6 @@ public @interface Aggregate { * @see Entity */ @AliasFor(annotation = Entity.class) - boolean discovery() default true; + boolean autoDiscovery() default true; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index 768fb77a..5315c3f3 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -56,7 +56,7 @@ public @interface Entity { /** * 是否自动发现 */ - boolean discovery() default false; + boolean autoDiscovery() default false; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java index f1ceff2f..23d67d1c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityDefinition.java @@ -34,7 +34,7 @@ public class EntityDefinition { private List fieldDefinitions; private List fieldEntityDefinitions; - public boolean isDiscovery() { + public boolean isAutoDiscovery() { return false; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java index 4bc30f5e..9046d374 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldEntityDefinition.java @@ -25,7 +25,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) public class FieldEntityDefinition extends EntityDefinition { - private boolean discovery; + private boolean autoDiscovery; private List bindingDefinitions; private String sortBy; private String order; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java index 6970c9e4..02f67a15 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/def/EntityDef.java @@ -30,5 +30,5 @@ public class EntityDef { private Class factory; private Class repository; private int priority; - private boolean discovery; + private boolean autoDiscovery; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java index 363ddb35..d8939603 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityDefinitionReader.java @@ -156,7 +156,7 @@ public class EntityDefinitionReader { } private FieldEntityDefinition readFieldEntity(Entity entity, Field field) { - boolean discovery = entity.discovery(); + boolean autoDiscovery = entity.autoDiscovery(); Order order = AnnotatedElementUtils.getMergedAnnotation(field, Order.class); Class type = field.getType(); boolean collection = false; @@ -175,7 +175,7 @@ public class EntityDefinitionReader { } FieldEntityDefinition fieldEntityDefinition = BeanUtil.copyProperties(entityDefinition, FieldEntityDefinition.class); - fieldEntityDefinition.setDiscovery(discovery); + fieldEntityDefinition.setAutoDiscovery(autoDiscovery); fieldEntityDefinition.setBindingDefinitions(readBindingDefinitions(field)); if (order != null) { fieldEntityDefinition.setSortBy(order.sortBy()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java index f1820f98..bc6efdbd 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/EntityElementResolver.java @@ -60,7 +60,7 @@ public class EntityElementResolver { entityDef.setFactory(ClassUtil.loadClass(entityDefinition.getFactoryName())); entityDef.setRepository(ClassUtil.loadClass(entityDefinition.getRepositoryName())); entityDef.setPriority(entityDefinition.getPriority()); - entityDef.setDiscovery(entityDefinition.isDiscovery()); + entityDef.setAutoDiscovery(entityDefinition.isAutoDiscovery()); List bindingDefinitions = entityDefinition.getBindingDefinitions(); List bindingDefs = new ArrayList<>(bindingDefinitions.size()); 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 110f2162..9ffdca42 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 @@ -141,7 +141,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor private void resetEntityDef(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); - if (entityDef.isDiscovery()) { + if (entityDef.isAutoDiscovery()) { Class entityClass = entityElement.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); -- Gitee From 54ab90445e1ff4fef3860359bf7e1adb3f38d552 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 Jun 2024 19:12:46 +0800 Subject: [PATCH 38/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B33.5.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index bae9c570..07d9b27f 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index cd99288b..5a1d6461 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index f886a5fc..cff0615c 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index fe2c84f0..e818a9f3 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index feae78e0..b1c4f6f4 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index c8f1722b..a961cd91 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-mybatis-plus diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 00cdbadc..b6bc1253 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index ed48a060..9b410a6e 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 3d6cb0f5..38827f71 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.5.0.0 + 3.5.0.1 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 2ac56e41..13e47556 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 9d1fdb69..36a458b8 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 dorive-web diff --git a/pom.xml b/pom.xml index f18b0865..4d4aba63 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.0.0 + 3.5.0.1 pom -- Gitee From a4daf86d2011ccc2128a4cf7fc4bda55b92e5d95 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 Jun 2024 19:37:29 +0800 Subject: [PATCH 39/77] =?UTF-8?q?=E9=80=82=E9=85=8D2.7.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/config/RepositoryContext.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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 129a504f..88da6277 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,15 +17,15 @@ package com.gitee.dorive.core.config; +import cn.hutool.core.util.ClassUtil; import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.repository.AbstractContextRepository; +import org.apache.commons.lang3.StringUtils; 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; @@ -38,13 +38,12 @@ public class RepositoryContext implements BeanFactoryPostProcessor { 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); + String beanClassName = beanDefinition.getBeanClassName(); + if (StringUtils.isNotBlank(beanClassName) && !beanClassName.startsWith("org.springframework.")) { + Class beanClass = ClassUtil.loadClass(beanClassName); + if (AbstractContextRepository.class.isAssignableFrom(beanClass)) { + Class entityClass = ReflectUtils.getFirstArgumentType(beanClass); + ENTITY_REPOSITORY_MAP.put(entityClass, beanClass); } } } -- Gitee From 3cc2771c9c459ff2b74a05e17073eac096b4b387 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 10:45:20 +0800 Subject: [PATCH 40/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/resolver/BinderResolver.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 b4de4df8..32a2489e 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 @@ -83,8 +83,8 @@ public class BinderResolver { String fieldErrorMsg = "The field configured for @Binding does not exist within the entity! type: {}, field: {}"; for (BindingDef bindingDef : bindingDefs) { - BindingType bindingType = determineBindingType(bindingDef); resetBindingDef(bindingDef); + BindingType bindingType = determineBindingType(bindingDef); Processor processor = newProcessor(bindingDef); if (bindingType == BindingType.VALUE_ROUTE) { @@ -146,10 +146,10 @@ public class BinderResolver { } private BindingType determineBindingType(BindingDef bindingDef) { - String field = StrUtil.trim(bindingDef.getField()); - String value = StrUtil.trim(bindingDef.getValue()); - String bind = StrUtil.trim(bindingDef.getBind()); - String expression = StrUtil.trim(bindingDef.getExpression()); + String field = bindingDef.getField(); + String value = bindingDef.getValue(); + String bind = bindingDef.getBind(); + String expression = bindingDef.getExpression(); if (ObjectUtil.isAllNotEmpty(field, bind)) { return BindingType.STRONG; -- Gitee From 80917d39d91d3ed3ba027c2a0d58281e3fd83b05 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 10:47:33 +0800 Subject: [PATCH 41/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/resolver/BinderResolver.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) 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 32a2489e..c173cd7e 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 @@ -145,26 +145,6 @@ public class BinderResolver { } } - private BindingType determineBindingType(BindingDef bindingDef) { - String field = bindingDef.getField(); - String value = bindingDef.getValue(); - String bind = bindingDef.getBind(); - String expression = bindingDef.getExpression(); - if (ObjectUtil.isAllNotEmpty(field, bind)) { - return BindingType.STRONG; - - } else if (ObjectUtil.isAllNotEmpty(field, expression)) { - return BindingType.WEAK; - - } else if (ObjectUtil.isAllNotEmpty(value, bind)) { - return BindingType.VALUE_ROUTE; - - } else if (ObjectUtil.isAllNotEmpty(field, value)) { - return BindingType.VALUE_FILTER; - } - throw new RuntimeException("Unknown binding type!"); - } - private void resetBindingDef(BindingDef bindingDef) { String field = StrUtil.trim(bindingDef.getField()); String value = StrUtil.trim(bindingDef.getValue()); @@ -198,6 +178,26 @@ public class BinderResolver { bindingDef.setBindField(bindField); } + private BindingType determineBindingType(BindingDef bindingDef) { + String field = bindingDef.getField(); + String value = bindingDef.getValue(); + String bind = bindingDef.getBind(); + String expression = bindingDef.getExpression(); + if (ObjectUtil.isAllNotEmpty(field, bind)) { + return BindingType.STRONG; + + } else if (ObjectUtil.isAllNotEmpty(field, expression)) { + return BindingType.WEAK; + + } else if (ObjectUtil.isAllNotEmpty(value, bind)) { + return BindingType.VALUE_ROUTE; + + } else if (ObjectUtil.isAllNotEmpty(field, value)) { + return BindingType.VALUE_FILTER; + } + throw new RuntimeException("Unknown binding type!"); + } + private Processor newProcessor(BindingDef bindingDef) { Assert.notNull(bindingDef, "The bindingDef cannot be null!"); Class processorClass = bindingDef.getProcessor(); -- Gitee From e03427fd14f0a395e209d603512a43c22c05d22f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 15:50:58 +0800 Subject: [PATCH 42/77] =?UTF-8?q?=E4=BC=98=E5=8C=96Binder=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/entity/ele/EntityElement.java | 5 +- .../dorive/api/entity/ele/PropChain.java | 45 ---------- .../gitee/dorive/core/api/binder/Binder.java | 15 +--- .../dorive/core/api/binder/Endpoint.java | 10 ++- .../{FieldBinder.java => AbstractBinder.java} | 80 +++++++++-------- .../dorive/core/impl/binder/BoundBinder.java | 90 ------------------- .../dorive/core/impl/binder/StrongBinder.java | 36 ++------ .../core/impl/binder/ValueFilterBinder.java | 15 ++-- .../core/impl/binder/ValueRouteBinder.java | 22 +++-- .../dorive/core/impl/binder/WeakBinder.java | 13 ++- .../core/impl/endpoint/AbstractEndpoint.java | 21 +++++ .../core/impl/endpoint/BindEndpoint.java | 20 +++++ .../core/impl/endpoint/FieldEndpoint.java | 17 ++++ .../core/impl/endpoint/SpELEndpoint.java | 17 ++-- .../core/impl/joiner/MultiEntityJoiner.java | 4 +- .../core/impl/resolver/BinderResolver.java | 46 +++++----- .../core/repository/CommonRepository.java | 19 ++-- .../impl/executor/StepwiseQueryExecutor.java | 9 +- .../resolver/MergedRepositoryResolver.java | 4 +- .../sql/impl/segment/SegmentBuilder.java | 6 +- 20 files changed, 196 insertions(+), 298 deletions(-) delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java rename dorive-api/src/main/java/com/gitee/dorive/api/api/PropProxy.java => dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java (81%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/{FieldBinder.java => AbstractBinder.java} (39%) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java rename dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java => dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/SpELEndpoint.java (77%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java index 25af9f7c..64ca8c41 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/EntityElement.java @@ -19,7 +19,6 @@ package com.gitee.dorive.api.entity.ele; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.entity.EntityDefinition; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; @@ -35,7 +34,7 @@ import java.util.*; @Setter @NoArgsConstructor @AllArgsConstructor -public class EntityElement implements PropProxy { +public class EntityElement { private EntityDefinition entityDefinition; private String accessPath; @@ -51,12 +50,10 @@ public class EntityElement implements PropProxy { return entityDefinition.isCollection(); } - @Override public Object getValue(Object entity) { return ReflectUtil.getFieldValue(entity, entityDefinition.getFieldName()); } - @Override public void setValue(Object entity, Object value) { ReflectUtil.setFieldValue(entity, entityDefinition.getFieldName(), value); } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java deleted file mode 100644 index c15d3447..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/PropChain.java +++ /dev/null @@ -1,45 +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.api.entity.ele; - -import com.gitee.dorive.api.api.PropProxy; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class PropChain implements PropProxy { - - private FieldElement fieldElement; - private PropProxy propProxy; - - @Override - public Object getValue(Object entity) { - return propProxy.getValue(entity); - } - - @Override - public void setValue(Object entity, Object value) { - propProxy.setValue(entity, value); - } - - public boolean isSameType(PropChain boundPropChain) { - return fieldElement.isSameType(boundPropChain.getFieldElement()); - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java index 02ac3f00..66fa0b17 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Binder.java @@ -17,20 +17,13 @@ package com.gitee.dorive.core.api.binder; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; public interface Binder extends Processor { - String getFieldName(); + FieldEndpoint getFieldEndpoint(); - Object getFieldValue(Context context, Object entity); - - void setFieldValue(Context context, Object entity, Object property); - - String getBoundName(); - - Object getBoundValue(Context context, Object rootEntity); - - void setBoundValue(Context context, Object rootEntity, Object property); + BindEndpoint getBindEndpoint(); } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/api/PropProxy.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java similarity index 81% rename from dorive-api/src/main/java/com/gitee/dorive/api/api/PropProxy.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java index 7906a3d5..cf6553b4 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/api/PropProxy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java @@ -15,12 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.api.api; +package com.gitee.dorive.core.api.binder; -public interface PropProxy { +import com.gitee.dorive.api.entity.ele.FieldElement; + +public interface Endpoint { + + FieldElement getFieldElement(); Object getValue(Object entity); void setValue(Object entity, Object value); + boolean isSameType(Endpoint endpoint); + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java similarity index 39% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java index 3832bd18..7baebdef 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/FieldBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java @@ -1,67 +1,47 @@ -/* - * 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.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; 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 com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data +@Getter +@Setter @AllArgsConstructor -public class FieldBinder implements Binder { +public abstract class AbstractBinder implements Binder { protected BindingDef bindingDef; + protected FieldEndpoint fieldEndpoint; + protected BindEndpoint bindEndpoint; protected Processor processor; - protected PropChain fieldPropChain; - protected String alias; - @Override public String getFieldName() { - return fieldPropChain.getFieldElement().getFieldName(); + return fieldEndpoint.getFieldElement().getFieldName(); } - @Override public Object getFieldValue(Context context, Object entity) { - return fieldPropChain.getValue(entity); + return fieldEndpoint.getValue(entity); } - @Override - public void setFieldValue(Context context, Object entity, Object property) { - fieldPropChain.setValue(entity, property); + public void setFieldValue(Context context, Object entity, Object value) { + fieldEndpoint.setValue(entity, value); } - @Override public String getBoundName() { - return null; + return bindEndpoint.getFieldElement().getFieldName(); } - @Override - public Object getBoundValue(Context context, Object rootEntity) { - return null; + public Object getBoundValue(Context context, Object entity) { + return bindEndpoint.getValue(entity); } - @Override - public void setBoundValue(Context context, Object rootEntity, Object property) { - // ignore + public void setBoundValue(Context context, Object entity, Object value) { + bindEndpoint.setValue(entity, value); } @Override @@ -74,4 +54,28 @@ public class FieldBinder implements Binder { return value == null || processor == null ? value : processor.output(context, value); } + public String getBindField() { + return bindingDef.getBindField(); + } + + public String getAlias() { + return fieldEndpoint.getAlias(); + } + + public boolean isCollection() { + return bindEndpoint.getFieldElement().isCollection(); + } + + public String getBelongAccessPath() { + return bindEndpoint.getBelongAccessPath(); + } + + public String getBindAlias() { + return bindEndpoint.getBindAlias(); + } + + public boolean isSameType() { + return fieldEndpoint.isSameType(bindEndpoint); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java deleted file mode 100644 index d77aa46b..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/BoundBinder.java +++ /dev/null @@ -1,90 +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.impl.binder; - -import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; -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 com.gitee.dorive.core.repository.CommonRepository; -import lombok.AllArgsConstructor; -import lombok.Data; -import org.apache.commons.lang3.StringUtils; - -@Data -@AllArgsConstructor -public class BoundBinder implements Binder { - - protected BindingDef bindingDef; - protected Processor processor; - protected PropChain boundPropChain; - protected String belongAccessPath; - protected CommonRepository belongRepository; - protected String bindAlias; - - public BoundBinder(BindingDef bindingDef, Processor processor) { - this.bindingDef = bindingDef; - this.processor = processor; - } - - @Override - public String getFieldName() { - return null; - } - - @Override - public Object getFieldValue(Context context, Object entity) { - return null; - } - - @Override - public void setFieldValue(Context context, Object entity, Object property) { - // ignore - } - - @Override - public String getBoundName() { - String bindField = bindingDef.getBindField(); - if (StringUtils.isNotBlank(bindField)) { - return bindField; - } - return boundPropChain.getFieldElement().getFieldName(); - } - - @Override - public Object getBoundValue(Context context, Object rootEntity) { - return boundPropChain.getValue(rootEntity); - } - - @Override - public void setBoundValue(Context context, Object rootEntity, Object property) { - boundPropChain.setValue(rootEntity, property); - } - - @Override - public Object input(Context context, Object value) { - return value == null || processor == null ? value : processor.input(context, value); - } - - @Override - public Object output(Context context, Object value) { - return value == null || processor == null ? value : processor.output(context, value); - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java index 46e404f8..3c5a292c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/StrongBinder.java @@ -18,44 +18,18 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class StrongBinder extends FieldBinder { +public class StrongBinder extends AbstractBinder { - private BoundBinder boundBinder; - - public StrongBinder(BindingDef bindingDef, Processor processor, PropChain fieldPropChain, String alias) { - super(bindingDef, processor, fieldPropChain, alias); - this.boundBinder = new BoundBinder(bindingDef, processor); - } - - @Override - public String getBoundName() { - return boundBinder.getBoundName(); - } - - @Override - public Object getBoundValue(Context context, Object rootEntity) { - return boundBinder.getBoundValue(context, rootEntity); - } - - @Override - public void setBoundValue(Context context, Object rootEntity, Object property) { - boundBinder.setBoundValue(context, rootEntity, property); - } - - public boolean isSameType() { - return getFieldPropChain().isSameType(boundBinder.getBoundPropChain()); - } - - public boolean isCollection() { - return boundBinder.getBoundPropChain().getFieldElement().isCollection(); + public StrongBinder(BindingDef bindingDef, FieldEndpoint fieldEndpoint, BindEndpoint bindEndpoint, Processor processor) { + super(bindingDef, fieldEndpoint, bindEndpoint, processor); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java index c27eb070..deb75f67 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueFilterBinder.java @@ -19,21 +19,22 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class ValueFilterBinder extends FieldBinder { +public class ValueFilterBinder extends AbstractBinder { private Object value; - public ValueFilterBinder(BindingDef bindingDef, Processor processor, PropChain fieldPropChain, String alias) { - super(bindingDef, processor, fieldPropChain, alias); - Class genericType = fieldPropChain.getFieldElement().getGenericType(); + public ValueFilterBinder(BindingDef bindingDef, FieldEndpoint fieldEndpoint, BindEndpoint bindEndpoint, Processor processor) { + super(bindingDef, fieldEndpoint, bindEndpoint, processor); + Class genericType = fieldEndpoint.getFieldElement().getGenericType(); this.value = Convert.convert(genericType, bindingDef.getValue()); } @@ -43,12 +44,12 @@ public class ValueFilterBinder extends FieldBinder { } @Override - public Object getBoundValue(Context context, Object rootEntity) { + public Object getBoundValue(Context context, Object entity) { return value; } @Override - public void setBoundValue(Context context, Object rootEntity, Object property) { + public void setBoundValue(Context context, Object entity, Object property) { throw new UnsupportedOperationException(); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java index 9d6151e4..af5dc3c9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ValueRouteBinder.java @@ -19,27 +19,28 @@ package com.gitee.dorive.core.impl.binder; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class ValueRouteBinder extends BoundBinder { +public class ValueRouteBinder extends AbstractBinder { private Object value; - public ValueRouteBinder(BindingDef bindingDef, Processor processor) { - super(bindingDef, processor); + public ValueRouteBinder(BindingDef bindingDef, FieldEndpoint fieldEndpoint, BindEndpoint bindEndpoint, Processor processor) { + super(bindingDef, fieldEndpoint, bindEndpoint, processor); + Class genericType = bindEndpoint.getFieldElement().getGenericType(); + this.value = Convert.convert(genericType, bindingDef.getValue()); } @Override - public void setBoundPropChain(PropChain boundPropChain) { - super.setBoundPropChain(boundPropChain); - Class genericType = boundPropChain.getFieldElement().getGenericType(); - this.value = Convert.convert(genericType, bindingDef.getValue()); + public String getFieldName() { + throw new UnsupportedOperationException(); } @Override @@ -47,4 +48,9 @@ public class ValueRouteBinder extends BoundBinder { return value; } + @Override + public void setFieldValue(Context context, Object entity, Object value) { + throw new UnsupportedOperationException(); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java index b40f8e0c..a5130cd0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/WeakBinder.java @@ -18,14 +18,19 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.api.entity.ele.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; +import lombok.Getter; +import lombok.Setter; -public class WeakBinder extends FieldBinder { +@Getter +@Setter +public class WeakBinder extends AbstractBinder { - public WeakBinder(BindingDef bindingDef, Processor processor, PropChain fieldPropChain, String alias) { - super(bindingDef, processor, fieldPropChain, alias); + public WeakBinder(BindingDef bindingDef, FieldEndpoint fieldEndpoint, BindEndpoint bindEndpoint, Processor processor) { + super(bindingDef, fieldEndpoint, bindEndpoint, processor); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java new file mode 100644 index 00000000..6400f983 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java @@ -0,0 +1,21 @@ +package com.gitee.dorive.core.impl.endpoint; + +import com.gitee.dorive.core.api.binder.Endpoint; +import com.gitee.dorive.api.entity.ele.FieldElement; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public abstract class AbstractEndpoint implements Endpoint { + + private FieldElement fieldElement; + + @Override + public boolean isSameType(Endpoint endpoint) { + return fieldElement.isSameType(endpoint.getFieldElement()); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java new file mode 100644 index 00000000..65491301 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java @@ -0,0 +1,20 @@ +package com.gitee.dorive.core.impl.endpoint; + +import com.gitee.dorive.api.entity.ele.FieldElement; +import com.gitee.dorive.core.repository.CommonRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BindEndpoint extends SpELEndpoint { + + private String belongAccessPath; + private CommonRepository belongRepository; + private String bindAlias; + + public BindEndpoint(FieldElement fieldElement, String expression) { + super(fieldElement, expression); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java new file mode 100644 index 00000000..6b28a2b9 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java @@ -0,0 +1,17 @@ +package com.gitee.dorive.core.impl.endpoint; + +import com.gitee.dorive.api.entity.ele.FieldElement; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FieldEndpoint extends SpELEndpoint { + + private String alias; + + public FieldEndpoint(FieldElement fieldElement, String expression) { + super(fieldElement, expression); + } + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/SpELEndpoint.java similarity index 77% rename from dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/SpELEndpoint.java index ac7c81c3..e170c631 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/SpELPropProxy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/SpELEndpoint.java @@ -15,26 +15,21 @@ * limitations under the License. */ -package com.gitee.dorive.api.impl; +package com.gitee.dorive.core.impl.endpoint; -import com.gitee.dorive.api.api.PropProxy; -import lombok.AllArgsConstructor; -import lombok.Data; +import com.gitee.dorive.api.entity.ele.FieldElement; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; -@Data -@AllArgsConstructor -public class SpELPropProxy implements PropProxy { +public class SpELEndpoint extends AbstractEndpoint { private final Expression expression; - public static PropProxy newPropProxy(String expression) { - ExpressionParser parser = new SpelExpressionParser(); - return new SpELPropProxy(parser.parseExpression(expression)); + public SpELEndpoint(FieldElement fieldElement, String expression) { + super(fieldElement); + this.expression = new SpelExpressionParser().parseExpression(expression); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java index 039a5a58..c1f58f40 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.impl.binder.FieldBinder; +import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.MultiInBuilder; @@ -54,7 +54,7 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { } private MultiInBuilder newMultiInBuilder(Context context, List entities) { - List aliases = binders.stream().map(FieldBinder::getAlias).collect(Collectors.toList()); + List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); MultiInBuilder multiInBuilder = new MultiInBuilder(aliases, entities.size()); for (Object entity : entities) { 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 c173cd7e..d3172da1 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 @@ -22,20 +22,22 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.api.entity.ele.FieldElement; -import com.gitee.dorive.api.entity.ele.PropChain; -import com.gitee.dorive.api.impl.SpELPropProxy; 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 com.gitee.dorive.core.entity.enums.BindingType; import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.binder.*; +import com.gitee.dorive.core.impl.binder.StrongBinder; +import com.gitee.dorive.core.impl.binder.ValueFilterBinder; +import com.gitee.dorive.core.impl.binder.ValueRouteBinder; +import com.gitee.dorive.core.impl.binder.WeakBinder; +import com.gitee.dorive.core.impl.endpoint.BindEndpoint; +import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import com.gitee.dorive.core.impl.processor.SpELProcessor; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -88,8 +90,8 @@ public class BinderResolver { Processor processor = newProcessor(bindingDef); if (bindingType == BindingType.VALUE_ROUTE) { - ValueRouteBinder valueRouteBinder = new ValueRouteBinder(bindingDef, processor); - initBoundBinder(bindingDef, valueRouteBinder); + BindEndpoint bindEndpoint = newBindEndpoint(bindingDef); + ValueRouteBinder valueRouteBinder = new ValueRouteBinder(bindingDef, null, bindEndpoint, processor); allBinders.add(valueRouteBinder); valueRouteBinders.add(valueRouteBinder); continue; @@ -99,18 +101,17 @@ public class BinderResolver { String alias = entityElement.toAlias(field); FieldElement fieldElement = entityElement.getFieldElement(field); - PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + field); - PropChain fieldPropChain = new PropChain(fieldElement, propProxy); - Assert.notNull(fieldPropChain, fieldErrorMsg, genericType.getName(), field); + Assert.notNull(fieldElement, fieldErrorMsg, genericType.getName(), field); + FieldEndpoint fieldEndpoint = new FieldEndpoint(fieldElement, "#entity." + field); + fieldEndpoint.setAlias(alias); if (bindingType == BindingType.STRONG) { - StrongBinder strongBinder = new StrongBinder(bindingDef, processor, fieldPropChain, alias); - BoundBinder boundBinder = strongBinder.getBoundBinder(); - initBoundBinder(bindingDef, boundBinder); + BindEndpoint bindEndpoint = newBindEndpoint(bindingDef); + StrongBinder strongBinder = new StrongBinder(bindingDef, fieldEndpoint, bindEndpoint, processor); allBinders.add(strongBinder); strongBinders.add(strongBinder); - String belongAccessPath = boundBinder.getBelongAccessPath(); + String belongAccessPath = bindEndpoint.getBelongAccessPath(); List strongBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); strongBinders.add(strongBinder); @@ -123,12 +124,12 @@ public class BinderResolver { selfFields.add(field); } else if (bindingType == BindingType.WEAK) { - WeakBinder weakBinder = new WeakBinder(bindingDef, processor, fieldPropChain, alias); + WeakBinder weakBinder = new WeakBinder(bindingDef, fieldEndpoint, null, processor); allBinders.add(weakBinder); weakBinders.add(weakBinder); } else if (bindingType == BindingType.VALUE_FILTER) { - ValueFilterBinder valueFilterBinder = new ValueFilterBinder(bindingDef, processor, fieldPropChain, alias); + ValueFilterBinder valueFilterBinder = new ValueFilterBinder(bindingDef, fieldEndpoint, null, processor); allBinders.add(valueFilterBinder); valueFilterBinders.add(valueFilterBinder); } @@ -218,16 +219,15 @@ public class BinderResolver { } } - private void initBoundBinder(BindingDef bindingDef, BoundBinder boundBinder) { + private BindEndpoint newBindEndpoint(BindingDef bindingDef) { String bind = bindingDef.getBind(); String bindField = bindingDef.getBindField(); CommonRepository rootRepository = repository.getRootRepository(); EntityElement entityElement = rootRepository.getEntityElement(); FieldElement fieldElement = entityElement.getFieldElement(bind); - PropProxy propProxy = SpELPropProxy.newPropProxy("#entity." + bind); - PropChain boundPropChain = new PropChain(fieldElement, propProxy); - Assert.notNull(boundPropChain, "The bound property chain cannot be null! bind: {}", bind); + Assert.notNull(fieldElement, "The bound property chain cannot be null! bind: {}", bind); + BindEndpoint bindEndpoint = new BindEndpoint(fieldElement, "#entity." + bind); Map repositoryMap = repository.getRepositoryMap(); CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bind, rootRepository); @@ -235,10 +235,10 @@ public class BinderResolver { EntityElement belongEntityElement = belongRepository.getEntityElement(); String bindAlias = belongEntityElement.toAlias(bindField); - boundBinder.setBoundPropChain(boundPropChain); - boundBinder.setBelongAccessPath(belongRepository.getAccessPath()); - boundBinder.setBelongRepository(belongRepository); - boundBinder.setBindAlias(bindAlias); + bindEndpoint.setBelongAccessPath(belongRepository.getAccessPath()); + bindEndpoint.setBelongRepository(belongRepository); + bindEndpoint.setBindAlias(bindAlias); + return bindEndpoint; } public void appendFilterValue(Context context, Example example) { 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 f2595889..9bf3da3f 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 @@ -17,7 +17,6 @@ package com.gitee.dorive.core.repository; -import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; @@ -125,12 +124,12 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher public void getBoundValue(Context context, Object rootEntity, Collection entities) { for (Object entity : entities) { - for (Binder binder : binderResolver.getStrongBinders()) { - Object fieldValue = binder.getFieldValue(context, entity); + for (StrongBinder strongBinder : binderResolver.getStrongBinders()) { + Object fieldValue = strongBinder.getFieldValue(context, entity); if (fieldValue == null) { - Object boundValue = binder.getBoundValue(context, rootEntity); + Object boundValue = strongBinder.getBoundValue(context, rootEntity); if (boundValue != null) { - binder.setFieldValue(context, entity, boundValue); + strongBinder.setFieldValue(context, entity, boundValue); } } } @@ -138,13 +137,13 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher } public void setBoundId(Context context, Object rootEntity, Object entity) { - Binder binder = binderResolver.getBoundIdBinder(); - if (binder != null) { - Object boundValue = binder.getBoundValue(context, rootEntity); + StrongBinder boundIdBinder = binderResolver.getBoundIdBinder(); + if (boundIdBinder != null) { + Object boundValue = boundIdBinder.getBoundValue(context, rootEntity); if (boundValue == null) { - Object primaryKey = binder.getFieldValue(context, entity); + Object primaryKey = boundIdBinder.getFieldValue(context, entity); if (primaryKey != null) { - binder.setBoundValue(context, rootEntity, primaryKey); + boundIdBinder.setBoundValue(context, rootEntity, primaryKey); } } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index 20505858..b5ef4ded 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -21,6 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -117,7 +118,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { Object fieldValue = valueRouteBinder.getFieldValue(context, null); if (fieldValue != null) { - String boundName = valueRouteBinder.getBoundName(); + String boundName = valueRouteBinder.getBindField(); targetExample.eq(boundName, fieldValue); } } @@ -136,7 +137,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { StrongBinder strongBinder = strongBinders.get(0); List fieldValues = collectFieldValues(context, entities, strongBinder); if (!fieldValues.isEmpty()) { - String boundName = strongBinder.getBoundName(); + String boundName = strongBinder.getBindField(); if (fieldValues.size() == 1) { targetExample.eq(boundName, fieldValues.get(0)); } else { @@ -147,9 +148,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } } else { - List aliases = strongBinders.stream() - .map(binder -> binder.getBoundBinder().getBindAlias()) - .collect(Collectors.toList()); + List aliases = strongBinders.stream().map(AbstractBinder::getBindAlias).collect(Collectors.toList()); MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); collectFieldValues(context, entities, strongBinders, builder); if (!builder.isEmpty()) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 756288f2..8ab909d0 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -18,7 +18,6 @@ package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.core.impl.binder.BoundBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -97,8 +96,7 @@ public class MergedRepositoryResolver { List strongBinders = binderResolver.getStrongBinders(); Map> relativeStrongBindersMap = new LinkedHashMap<>(); for (StrongBinder strongBinder : strongBinders) { - BoundBinder boundBinder = strongBinder.getBoundBinder(); - String relativeAccessPath = lastAccessPath + boundBinder.getBelongAccessPath(); + String relativeAccessPath = lastAccessPath + strongBinder.getBelongAccessPath(); List existBinders = relativeStrongBindersMap.computeIfAbsent(relativeAccessPath, key -> new ArrayList<>(4)); existBinders.add(strongBinder); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index 1244cf3f..fac116b3 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -25,7 +25,6 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.impl.binder.BoundBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueFilterBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; @@ -125,8 +124,7 @@ public class SegmentBuilder { List onSegments = new ArrayList<>(strongBinders.size()); for (StrongBinder strongBinder : strongBinders) { - BoundBinder boundBinder = strongBinder.getBoundBinder(); - String relativeAccessPath = lastAccessPath + boundBinder.getBelongAccessPath(); + String relativeAccessPath = lastAccessPath + strongBinder.getBelongAccessPath(); Node targetNode = nodeMap.get(relativeAccessPath); if (targetNode != null) { TableSegment targetTableSegment = targetNode.getTableSegment(); @@ -134,7 +132,7 @@ public class SegmentBuilder { if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getAlias(), targetTableSegment.getTableAlias(), boundBinder.getBindAlias()); + OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getAlias(), targetTableSegment.getTableAlias(), strongBinder.getBindAlias()); onSegments.add(onSegment); } } -- Gitee From deb01f8c69b1c04368b65f6e7d15c4d5dfd78ee4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 16:56:55 +0800 Subject: [PATCH 43/77] =?UTF-8?q?=E4=BC=98=E5=8C=96Binder=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/entity/FieldDefinition.java | 4 ++++ .../com/gitee/dorive/api/entity/ele/FieldElement.java | 8 +++++--- .../gitee/dorive/core/impl/binder/AbstractBinder.java | 8 ++++---- .../dorive/core/impl/endpoint/AbstractEndpoint.java | 4 ++++ .../gitee/dorive/core/impl/endpoint/BindEndpoint.java | 2 +- .../dorive/core/impl/endpoint/FieldEndpoint.java | 2 -- .../dorive/core/impl/joiner/MultiEntityJoiner.java | 2 +- .../dorive/core/impl/resolver/BinderResolver.java | 11 ++++------- .../query/impl/executor/StepwiseQueryExecutor.java | 2 +- .../gitee/dorive/sql/impl/segment/SegmentBuilder.java | 6 +++--- 10 files changed, 27 insertions(+), 22 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java index 5ed78c87..3ee78a9b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/FieldDefinition.java @@ -30,4 +30,8 @@ public class FieldDefinition { private boolean collection; private String genericTypeName; private String fieldName; + + public boolean isSameType(FieldDefinition fieldDefinition) { + return typeName.equals(fieldDefinition.getTypeName()) && genericTypeName.equals(fieldDefinition.getGenericTypeName()); + } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java index 33d2097c..98c6b36c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/ele/FieldElement.java @@ -28,6 +28,10 @@ public class FieldElement { private FieldDef fieldDef; private Class genericType; + public String getAlias() { + return fieldDefinition.getAlias(); + } + public boolean isCollection() { return fieldDefinition.isCollection(); } @@ -37,9 +41,7 @@ public class FieldElement { } public boolean isSameType(FieldElement fieldElement) { - FieldDefinition targetFieldDefinition = fieldElement.getFieldDefinition(); - return fieldDefinition.getTypeName().equals(targetFieldDefinition.getTypeName()) - && fieldDefinition.getGenericTypeName().equals(targetFieldDefinition.getGenericTypeName()); + return fieldDefinition.isSameType(fieldElement.getFieldDefinition()); } } 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 7baebdef..391c5e55 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 @@ -58,11 +58,11 @@ public abstract class AbstractBinder implements Binder { return bindingDef.getBindField(); } - public String getAlias() { + public String getFieldAlias() { return fieldEndpoint.getAlias(); } - public boolean isCollection() { + public boolean isBindCollection() { return bindEndpoint.getFieldElement().isCollection(); } @@ -70,8 +70,8 @@ public abstract class AbstractBinder implements Binder { return bindEndpoint.getBelongAccessPath(); } - public String getBindAlias() { - return bindEndpoint.getBindAlias(); + public String getBindFieldAlias() { + return bindEndpoint.getBindFieldAlias(); } public boolean isSameType() { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java index 6400f983..4097ad95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java @@ -13,6 +13,10 @@ public abstract class AbstractEndpoint implements Endpoint { private FieldElement fieldElement; + public String getAlias() { + return fieldElement.getAlias(); + } + @Override public boolean isSameType(Endpoint endpoint) { return fieldElement.isSameType(endpoint.getFieldElement()); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java index 65491301..08608a2c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/BindEndpoint.java @@ -11,7 +11,7 @@ public class BindEndpoint extends SpELEndpoint { private String belongAccessPath; private CommonRepository belongRepository; - private String bindAlias; + private String bindFieldAlias; public BindEndpoint(FieldElement fieldElement, String expression) { super(fieldElement, expression); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java index 6b28a2b9..4cebc46a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/FieldEndpoint.java @@ -8,8 +8,6 @@ import lombok.Setter; @Setter public class FieldEndpoint extends SpELEndpoint { - private String alias; - public FieldEndpoint(FieldElement fieldElement, String expression) { super(fieldElement, expression); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java index c1f58f40..877fff2e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java @@ -54,7 +54,7 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { } private MultiInBuilder newMultiInBuilder(Context context, List entities) { - List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); + List aliases = binders.stream().map(AbstractBinder::getFieldAlias).collect(Collectors.toList()); MultiInBuilder multiInBuilder = new MultiInBuilder(aliases, entities.size()); for (Object entity : entities) { 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 d3172da1..41c241e2 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 @@ -98,12 +98,9 @@ public class BinderResolver { } String field = bindingDef.getField(); - String alias = entityElement.toAlias(field); - FieldElement fieldElement = entityElement.getFieldElement(field); Assert.notNull(fieldElement, fieldErrorMsg, genericType.getName(), field); FieldEndpoint fieldEndpoint = new FieldEndpoint(fieldElement, "#entity." + field); - fieldEndpoint.setAlias(alias); if (bindingType == BindingType.STRONG) { BindEndpoint bindEndpoint = newBindEndpoint(bindingDef); @@ -111,7 +108,7 @@ public class BinderResolver { allBinders.add(strongBinder); strongBinders.add(strongBinder); - String belongAccessPath = bindEndpoint.getBelongAccessPath(); + String belongAccessPath = strongBinder.getBelongAccessPath(); List strongBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); strongBinders.add(strongBinder); @@ -139,7 +136,7 @@ public class BinderResolver { if (mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/")) { List binders = mergedBindersMap.get("/"); - boolean hasCollection = CollUtil.findOne(binders, StrongBinder::isCollection) != null; + boolean hasCollection = CollUtil.findOne(binders, StrongBinder::isBindCollection) != null; if (!hasCollection) { joinType = binders.size() == 1 ? JoinType.SINGLE : JoinType.MULTI; } @@ -233,11 +230,11 @@ public class BinderResolver { CommonRepository belongRepository = repositoryMap.getOrDefault("/" + bind, rootRepository); belongRepository.setBound(true); EntityElement belongEntityElement = belongRepository.getEntityElement(); - String bindAlias = belongEntityElement.toAlias(bindField); + String bindFieldAlias = belongEntityElement.toAlias(bindField); bindEndpoint.setBelongAccessPath(belongRepository.getAccessPath()); bindEndpoint.setBelongRepository(belongRepository); - bindEndpoint.setBindAlias(bindAlias); + bindEndpoint.setBindFieldAlias(bindFieldAlias); return bindEndpoint; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index b5ef4ded..b763ed80 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -148,7 +148,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } } else { - List aliases = strongBinders.stream().map(AbstractBinder::getBindAlias).collect(Collectors.toList()); + List aliases = strongBinders.stream().map(AbstractBinder::getBindFieldAlias).collect(Collectors.toList()); MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); collectFieldValues(context, entities, strongBinders, builder); if (!builder.isEmpty()) { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index fac116b3..b15f1beb 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -132,7 +132,7 @@ public class SegmentBuilder { if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getAlias(), targetTableSegment.getTableAlias(), strongBinder.getBindAlias()); + OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getFieldAlias(), targetTableSegment.getTableAlias(), strongBinder.getBindFieldAlias()); onSegments.add(onSegment); } } @@ -141,12 +141,12 @@ public class SegmentBuilder { Node targetNode = nodeMap.get(relativeAccessPath); if (targetNode != null) { TableSegment targetTableSegment = targetNode.getTableSegment(); - OnValueSegment onValueSegment = new OnValueSegment(targetTableSegment.getTableAlias(), valueRouteBinder.getBindAlias(), CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); + OnValueSegment onValueSegment = new OnValueSegment(targetTableSegment.getTableAlias(), valueRouteBinder.getBindFieldAlias(), CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); onSegments.add(onValueSegment); } } for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { - OnValueSegment onValueSegment = new OnValueSegment(tableSegment.getTableAlias(), valueFilterBinder.getAlias(), CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); + OnValueSegment onValueSegment = new OnValueSegment(tableSegment.getTableAlias(), valueFilterBinder.getFieldAlias(), CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); onSegments.add(onValueSegment); } return onSegments; -- Gitee From 3c32d452cb092bbf3dbba49f7c88b376a5688128 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 17:08:33 +0800 Subject: [PATCH 44/77] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/core/api/common}/ImplFactory.java | 2 +- .../main/java/com/gitee/dorive/core/util/CriterionUtils.java | 2 +- .../mybatis/plus/config/DoriveMybatisPlusConfiguration.java | 2 +- .../com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java | 2 +- .../dorive/mybatis/plus/repository/MybatisPlusRepository.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename {dorive-api/src/main/java/com/gitee/dorive/api/api => dorive-core/src/main/java/com/gitee/dorive/core/api/common}/ImplFactory.java (95%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/common/ImplFactory.java similarity index 95% rename from dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/common/ImplFactory.java index 5e6f9f0c..93a4cf6c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/common/ImplFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.api.api; +package com.gitee.dorive.core.api.common; public interface ImplFactory { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java index 6b6b2350..fe9f9ac3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.util; import cn.hutool.core.date.DateUtil; import cn.hutool.extra.spring.SpringUtil; -import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.format.SqlFormat; import com.gitee.dorive.core.entity.executor.Criterion; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java index 24e2649a..1d6d83c4 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java @@ -18,7 +18,7 @@ package com.gitee.dorive.mybatis.plus.config; import com.gitee.dorive.mybatis.plus.impl.DefaultImplFactory; -import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.core.api.common.ImplFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java index a71e7be0..73f84de3 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java @@ -17,7 +17,7 @@ package com.gitee.dorive.mybatis.plus.impl; -import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.core.api.format.SqlFormat; import com.gitee.dorive.sql.api.SqlRunner; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index d3d399f6..da9f6dbe 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -23,7 +23,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; -- Gitee From fb5321fde1970a2aa1ee017cf712070f2c7e7ef5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 17:19:52 +0800 Subject: [PATCH 45/77] =?UTF-8?q?=E4=BC=98=E5=8C=96Binder=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/core/api/binder/Endpoint.java | 2 -- .../com/gitee/dorive/core/impl/binder/AbstractBinder.java | 2 +- .../gitee/dorive/core/impl/endpoint/AbstractEndpoint.java | 5 ----- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java index cf6553b4..2849a32f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Endpoint.java @@ -27,6 +27,4 @@ public interface Endpoint { void setValue(Object entity, Object value); - boolean isSameType(Endpoint endpoint); - } 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 391c5e55..b7a0ec5a 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 @@ -75,7 +75,7 @@ public abstract class AbstractBinder implements Binder { } public boolean isSameType() { - return fieldEndpoint.isSameType(bindEndpoint); + return fieldEndpoint.getFieldElement().isSameType(bindEndpoint.getFieldElement()); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java index 4097ad95..37fc09a3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/endpoint/AbstractEndpoint.java @@ -17,9 +17,4 @@ public abstract class AbstractEndpoint implements Endpoint { return fieldElement.getAlias(); } - @Override - public boolean isSameType(Endpoint endpoint) { - return fieldElement.isSameType(endpoint.getFieldElement()); - } - } -- Gitee From b755b728682fd3f4c60df7b4dbc14fcb0501d094 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 Jun 2024 17:31:12 +0800 Subject: [PATCH 46/77] =?UTF-8?q?=E4=BC=98=E5=8C=96Binder=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/resolver/BinderResolver.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 41c241e2..bac079ea 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 @@ -32,10 +32,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.enums.BindingType; import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.binder.ValueFilterBinder; -import com.gitee.dorive.core.impl.binder.ValueRouteBinder; -import com.gitee.dorive.core.impl.binder.WeakBinder; +import com.gitee.dorive.core.impl.binder.*; import com.gitee.dorive.core.impl.endpoint.BindEndpoint; import com.gitee.dorive.core.impl.endpoint.FieldEndpoint; import com.gitee.dorive.core.impl.processor.SpELProcessor; @@ -136,7 +133,7 @@ public class BinderResolver { if (mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/")) { List binders = mergedBindersMap.get("/"); - boolean hasCollection = CollUtil.findOne(binders, StrongBinder::isBindCollection) != null; + boolean hasCollection = CollUtil.findOne(binders, AbstractBinder::isBindCollection) != null; if (!hasCollection) { joinType = binders.size() == 1 ? JoinType.SINGLE : JoinType.MULTI; } -- Gitee From d06566b47943b1e5224ddebf4af278879597316a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 13:40:09 +0800 Subject: [PATCH 47/77] =?UTF-8?q?=E6=96=B0=E5=A2=9E3.5.0.2=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 07d9b27f..3e1bf5fb 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 5a1d6461..18c0aa7f 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index cff0615c..2f060221 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index e818a9f3..720a0c52 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index b1c4f6f4..ac47fd24 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index a961cd91..ae9cfd80 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-mybatis-plus diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index b6bc1253..5a70510c 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 9b410a6e..c6b85c3e 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 38827f71..c39c93fb 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.5.0.1 + 3.5.0.2 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 13e47556..cfa254aa 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 36a458b8..55b2da68 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 dorive-web diff --git a/pom.xml b/pom.xml index 4d4aba63..d070d4e7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.0.1 + 3.5.0.2 pom -- Gitee From 6d749c40db29685066051b2721f7f7f285fb9ed3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 13:59:19 +0800 Subject: [PATCH 48/77] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=EF=BC=8C=E4=B8=BA=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=81=9A=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/joiner/MultiEntityJoiner.java | 2 +- .../core/impl/joiner/SingleEntityJoiner.java | 2 +- .../core/impl/resolver/BinderResolver.java | 16 +++++++++++----- .../dorive/core/repository/CommonRepository.java | 4 ++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java index 877fff2e..7cf14a88 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java @@ -39,7 +39,7 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { public MultiEntityJoiner(CommonRepository repository, int entitiesSize) { super(repository, entitiesSize); - this.binders = repository.getRootBinders(); + this.binders = repository.getRootStrongBinders(); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java index aa119a2b..0ff9f606 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java @@ -37,7 +37,7 @@ public class SingleEntityJoiner extends AbstractEntityJoiner { public SingleEntityJoiner(CommonRepository repository, int entitiesSize) { super(repository, entitiesSize); - this.binder = repository.getRootBinders().get(0); + this.binder = repository.getRootStrongBinders().get(0); } @Override 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 bac079ea..8dce9b15 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 @@ -55,7 +55,8 @@ public class BinderResolver { private List valueRouteBinders; private List valueFilterBinders; // 决定了关联查询具体使用哪种实现 - private Map> mergedBindersMap; + private Map> mergedStrongBindersMap; + private Map> mergedValueRouteBindersMap; private StrongBinder boundIdBinder; private List selfFields; private JoinType joinType; @@ -75,7 +76,8 @@ public class BinderResolver { this.weakBinders = new ArrayList<>(bindingDefs.size()); this.valueRouteBinders = new ArrayList<>(bindingDefs.size()); this.valueFilterBinders = new ArrayList<>(bindingDefs.size()); - this.mergedBindersMap = new LinkedHashMap<>(bindingDefs.size() * 4 / 3 + 1); + this.mergedStrongBindersMap = new LinkedHashMap<>(bindingDefs.size() * 4 / 3 + 1); + this.mergedValueRouteBindersMap = new LinkedHashMap<>(bindingDefs.size() * 4 / 3 + 1); this.boundIdBinder = null; this.selfFields = new ArrayList<>(bindingDefs.size()); this.joinType = JoinType.UNION; @@ -91,6 +93,10 @@ public class BinderResolver { ValueRouteBinder valueRouteBinder = new ValueRouteBinder(bindingDef, null, bindEndpoint, processor); allBinders.add(valueRouteBinder); valueRouteBinders.add(valueRouteBinder); + + String belongAccessPath = valueRouteBinder.getBelongAccessPath(); + List valueRouteBinders = mergedValueRouteBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); + valueRouteBinders.add(valueRouteBinder); continue; } @@ -106,7 +112,7 @@ public class BinderResolver { strongBinders.add(strongBinder); String belongAccessPath = strongBinder.getBelongAccessPath(); - List strongBinders = mergedBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); + List strongBinders = mergedStrongBindersMap.computeIfAbsent(belongAccessPath, key -> new ArrayList<>(2)); strongBinders.add(strongBinder); if (strongBinder.isSameType() && primaryKey.equals(field)) { @@ -131,8 +137,8 @@ public class BinderResolver { selfFields = Collections.unmodifiableList(selfFields); - if (mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/")) { - List binders = mergedBindersMap.get("/"); + if (mergedStrongBindersMap.size() == 1 && mergedStrongBindersMap.containsKey("/")) { + List binders = mergedStrongBindersMap.get("/"); boolean hasCollection = CollUtil.findOne(binders, AbstractBinder::isBindCollection) != null; if (!hasCollection) { joinType = binders.size() == 1 ? JoinType.SINGLE : JoinType.MULTI; 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 9bf3da3f..8f683532 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 @@ -68,8 +68,8 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return binderResolver.getJoinType(); } - public List getRootBinders() { - return binderResolver.getMergedBindersMap().get("/"); + public List getRootStrongBinders() { + return binderResolver.getMergedStrongBindersMap().get("/"); } @Override -- Gitee From fb91db16440e0d04be7644afd56bcbd73c2b7a83 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 15:15:24 +0800 Subject: [PATCH 49/77] =?UTF-8?q?QueryScan=E4=B8=8D=E5=86=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=89=AB=E6=8F=8F=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/annotation/QueryScan.java | 6 +-- .../dorive/query/entity/def/QueryScanDef.java | 4 -- .../impl/resolver/QueryTypeResolver.java | 44 +++------------- .../repository/AbstractQueryRepository.java | 17 ------- .../dorive/query/util/ResourceUtils.java | 50 ------------------- 5 files changed, 8 insertions(+), 113 deletions(-) delete mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java index 4a3a376a..62a6299f 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java @@ -30,10 +30,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface QueryScan { - String[] value() default {}; - - String regex() default ""; - - Class[] queries() default {}; + Class[] queries(); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java index a0386596..f1ce89f3 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java @@ -30,16 +30,12 @@ import java.lang.reflect.AnnotatedElement; @AllArgsConstructor public class QueryScanDef { - private String[] value; - private String regex; private Class[] queries; public static QueryScanDef fromElement(AnnotatedElement element) { QueryScan queryScan = AnnotatedElementUtils.getMergedAnnotation(element, QueryScan.class); if (queryScan != null) { QueryScanDef queryScanDef = new QueryScanDef(); - queryScanDef.setValue(queryScan.value()); - queryScanDef.setRegex(queryScan.regex()); queryScanDef.setQueries(queryScan.queries()); return queryScanDef; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index c41876ec..41956931 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -18,63 +18,35 @@ package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.query.entity.QueryField; +import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryField; import com.gitee.dorive.query.entity.SpecificFields; -import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.entity.def.CriterionDef; import com.gitee.dorive.query.entity.def.ExampleDef; +import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.query.util.ResourceUtils; -import com.gitee.dorive.core.repository.CommonRepository; import lombok.Data; import org.springframework.util.ReflectionUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Pattern; @Data public class QueryTypeResolver { - private static Map>> scannedClasses = new ConcurrentHashMap<>(); - private AbstractQueryRepository repository; private Map, QueryResolver> classQueryResolverMap = new ConcurrentHashMap<>(); private Map nameQueryResolverMap = new ConcurrentHashMap<>(); - public QueryTypeResolver(AbstractQueryRepository repository) throws Exception { + public QueryTypeResolver(AbstractQueryRepository repository) { this.repository = repository; resolve(); } - public void resolve() throws Exception { + public void resolve() { QueryScanDef queryScanDef = repository.getQueryScanDef(); - String[] scanPackages = queryScanDef.getValue(); - String regex = queryScanDef.getRegex(); Class[] queries = queryScanDef.getQueries(); - - Pattern pattern = Pattern.compile(regex); - for (String scanPackage : scanPackages) { - List> classes = scannedClasses.get(scanPackage); - if (classes == null) { - classes = ResourceUtils.resolveClasses(scanPackage); - scannedClasses.put(scanPackage, classes); - } - for (Class queryClass : classes) { - String simpleName = queryClass.getSimpleName(); - if (pattern.matcher(simpleName).matches()) { - resolveQueryClass(queryClass); - } - } - } - for (Class queryClass : queries) { resolveQueryClass(queryClass); } @@ -130,9 +102,7 @@ public class QueryTypeResolver { Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); CommonRepository repository = mergedRepository.getExecutedRepository(); - Assert.isTrue(repository.hasField(field), - "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", - queryField.getField(), repository.getEntityElement().getGenericType(), field); + Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", queryField.getField(), repository.getEntityElement().getGenericType(), field); mergedRepositorySet.add(mergedRepository); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index f598e634..475059a9 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -38,8 +38,6 @@ import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Getter; import lombok.Setter; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; import java.util.List; @@ -61,7 +59,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); this.queryScanDef = QueryScanDef.fromElement(this.getClass()); if (repository != null && queryScanDef != null) { - renewQueryScanDef(); this.mergedRepositoryResolver = new MergedRepositoryResolver(this); this.queryTypeResolver = new QueryTypeResolver(this); this.simpleQueryExecutor = new SimpleQueryExecutor(this); @@ -69,20 +66,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } } - private void renewQueryScanDef() { - String[] value = queryScanDef.getValue(); - String regex = queryScanDef.getRegex(); - Class[] queries = queryScanDef.getQueries(); - if (ArrayUtils.isEmpty(value) && ArrayUtils.isEmpty(queries)) { - String packageName = this.getClass().getPackage().getName(); - String parentPackageName = packageName.substring(0, packageName.lastIndexOf(".")); - queryScanDef.setValue(new String[]{parentPackageName + ".query"}); - } - if (StringUtils.isBlank(regex)) { - queryScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); - } - } - @Override @SuppressWarnings("unchecked") public List selectByQuery(Options options, Object query) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java b/dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java deleted file mode 100644 index ca473ac4..00000000 --- a/dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java +++ /dev/null @@ -1,50 +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.query.util; - -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.type.classreading.CachingMetadataReaderFactory; -import org.springframework.core.type.classreading.MetadataReader; -import org.springframework.core.type.classreading.MetadataReaderFactory; -import org.springframework.util.ClassUtils; - -import java.util.ArrayList; -import java.util.List; - -public class ResourceUtils { - - public static final String RESOURCE_PATTERN = "/**/*.class"; - - public static List> resolveClasses(String basePackage) throws Exception { - List> classes = new ArrayList<>(); - ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); - MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); - String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage) + RESOURCE_PATTERN; - Resource[] resources = resourcePatternResolver.getResources(pattern); - for (Resource resource : resources) { - MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); - String classname = metadataReader.getClassMetadata().getClassName(); - Class clazz = Class.forName(classname); - classes.add(clazz); - } - return classes; - } - -} -- Gitee From 483691f5dec32cbbd47e074c9ff56099ad0ebc43 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 15:21:39 +0800 Subject: [PATCH 50/77] =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=80=83=E8=99=91?= =?UTF-8?q?=E7=B1=BB=E5=8A=A0=E8=BD=BD=E5=99=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/impl/resolver/QueryTypeResolver.java | 2 -- .../dorive/query/repository/AbstractQueryRepository.java | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index 41956931..c0e97f41 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -37,7 +37,6 @@ public class QueryTypeResolver { private AbstractQueryRepository repository; private Map, QueryResolver> classQueryResolverMap = new ConcurrentHashMap<>(); - private Map nameQueryResolverMap = new ConcurrentHashMap<>(); public QueryTypeResolver(AbstractQueryRepository repository) { this.repository = repository; @@ -77,7 +76,6 @@ public class QueryTypeResolver { QueryResolver queryResolver = new QueryResolver(exampleDef, queryFields, specificFields, mergedRepositories, reversedMergedRepositories); classQueryResolverMap.put(queryClass, queryResolver); - nameQueryResolverMap.put(queryClass.getName(), queryResolver); } private List matchMergedRepositories(List queryFields) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 475059a9..5efe5e53 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -108,8 +108,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } public void resolveQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); - QueryResolver queryResolver = nameQueryResolverMap.get(queryWrapper.getQuery().getClass().getName()); + Map, QueryResolver> classQueryResolverMap = queryTypeResolver.getClassQueryResolverMap(); + QueryResolver queryResolver = classQueryResolverMap.get(queryWrapper.getQuery().getClass()); Assert.notNull(queryResolver, "No query resolver found!"); queryContext.setQueryResolver(queryResolver); queryResolver.resolve(queryContext, queryWrapper); -- Gitee From cedc05498657a98fb3bfffef5ae03ec85b11b29a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 18:22:34 +0800 Subject: [PATCH 51/77] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=B8=80=E6=AE=B5=E4=BB=93=E5=82=A8=E8=A7=A3=E6=9E=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/resolver/BinderResolver.java | 4 +- .../dorive/query/entity/MergedRepository.java | 2 + .../resolver/MergedRepositoryResolver.java | 109 ++++++++---------- .../repository/AbstractQueryRepository.java | 5 +- 4 files changed, 60 insertions(+), 60 deletions(-) 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 8dce9b15..e707071a 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 @@ -134,7 +134,9 @@ public class BinderResolver { valueFilterBinders.add(valueFilterBinder); } } - + + mergedStrongBindersMap = Collections.unmodifiableMap(mergedStrongBindersMap); + mergedValueRouteBindersMap = Collections.unmodifiableMap(mergedValueRouteBindersMap); selfFields = Collections.unmodifiableList(selfFields); if (mergedStrongBindersMap.size() == 1 && mergedStrongBindersMap.containsKey("/")) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index a4aabb8a..fec8b38e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -22,11 +22,13 @@ import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.repository.CommonRepository; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; @Data +@NoArgsConstructor @AllArgsConstructor public class MergedRepository { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 8ab909d0..2a2ec028 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -17,7 +17,6 @@ package com.gitee.dorive.query.impl.resolver; -import cn.hutool.core.util.StrUtil; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -25,11 +24,10 @@ import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -45,76 +43,41 @@ public class MergedRepositoryResolver { public MergedRepositoryResolver(AbstractContextRepository repository) { this.repository = repository; - resolve(new ArrayList<>(), false, repository); } - private void resolve(List multiAccessPath, boolean ignoreRoot, AbstractContextRepository contextRepository) { - String lastAccessPath = StrUtil.join("", multiAccessPath); - - Collection repositories = contextRepository.getRepositoryMap().values(); - for (CommonRepository repository : repositories) { + public void resolve() { + for (CommonRepository repository : repository.getRepositoryMap().values()) { String accessPath = repository.getAccessPath(); - boolean isRoot = repository.isRoot(); - if (ignoreRoot && isRoot) { - continue; - } + BinderResolver binderResolver = repository.getBinderResolver(); - String absoluteAccessPath = lastAccessPath + accessPath; - String relativeAccessPath = absoluteAccessPath; + String relativeAccessPath = accessPath; CommonRepository executedRepository = repository; - AbstractRepository abstractRepository = repository.getProxyRepository(); - AbstractContextRepository abstractContextRepository = null; - if (abstractRepository instanceof AbstractContextRepository) { - abstractContextRepository = (AbstractContextRepository) abstractRepository; + AbstractQueryRepository abstractQueryRepository = null; + if (abstractRepository instanceof AbstractQueryRepository) { + abstractQueryRepository = (AbstractQueryRepository) abstractRepository; relativeAccessPath = relativeAccessPath + "/"; - executedRepository = abstractContextRepository.getRootRepository(); + executedRepository = abstractQueryRepository.getRootRepository(); } - MergedRepository mergedRepository = new MergedRepository( - lastAccessPath, - absoluteAccessPath, - relativeAccessPath, - abstractContextRepository != null, - repository, - getRelativeStrongBindersMap(lastAccessPath, repository), - getRelativeValueRouteBindersMap(lastAccessPath, repository), - executedRepository, - mergedRepositoryMap.size() + 1); + MergedRepository mergedRepository = new MergedRepository(); + mergedRepository.setLastAccessPath(""); + mergedRepository.setAbsoluteAccessPath(accessPath); + mergedRepository.setRelativeAccessPath(relativeAccessPath); + mergedRepository.setMerged(abstractQueryRepository != null); + mergedRepository.setDefinedRepository(repository); + mergedRepository.setRelativeStrongBindersMap(new LinkedHashMap<>(binderResolver.getMergedStrongBindersMap())); + mergedRepository.setRelativeValueRouteBindersMap(new LinkedHashMap<>(binderResolver.getMergedValueRouteBindersMap())); + mergedRepository.setExecutedRepository(executedRepository); + mergedRepository.setOrder(mergedRepositoryMap.size() + 1); addMergedRepository(mergedRepository); - if (abstractContextRepository != null) { - List newMultiAccessPath = new ArrayList<>(multiAccessPath); - newMultiAccessPath.add(accessPath); - resolve(newMultiAccessPath, true, abstractContextRepository); + if (abstractQueryRepository != null) { + mergeRepository(accessPath, abstractQueryRepository); } } } - private Map> getRelativeStrongBindersMap(String lastAccessPath, CommonRepository repository) { - BinderResolver binderResolver = repository.getBinderResolver(); - List strongBinders = binderResolver.getStrongBinders(); - Map> relativeStrongBindersMap = new LinkedHashMap<>(); - for (StrongBinder strongBinder : strongBinders) { - String relativeAccessPath = lastAccessPath + strongBinder.getBelongAccessPath(); - List existBinders = relativeStrongBindersMap.computeIfAbsent(relativeAccessPath, key -> new ArrayList<>(4)); - existBinders.add(strongBinder); - } - return relativeStrongBindersMap; - } - - private Map> getRelativeValueRouteBindersMap(String lastAccessPath, CommonRepository repository) { - BinderResolver binderResolver = repository.getBinderResolver(); - List valueRouteBinders = binderResolver.getValueRouteBinders(); - Map> relativeValueRouteBindersMap = new LinkedHashMap<>(); - for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { - String relativeAccessPath = lastAccessPath + valueRouteBinder.getBelongAccessPath(); - List existBinders = relativeValueRouteBindersMap.computeIfAbsent(relativeAccessPath, key -> new ArrayList<>(4)); - existBinders.add(valueRouteBinder); - } - return relativeValueRouteBindersMap; - } - private void addMergedRepository(MergedRepository mergedRepository) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); @@ -124,4 +87,34 @@ public class MergedRepositoryResolver { } } + private void mergeRepository(String accessPath, AbstractQueryRepository repository) { + MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); + for (MergedRepository mergedRepository : mergedRepositoryResolver.getMergedRepositoryMap().values()) { + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + if ("/".equals(absoluteAccessPath)) { + continue; + } + MergedRepository newMergedRepository = new MergedRepository(); + newMergedRepository.setLastAccessPath(accessPath + mergedRepository.getLastAccessPath()); + newMergedRepository.setAbsoluteAccessPath(accessPath + mergedRepository.getAbsoluteAccessPath()); + newMergedRepository.setRelativeAccessPath(accessPath + mergedRepository.getRelativeAccessPath()); + newMergedRepository.setMerged(mergedRepository.isMerged()); + newMergedRepository.setDefinedRepository(mergedRepository.getDefinedRepository()); + + Map> relativeStrongBindersMap = mergedRepository.getRelativeStrongBindersMap(); + Map> newRelativeStrongBindersMap = new LinkedHashMap<>(relativeStrongBindersMap.size() * 4 / 3 + 1); + relativeStrongBindersMap.forEach((k, v) -> newRelativeStrongBindersMap.put(accessPath + k, v)); + newMergedRepository.setRelativeStrongBindersMap(newRelativeStrongBindersMap); + + Map> relativeValueRouteBindersMap = mergedRepository.getRelativeValueRouteBindersMap(); + Map> newRelativeValueRouteBindersMap = new LinkedHashMap<>(relativeValueRouteBindersMap.size() * 4 / 3 + 1); + relativeValueRouteBindersMap.forEach((k, v) -> newRelativeValueRouteBindersMap.put(accessPath + k, v)); + newMergedRepository.setRelativeValueRouteBindersMap(newRelativeValueRouteBindersMap); + + newMergedRepository.setExecutedRepository(mergedRepository.getExecutedRepository()); + newMergedRepository.setOrder(mergedRepositoryMap.size() + 1); + addMergedRepository(newMergedRepository); + } + } + } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 5efe5e53..e1223b5e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -58,8 +58,11 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi super.afterPropertiesSet(); Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); this.queryScanDef = QueryScanDef.fromElement(this.getClass()); - if (repository != null && queryScanDef != null) { + if (repository != null) { this.mergedRepositoryResolver = new MergedRepositoryResolver(this); + mergedRepositoryResolver.resolve(); + } + if (repository != null && queryScanDef != null) { this.queryTypeResolver = new QueryTypeResolver(this); this.simpleQueryExecutor = new SimpleQueryExecutor(this); this.stepwiseQueryExecutor = new StepwiseQueryExecutor(this); -- Gitee From 2a5f0f8b0c104e7440bd40d85ae2262f44f6865e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 1 Jul 2024 18:31:43 +0800 Subject: [PATCH 52/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/repository/AbstractContextRepository.java | 7 ++----- .../com/gitee/dorive/core/repository/CommonRepository.java | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) 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 9ffdca42..0acf08d8 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 @@ -118,22 +118,19 @@ public abstract class AbstractContextRepository extends AbstractRepositor boolean isRoot = "/".equals(accessPath); boolean isAggregated = entityDef.getRepository() != Object.class; - OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); - BinderResolver binderResolver = new BinderResolver(this); binderResolver.resolve(entityElement); + OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); CommonRepository repository = new CommonRepository(); repository.setEntityElement(entityElement); repository.setOperationFactory(operationFactory); repository.setProxyRepository(proxyRepository); - repository.setAccessPath(accessPath); repository.setRoot(isRoot); repository.setAggregated(isAggregated); - repository.setDefaultOrderBy(defaultOrderBy); - repository.setBinderResolver(binderResolver); + repository.setDefaultOrderBy(defaultOrderBy); repository.setBound(false); repository.setMatcher(new SelectTypeMatcher(repository)); return repository; 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 8f683532..b92c10bf 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 @@ -47,8 +47,8 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher private String accessPath; private boolean root; private boolean aggregated; - private OrderBy defaultOrderBy; private BinderResolver binderResolver; + private OrderBy defaultOrderBy; private boolean bound; private Matcher matcher; -- Gitee From dbbda36faf9ace82963f34ed1ca6ab724c86e426 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 1 Jul 2024 23:46:15 +0800 Subject: [PATCH 53/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=EF=BC=8Cspring=20boot=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9C=AA=E5=90=8C=E6=AD=A5=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MybatisPlusRepository.java | 1 - .../gitee/dorive/query/api/QueryExecutor.java | 3 +- .../dorive/query/entity/QueryContext.java | 6 +- .../{QueryWrapper.java => QueryUnit.java} | 7 +- .../impl/executor/AbstractQueryExecutor.java | 45 ++++++++++- .../impl/executor/StepwiseQueryExecutor.java | 64 +++++++--------- ...lver.java => QueryRepositoryResolver.java} | 75 ++++++++++--------- .../query/impl/resolver/QueryResolver.java | 11 +-- .../repository/AbstractQueryRepository.java | 46 +++++------- .../sql/impl/count/DefaultCountQuerier.java | 1 - .../sql/impl/executor/SqlQueryExecutor.java | 1 - 11 files changed, 137 insertions(+), 123 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{QueryWrapper.java => QueryUnit.java} (83%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/{QueryTypeResolver.java => QueryRepositoryResolver.java} (60%) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index da9f6dbe..0c76c893 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -33,7 +33,6 @@ import com.gitee.dorive.core.entity.enums.QueryMethod; import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java index d49a4f3b..6c5f9f51 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java @@ -19,10 +19,9 @@ package com.gitee.dorive.query.api; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; public interface QueryExecutor { - Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper); + Result executeQuery(QueryContext queryContext); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 7d456067..e8d46d80 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -21,7 +21,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.Data; import java.util.Collections; @@ -31,13 +30,14 @@ import java.util.Map; public class QueryContext { private Context context; + private Object query; private ResultType resultType; - private QueryResolver queryResolver; private Map exampleMap; private Example example; - public QueryContext(Context context, ResultType resultType) { + public QueryContext(Context context, Object query, ResultType resultType) { this.context = context; + this.query = query; this.resultType = resultType; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java similarity index 83% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 3d01c608..8d0e323e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -17,11 +17,14 @@ package com.gitee.dorive.query.entity; +import com.gitee.dorive.core.entity.executor.Example; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor -public class QueryWrapper { - private Object query; +public class QueryUnit { + private MergedRepository mergedRepository; + private Example example; + private boolean abandoned; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index 13e2e620..d78db9ce 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -17,17 +17,24 @@ package com.gitee.dorive.query.impl.executor; +import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.api.QueryExecutor; +import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; +import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public abstract class AbstractQueryExecutor implements QueryExecutor { @@ -38,8 +45,42 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { } @Override + public Result executeQuery(QueryContext queryContext) { + Object query = queryContext.getQuery(); + + Map exampleMap = resolveQuery(query); + queryContext.setExampleMap(exampleMap); + queryContext.setExample(exampleMap.get("/")); + + return doExecuteQuery(queryContext); + } + + protected Map resolveQuery(Object query) { + QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); + Map, QueryResolver> classQueryResolverMap = queryRepositoryResolver.getClassQueryResolverMap(); + QueryResolver queryResolver = classQueryResolverMap.get(query.getClass()); + Assert.notNull(queryResolver, "No query resolver found!"); + return queryResolver.resolve(query); + } + + private Map newQueryUnitMap(QueryContext queryContext) { + QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); + Map, List> classMergedRepositoriesMap = queryRepositoryResolver.getClassMergedRepositoriesMap(); + + Map exampleMap = queryContext.getExampleMap(); + Map exampleWrapperMap = new LinkedHashMap<>(); + for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + String relativeAccessPath = mergedRepository.getRelativeAccessPath(); + Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); + QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false); + exampleWrapperMap.put(relativeAccessPath, queryUnit); + } + return exampleWrapperMap; + } + @SuppressWarnings("unchecked") - public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + protected Result doExecuteQuery(QueryContext queryContext) { Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index b763ed80..78f27f74 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -27,13 +27,11 @@ import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.MultiInBuilder; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import lombok.AllArgsConstructor; -import lombok.Data; import java.util.ArrayList; import java.util.Collections; @@ -50,39 +48,39 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } @Override - public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - Map exampleWrapperMap = buildExampleWrapperMap(queryContext); + public Result executeQuery(QueryContext queryContext, Object query) { + Map exampleWrapperMap = buildExampleWrapperMap(queryContext); executeQuery(queryContext, exampleWrapperMap); - ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); - boolean abandoned = exampleWrapper.isAbandoned(); + QueryUnit queryUnit = exampleWrapperMap.get("/"); + boolean abandoned = queryUnit.isAbandoned(); if (abandoned) { return queryContext.newEmptyResult(); } return super.executeQuery(queryContext, queryWrapper); } - private Map buildExampleWrapperMap(QueryContext queryContext) { + private Map buildExampleWrapperMap(QueryContext queryContext) { QueryResolver queryResolver = queryContext.getQueryResolver(); Map exampleMap = queryContext.getExampleMap(); - Map exampleWrapperMap = new LinkedHashMap<>(); + Map exampleWrapperMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); - ExampleWrapper exampleWrapper = new ExampleWrapper(mergedRepository, example, false); - exampleWrapperMap.put(relativeAccessPath, exampleWrapper); + QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false); + exampleWrapperMap.put(relativeAccessPath, queryUnit); } return exampleWrapperMap; } - private void executeQuery(QueryContext queryContext, Map exampleWrapperMap) { + private void executeQuery(QueryContext queryContext, Map exampleWrapperMap) { Context context = queryContext.getContext(); - exampleWrapperMap.forEach((accessPath, exampleWrapper) -> { + exampleWrapperMap.forEach((accessPath, queryUnit) -> { if ("/".equals(accessPath)) return; - MergedRepository mergedRepository = exampleWrapper.getMergedRepository(); - Example example = exampleWrapper.getExample(); - boolean abandoned = exampleWrapper.isAbandoned(); + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + Example example = queryUnit.getExample(); + boolean abandoned = queryUnit.isAbandoned(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); Map> relativeStrongBindersMap = mergedRepository.getRelativeStrongBindersMap(); @@ -112,9 +110,9 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } relativeValueRouteBindersMap.forEach((relativeAccessPath, valueRouteBinders) -> { - ExampleWrapper targetExampleWrapper = exampleWrapperMap.get(relativeAccessPath); - if (targetExampleWrapper != null) { - Example targetExample = targetExampleWrapper.getExample(); + QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + if (targetQueryUnit != null) { + Example targetExample = targetQueryUnit.getExample(); for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { Object fieldValue = valueRouteBinder.getFieldValue(context, null); if (fieldValue != null) { @@ -126,13 +124,13 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { }); relativeStrongBindersMap.forEach((relativeAccessPath, strongBinders) -> { - ExampleWrapper targetExampleWrapper = exampleWrapperMap.get(relativeAccessPath); - if (targetExampleWrapper != null) { + QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + if (targetQueryUnit != null) { if (entities.isEmpty()) { - targetExampleWrapper.setAbandoned(true); + targetQueryUnit.setAbandoned(true); return; } - Example targetExample = targetExampleWrapper.getExample(); + Example targetExample = targetQueryUnit.getExample(); if (strongBinders.size() == 1) { StrongBinder strongBinder = strongBinders.get(0); List fieldValues = collectFieldValues(context, entities, strongBinder); @@ -144,7 +142,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { targetExample.in(boundName, fieldValues); } } else { - targetExampleWrapper.setAbandoned(true); + targetQueryUnit.setAbandoned(true); } } else { @@ -154,7 +152,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.toCriterion()); } else { - targetExampleWrapper.setAbandoned(true); + targetQueryUnit.setAbandoned(true); } } } @@ -162,11 +160,11 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { }); } - private boolean determineAbandon(Map exampleWrapperMap, Set relativeAccessPaths) { + private boolean determineAbandon(Map exampleWrapperMap, Set relativeAccessPaths) { for (String relativeAccessPath : relativeAccessPaths) { - ExampleWrapper targetExampleWrapper = exampleWrapperMap.get(relativeAccessPath); - if (targetExampleWrapper != null) { - if (targetExampleWrapper.isAbandoned()) { + QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + if (targetQueryUnit != null) { + if (targetQueryUnit.isAbandoned()) { return true; } } @@ -201,12 +199,4 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } } - @Data - @AllArgsConstructor - public static class ExampleWrapper { - private MergedRepository mergedRepository; - private Example example; - private boolean abandoned; - } - } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java similarity index 60% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java index c0e97f41..c104d5ad 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java @@ -33,14 +33,15 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Data -public class QueryTypeResolver { +public class QueryRepositoryResolver { private AbstractQueryRepository repository; private Map, QueryResolver> classQueryResolverMap = new ConcurrentHashMap<>(); + private Map, List> classMergedRepositoriesMap = new ConcurrentHashMap<>(); + private Map, List> classReversedMergedRepositoriesMap = new ConcurrentHashMap<>(); - public QueryTypeResolver(AbstractQueryRepository repository) { + public QueryRepositoryResolver(AbstractQueryRepository repository) { this.repository = repository; - resolve(); } public void resolve() { @@ -59,62 +60,64 @@ public class QueryTypeResolver { List queryFields = new ArrayList<>(); SpecificFields specificFields = new SpecificFields(); + Set accessPaths = new HashSet<>(); + List mergedRepositories = new ArrayList<>(); ReflectionUtils.doWithLocalFields(queryClass, declaredField -> { QueryField queryField = new QueryField(declaredField); - if (queryField.isIgnore()) { + if (queryField.isIgnore() || specificFields.tryAddField(queryField)) { return; } - if (!specificFields.tryAddField(queryField)) { - queryFields.add(queryField); + MergedRepository mergedRepository = resetQueryField(queryField); + queryFields.add(queryField); + if (accessPaths.add(mergedRepository.getAbsoluteAccessPath())) { + mergedRepositories.add(mergedRepository); } }); - List mergedRepositories = matchMergedRepositories(queryFields); + MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); + Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); + for (MergedRepository mergedRepository : mergedRepositoryMap.values()) { + CommonRepository repository = mergedRepository.getExecutedRepository(); + if (repository.isBound() && accessPaths.add(mergedRepository.getAbsoluteAccessPath())) { + mergedRepositories.add(mergedRepository); + } + } + + mergedRepositories.sort(Comparator.comparing(MergedRepository::getOrder)); List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - QueryResolver queryResolver = new QueryResolver(exampleDef, queryFields, specificFields, mergedRepositories, reversedMergedRepositories); + QueryResolver queryResolver = new QueryResolver(exampleDef, queryFields, specificFields); classQueryResolverMap.put(queryClass, queryResolver); + classMergedRepositoriesMap.put(queryClass, mergedRepositories); + classMergedRepositoriesMap.put(queryClass, reversedMergedRepositories); } - private List matchMergedRepositories(List queryFields) { + private MergedRepository resetQueryField(QueryField queryField) { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); Map nameMergedRepositoryMap = mergedRepositoryResolver.getNameMergedRepositoryMap(); - Set mergedRepositorySet = new LinkedHashSet<>(); + CriterionDef criterionDef = queryField.getCriterionDef(); + String belongTo = criterionDef.getBelongTo(); + String field = criterionDef.getField(); - for (QueryField queryField : queryFields) { - CriterionDef criterionDef = queryField.getCriterionDef(); - String belongTo = criterionDef.getBelongTo(); - String field = criterionDef.getField(); - - 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); + if (!belongTo.startsWith("/")) { + MergedRepository mergedRepository = nameMergedRepositoryMap.get(belongTo); Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); - - CommonRepository repository = mergedRepository.getExecutedRepository(); - Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", queryField.getField(), repository.getEntityElement().getGenericType(), field); - - mergedRepositorySet.add(mergedRepository); + belongTo = mergedRepository.getAbsoluteAccessPath(); + criterionDef.setBelongTo(belongTo); } - for (MergedRepository mergedRepository : mergedRepositoryMap.values()) { - CommonRepository repository = mergedRepository.getExecutedRepository(); - if (repository.isBound()) { - mergedRepositorySet.add(mergedRepository); - } - } + MergedRepository mergedRepository = mergedRepositoryMap.get(belongTo); + Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); - List mergedRepositories = new ArrayList<>(mergedRepositorySet); - mergedRepositories.sort(Comparator.comparing(MergedRepository::getOrder)); - return mergedRepositories; + CommonRepository repository = mergedRepository.getExecutedRepository(); + Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", + queryField.getField(), repository.getEntityClass(), field); + + return mergedRepository; } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java index 0db4b7db..339915c6 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java @@ -22,10 +22,7 @@ import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.query.constant.OperatorV2; -import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryField; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.SpecificFields; import com.gitee.dorive.query.entity.def.CriterionDef; import com.gitee.dorive.query.entity.def.ExampleDef; @@ -43,17 +40,13 @@ public class QueryResolver { private ExampleDef exampleDef; private List queryFields; private SpecificFields specificFields; - private List mergedRepositories; - private List reversedMergedRepositories; - public void resolve(QueryContext queryContext, QueryWrapper queryWrapper) { - Object query = queryWrapper.getQuery(); + public Map resolve(Object query) { Map exampleMap = newExampleMap(query); Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - queryContext.setExampleMap(exampleMap); - queryContext.setExample(example); + return exampleMap; } private Map newExampleMap(Object query) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index e1223b5e..4500217b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -17,7 +17,6 @@ package com.gitee.dorive.query.repository; -import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.annotation.Repository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; @@ -28,20 +27,17 @@ import com.gitee.dorive.event.repository.AbstractEventRepository; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.executor.SimpleQueryExecutor; import com.gitee.dorive.query.impl.executor.StepwiseQueryExecutor; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; -import com.gitee.dorive.query.impl.resolver.QueryResolver; -import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; +import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; import lombok.Getter; import lombok.Setter; import org.springframework.core.annotation.AnnotatedElementUtils; import java.util.List; -import java.util.Map; @Getter @Setter @@ -49,7 +45,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; - private QueryTypeResolver queryTypeResolver; + private QueryRepositoryResolver queryRepositoryResolver; private QueryExecutor simpleQueryExecutor; private QueryExecutor stepwiseQueryExecutor; @@ -63,7 +59,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi mergedRepositoryResolver.resolve(); } if (repository != null && queryScanDef != null) { - this.queryTypeResolver = new QueryTypeResolver(this); + this.queryRepositoryResolver = new QueryRepositoryResolver(this); + queryRepositoryResolver.resolve(); this.simpleQueryExecutor = new SimpleQueryExecutor(this); this.stepwiseQueryExecutor = new StepwiseQueryExecutor(this); } @@ -72,53 +69,44 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public List selectByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext((Context) options, ResultType.DATA); - QueryWrapper queryWrapper = new QueryWrapper(query); - Result result = executeQuery(queryContext, queryWrapper); + QueryContext queryContext = new QueryContext((Context) options, query, ResultType.DATA); + Result result = executeQuery(queryContext); return (List) result.getRecords(); } @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext((Context) options, ResultType.COUNT_AND_DATA); - QueryWrapper queryWrapper = new QueryWrapper(query); - Result result = executeQuery(queryContext, queryWrapper); + QueryContext queryContext = new QueryContext((Context) options, query, ResultType.COUNT_AND_DATA); + Result result = executeQuery(queryContext); return (Page) result.getPage(); } @Override public long selectCountByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext((Context) options, ResultType.COUNT); - QueryWrapper queryWrapper = new QueryWrapper(query); - Result result = executeQuery(queryContext, queryWrapper); + QueryContext queryContext = new QueryContext((Context) options, query, ResultType.COUNT); + Result result = executeQuery(queryContext); return result.getCount(); } @Override - public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - resolveQuery(queryContext, queryWrapper); + public Result executeQuery(QueryContext queryContext) { + + Matcher matcher = getRootRepository(); if (!matcher.matches(queryContext.getContext())) { return queryContext.newEmptyResult(); } if (queryContext.isSimpleQuery()) { - return simpleQueryExecutor.executeQuery(queryContext, queryWrapper); + return simpleQueryExecutor.executeQuery(queryContext, query); } else { - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); - return queryExecutor.executeQuery(queryContext, queryWrapper); + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, query); + return queryExecutor.executeQuery(queryContext, query); } } - public void resolveQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - Map, QueryResolver> classQueryResolverMap = queryTypeResolver.getClassQueryResolverMap(); - QueryResolver queryResolver = classQueryResolverMap.get(queryWrapper.getQuery().getClass()); - Assert.notNull(queryResolver, "No query resolver found!"); - queryContext.setQueryResolver(queryResolver); - queryResolver.resolve(queryContext, queryWrapper); - } - protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { + protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, Object query) { return stepwiseQueryExecutor; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java index ba2beeb4..569a8671 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java @@ -21,7 +21,6 @@ import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 532d1810..5351d7a2 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -23,7 +23,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.executor.AbstractQueryExecutor; import com.gitee.dorive.query.repository.AbstractQueryRepository; -- Gitee From b5cbec5c57bc70f56035c56aa42e0dd8d118a4e7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 10:54:46 +0800 Subject: [PATCH 54/77] =?UTF-8?q?=E5=B0=81=E8=A3=85QueryExecutor=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MybatisPlusRepository.java | 4 +- .../dorive/query/entity/QueryContext.java | 8 +++ .../impl/executor/AbstractQueryExecutor.java | 45 +++++++++++---- .../impl/executor/StepwiseQueryExecutor.java | 57 +++++++------------ .../repository/AbstractQueryRepository.java | 11 ++-- .../sql/impl/count/DefaultCountQuerier.java | 24 ++++---- .../sql/impl/executor/SqlQueryExecutor.java | 4 +- .../sql/impl/segment/SegmentBuilder.java | 12 ++-- 8 files changed, 91 insertions(+), 74 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 0c76c893..53ca0227 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -128,13 +128,13 @@ public class MybatisPlusRepository extends AbstractRefRepository i } @Override - protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { + protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext) { Context context = queryContext.getContext(); QueryMethod queryMethod = context.getOption(QueryMethod.class); if (queryMethod == null || queryMethod == QueryMethod.SQL) { return sqlQueryExecutor; } - return super.adaptiveQueryExecutor(queryContext, queryWrapper); + return super.adaptiveQueryExecutor(queryContext); } @Override diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index e8d46d80..2e9bfa5b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -21,9 +21,11 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.enums.ResultType; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.Data; import java.util.Collections; +import java.util.List; import java.util.Map; @Data @@ -32,13 +34,19 @@ public class QueryContext { private Context context; private Object query; private ResultType resultType; + private Class queryType; + private QueryResolver queryResolver; + private List mergedRepositories; private Map exampleMap; private Example example; + private Map queryUnitMap; + private QueryUnit queryUnit; public QueryContext(Context context, Object query, ResultType resultType) { this.context = context; this.query = query; this.resultType = resultType; + this.queryType = query.getClass(); } public boolean isSimpleQuery() { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index d78db9ce..351422e5 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -46,37 +46,58 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { @Override public Result executeQuery(QueryContext queryContext) { - Object query = queryContext.getQuery(); + resolve(queryContext); + return doExecuteQuery(queryContext); + } - Map exampleMap = resolveQuery(query); + protected void resolve(QueryContext queryContext) { + Class queryType = queryContext.getQueryType(); + QueryResolver queryResolver = getQueryResolver(queryType); + List mergedRepositories = getMergedRepositories(queryType); + Assert.notNull(queryResolver, "No query resolver found!"); + Assert.notEmpty(mergedRepositories, "The merged repositories cannot be empty!"); + queryContext.setQueryResolver(queryResolver); + queryContext.setMergedRepositories(mergedRepositories); + + Map exampleMap = newExampleMap(queryContext); queryContext.setExampleMap(exampleMap); queryContext.setExample(exampleMap.get("/")); - return doExecuteQuery(queryContext); + Map queryUnitMap = newQueryUnitMap(queryContext); + queryContext.setQueryUnitMap(queryUnitMap); + queryContext.setQueryUnit(queryUnitMap.get("/")); } - protected Map resolveQuery(Object query) { + protected QueryResolver getQueryResolver(Class queryType) { QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); Map, QueryResolver> classQueryResolverMap = queryRepositoryResolver.getClassQueryResolverMap(); - QueryResolver queryResolver = classQueryResolverMap.get(query.getClass()); - Assert.notNull(queryResolver, "No query resolver found!"); - return queryResolver.resolve(query); + return classQueryResolverMap.get(queryType); } - private Map newQueryUnitMap(QueryContext queryContext) { + protected List getMergedRepositories(Class queryType) { QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); Map, List> classMergedRepositoriesMap = queryRepositoryResolver.getClassMergedRepositoriesMap(); + return classMergedRepositoriesMap.get(queryType); + } + + protected Map newExampleMap(QueryContext queryContext) { + Object query = queryContext.getQuery(); + QueryResolver queryResolver = queryContext.getQueryResolver(); + return queryResolver.resolve(query); + } + protected Map newQueryUnitMap(QueryContext queryContext) { + List mergedRepositories = queryContext.getMergedRepositories(); Map exampleMap = queryContext.getExampleMap(); - Map exampleWrapperMap = new LinkedHashMap<>(); - for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { + Map queryUnitMap = new LinkedHashMap<>(); + for (MergedRepository mergedRepository : mergedRepositories) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false); - exampleWrapperMap.put(relativeAccessPath, queryUnit); + queryUnitMap.put(relativeAccessPath, queryUnit); } - return exampleWrapperMap; + return queryUnitMap; } @SuppressWarnings("unchecked") diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index 78f27f74..55654319 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -19,7 +19,6 @@ package com.gitee.dorive.query.impl.executor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; @@ -27,18 +26,13 @@ import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.MultiInBuilder; -import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.entity.QueryUnit; +import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class StepwiseQueryExecutor extends AbstractQueryExecutor { @@ -48,34 +42,27 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } @Override - public Result executeQuery(QueryContext queryContext, Object query) { - Map exampleWrapperMap = buildExampleWrapperMap(queryContext); - executeQuery(queryContext, exampleWrapperMap); - QueryUnit queryUnit = exampleWrapperMap.get("/"); - boolean abandoned = queryUnit.isAbandoned(); - if (abandoned) { - return queryContext.newEmptyResult(); - } - return super.executeQuery(queryContext, queryWrapper); + protected List getMergedRepositories(Class queryType) { + QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); + Map, List> classReversedMergedRepositoriesMap = queryRepositoryResolver.getClassReversedMergedRepositoriesMap(); + return classReversedMergedRepositoriesMap.get(queryType); } - private Map buildExampleWrapperMap(QueryContext queryContext) { - QueryResolver queryResolver = queryContext.getQueryResolver(); - Map exampleMap = queryContext.getExampleMap(); - Map exampleWrapperMap = new LinkedHashMap<>(); - for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); - String relativeAccessPath = mergedRepository.getRelativeAccessPath(); - Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); - QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false); - exampleWrapperMap.put(relativeAccessPath, queryUnit); + @Override + protected Result doExecuteQuery(QueryContext queryContext) { + executeReversedQuery(queryContext); + QueryUnit queryUnit = queryContext.getQueryUnit(); + if (queryUnit.isAbandoned()) { + return queryContext.newEmptyResult(); } - return exampleWrapperMap; + return super.doExecuteQuery(queryContext); } - private void executeQuery(QueryContext queryContext, Map exampleWrapperMap) { + private void executeReversedQuery(QueryContext queryContext) { Context context = queryContext.getContext(); - exampleWrapperMap.forEach((accessPath, queryUnit) -> { + Map queryUnitMap = queryContext.getQueryUnitMap(); + + queryUnitMap.forEach((accessPath, queryUnit) -> { if ("/".equals(accessPath)) return; MergedRepository mergedRepository = queryUnit.getMergedRepository(); @@ -90,10 +77,10 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { BinderResolver binderResolver = definedRepository.getBinderResolver(); if (!abandoned) { - abandoned = determineAbandon(exampleWrapperMap, relativeValueRouteBindersMap.keySet()); + abandoned = determineAbandon(queryUnitMap, relativeValueRouteBindersMap.keySet()); } if (!abandoned) { - abandoned = determineAbandon(exampleWrapperMap, relativeStrongBindersMap.keySet()); + abandoned = determineAbandon(queryUnitMap, relativeStrongBindersMap.keySet()); } List entities; @@ -110,7 +97,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } relativeValueRouteBindersMap.forEach((relativeAccessPath, valueRouteBinders) -> { - QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + QueryUnit targetQueryUnit = queryUnitMap.get(relativeAccessPath); if (targetQueryUnit != null) { Example targetExample = targetQueryUnit.getExample(); for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { @@ -124,7 +111,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { }); relativeStrongBindersMap.forEach((relativeAccessPath, strongBinders) -> { - QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + QueryUnit targetQueryUnit = queryUnitMap.get(relativeAccessPath); if (targetQueryUnit != null) { if (entities.isEmpty()) { targetQueryUnit.setAbandoned(true); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 4500217b..9d4d1ebb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -91,22 +91,19 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public Result executeQuery(QueryContext queryContext) { - - Matcher matcher = getRootRepository(); if (!matcher.matches(queryContext.getContext())) { return queryContext.newEmptyResult(); } if (queryContext.isSimpleQuery()) { - return simpleQueryExecutor.executeQuery(queryContext, query); + return simpleQueryExecutor.executeQuery(queryContext); } else { - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, query); - return queryExecutor.executeQuery(queryContext, query); + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext); + return queryExecutor.executeQuery(queryContext); } } - - protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, Object query) { + protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext) { return stepwiseQueryExecutor; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java index 569a8671..ec78debb 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java @@ -22,34 +22,38 @@ import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.ResultType; +import com.gitee.dorive.query.impl.executor.AbstractQueryExecutor; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; -import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.common.CountQuery; +import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableSegment; import com.gitee.dorive.sql.impl.segment.SegmentBuilder; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@Data -@AllArgsConstructor -public class DefaultCountQuerier implements CountQuerier { +@Getter +@Setter +public class DefaultCountQuerier extends AbstractQueryExecutor implements CountQuerier { - private AbstractQueryRepository repository; private SqlRunner sqlRunner; + public DefaultCountQuerier(AbstractQueryRepository repository, SqlRunner sqlRunner) { + super(repository); + this.sqlRunner = sqlRunner; + } + @Override public Map selectCountMap(Context context, CountQuery countQuery) { - QueryContext queryContext = new QueryContext(context, ResultType.COUNT); - QueryWrapper queryWrapper = new QueryWrapper(countQuery.getQuery()); - repository.resolveQuery(queryContext, queryWrapper); + QueryContext queryContext = new QueryContext(context, countQuery.getQuery(), ResultType.COUNT); + resolve(queryContext); SegmentBuilder segmentBuilder = new SegmentBuilder(queryContext); SelectSegment selectSegment = segmentBuilder.buildSegment(context, countQuery.getSelector()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 5351d7a2..cfd7e3db 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -51,7 +51,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { @Override @SuppressWarnings("unchecked") - public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + public Result doExecuteQuery(QueryContext queryContext) { Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); @@ -74,7 +74,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return super.executeQuery(queryContext, queryWrapper); + return super.doExecuteQuery(queryContext); } String tableAlias = tableSegment.getTableAlias(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index b15f1beb..0cb9ec0b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -34,7 +34,6 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CriterionUtils; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.sql.api.Segment; import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.segment.*; @@ -46,20 +45,21 @@ import java.util.*; @Data public class SegmentBuilder { - private QueryResolver queryResolver; - private Map exampleMap; + private QueryContext queryContext; private List matchedSegmentInfos; public SegmentBuilder(QueryContext queryContext) { - this.queryResolver = queryContext.getQueryResolver(); - this.exampleMap = queryContext.getExampleMap(); + this.queryContext = queryContext; } public SelectSegment buildSegment(Context context, Selector selector) { if (selector != null) { this.matchedSegmentInfos = new ArrayList<>(8); } - List mergedRepositories = queryResolver.getMergedRepositories(); + + List mergedRepositories = queryContext.getMergedRepositories(); + Map exampleMap = queryContext.getExampleMap(); + Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); SelectSegment selectSegment = new SelectSegment(); List joinSegments = selectSegment.getJoinSegments(); -- Gitee From 94d06ed6912bf5b2a60c878c1457dadb4409c0fa Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 10:59:51 +0800 Subject: [PATCH 55/77] =?UTF-8?q?=E5=B0=81=E8=A3=85QueryExecutor=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/impl/resolver/QueryRepositoryResolver.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java index c104d5ad..cd424ce6 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java @@ -91,7 +91,7 @@ public class QueryRepositoryResolver { QueryResolver queryResolver = new QueryResolver(exampleDef, queryFields, specificFields); classQueryResolverMap.put(queryClass, queryResolver); classMergedRepositoriesMap.put(queryClass, mergedRepositories); - classMergedRepositoriesMap.put(queryClass, reversedMergedRepositories); + classReversedMergedRepositoriesMap.put(queryClass, reversedMergedRepositories); } private MergedRepository resetQueryField(QueryField queryField) { @@ -114,8 +114,7 @@ public class QueryRepositoryResolver { Assert.notNull(mergedRepository, "No merged repository found! belongTo: {}", belongTo); CommonRepository repository = mergedRepository.getExecutedRepository(); - Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", - queryField.getField(), repository.getEntityClass(), field); + Assert.isTrue(repository.hasField(field), "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", queryField.getField(), repository.getEntityClass(), field); return mergedRepository; } -- Gitee From c2b1b3f098f64e3823f21f16764f377ff16718d5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 12:13:55 +0800 Subject: [PATCH 56/77] =?UTF-8?q?=E5=B0=81=E8=A3=85QueryExecutor=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/executor/AbstractQueryExecutor.java | 7 ++++- .../impl/executor/SimpleQueryExecutor.java | 28 ------------------- .../impl/executor/StepwiseQueryExecutor.java | 2 +- .../repository/AbstractQueryRepository.java | 11 ++------ .../sql/impl/count/DefaultCountQuerier.java | 6 ++++ .../sql/impl/executor/SqlQueryExecutor.java | 2 +- 6 files changed, 16 insertions(+), 40 deletions(-) delete mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index 351422e5..a554614c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -47,6 +47,9 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { @Override public Result executeQuery(QueryContext queryContext) { resolve(queryContext); + if (queryContext.isSimpleQuery()) { + return executeRootQuery(queryContext); + } return doExecuteQuery(queryContext); } @@ -101,7 +104,7 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { } @SuppressWarnings("unchecked") - protected Result doExecuteQuery(QueryContext queryContext) { + protected Result executeRootQuery(QueryContext queryContext) { Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); @@ -120,4 +123,6 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { return queryContext.newEmptyResult(); } + protected abstract Result doExecuteQuery(QueryContext queryContext); + } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java deleted file mode 100644 index 34088a98..00000000 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java +++ /dev/null @@ -1,28 +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.query.impl.executor; - -import com.gitee.dorive.query.repository.AbstractQueryRepository; - -public class SimpleQueryExecutor extends AbstractQueryExecutor { - - public SimpleQueryExecutor(AbstractQueryRepository repository) { - super(repository); - } - -} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index 55654319..a0adfa7a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -55,7 +55,7 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { if (queryUnit.isAbandoned()) { return queryContext.newEmptyResult(); } - return super.doExecuteQuery(queryContext); + return super.executeRootQuery(queryContext); } private void executeReversedQuery(QueryContext queryContext) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 9d4d1ebb..b5bff2fb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -29,7 +29,6 @@ import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.executor.SimpleQueryExecutor; import com.gitee.dorive.query.impl.executor.StepwiseQueryExecutor; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; @@ -46,7 +45,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private QueryRepositoryResolver queryRepositoryResolver; - private QueryExecutor simpleQueryExecutor; private QueryExecutor stepwiseQueryExecutor; @Override @@ -61,7 +59,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (repository != null && queryScanDef != null) { this.queryRepositoryResolver = new QueryRepositoryResolver(this); queryRepositoryResolver.resolve(); - this.simpleQueryExecutor = new SimpleQueryExecutor(this); this.stepwiseQueryExecutor = new StepwiseQueryExecutor(this); } } @@ -95,12 +92,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (!matcher.matches(queryContext.getContext())) { return queryContext.newEmptyResult(); } - if (queryContext.isSimpleQuery()) { - return simpleQueryExecutor.executeQuery(queryContext); - } else { - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext); - return queryExecutor.executeQuery(queryContext); - } + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext); + return queryExecutor.executeQuery(queryContext); } protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext) { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java index ec78debb..c880c734 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java @@ -20,6 +20,7 @@ package com.gitee.dorive.sql.impl.count; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.executor.AbstractQueryExecutor; @@ -50,6 +51,11 @@ public class DefaultCountQuerier extends AbstractQueryExecutor implements CountQ this.sqlRunner = sqlRunner; } + @Override + protected Result doExecuteQuery(QueryContext queryContext) { + throw new UnsupportedOperationException(); + } + @Override public Map selectCountMap(Context context, CountQuery countQuery) { QueryContext queryContext = new QueryContext(context, countQuery.getQuery(), ResultType.COUNT); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index cfd7e3db..c7022ee0 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -74,7 +74,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return super.doExecuteQuery(queryContext); + return super.executeRootQuery(queryContext); } String tableAlias = tableSegment.getTableAlias(); -- Gitee From c615ed88e308b15218421baf073c76067b29f022 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 12:27:39 +0800 Subject: [PATCH 57/77] =?UTF-8?q?=E5=B0=81=E8=A3=85QueryExecutor=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/impl/executor/AbstractQueryExecutor.java | 5 +++++ .../dorive/query/repository/AbstractQueryRepository.java | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index a554614c..e645bf3c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -19,6 +19,7 @@ package com.gitee.dorive.query.impl.executor; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; @@ -47,6 +48,10 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { @Override public Result executeQuery(QueryContext queryContext) { resolve(queryContext); + Matcher matcher = repository.getRootRepository(); + if (!matcher.matches(queryContext.getContext())) { + return queryContext.newEmptyResult(); + } if (queryContext.isSimpleQuery()) { return executeRootQuery(queryContext); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index b5bff2fb..6fa40a36 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -19,7 +19,6 @@ package com.gitee.dorive.query.repository; import com.gitee.dorive.api.annotation.Repository; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; @@ -88,10 +87,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public Result executeQuery(QueryContext queryContext) { - Matcher matcher = getRootRepository(); - if (!matcher.matches(queryContext.getContext())) { - return queryContext.newEmptyResult(); - } QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext); return queryExecutor.executeQuery(queryContext); } -- Gitee From 1d5898aab73fdfe814baea3696d510090b0ff6e5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 13:11:39 +0800 Subject: [PATCH 58/77] =?UTF-8?q?=E5=B0=81=E8=A3=85QueryExecutor=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/entity/QueryContext.java | 4 +-- .../impl/executor/AbstractQueryExecutor.java | 26 +++++++++---------- .../impl/executor/StepwiseQueryExecutor.java | 6 ++--- ...esolver.java => QueryExampleResolver.java} | 2 +- ...ryResolver.java => QueryTypeResolver.java} | 10 +++---- .../repository/AbstractQueryRepository.java | 8 +++--- 6 files changed, 28 insertions(+), 28 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/{QueryResolver.java => QueryExampleResolver.java} (98%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/{QueryRepositoryResolver.java => QueryTypeResolver.java} (93%) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 2e9bfa5b..73bed216 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import lombok.Data; import java.util.Collections; @@ -35,7 +35,7 @@ public class QueryContext { private Object query; private ResultType resultType; private Class queryType; - private QueryResolver queryResolver; + private QueryExampleResolver queryExampleResolver; private List mergedRepositories; private Map exampleMap; private Example example; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index e645bf3c..a25d1ac7 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -29,8 +29,8 @@ import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; +import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; import java.util.LinkedHashMap; @@ -60,11 +60,11 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { protected void resolve(QueryContext queryContext) { Class queryType = queryContext.getQueryType(); - QueryResolver queryResolver = getQueryResolver(queryType); + QueryExampleResolver queryExampleResolver = getQueryExampleResolver(queryType); List mergedRepositories = getMergedRepositories(queryType); - Assert.notNull(queryResolver, "No query resolver found!"); + Assert.notNull(queryExampleResolver, "No query resolver found!"); Assert.notEmpty(mergedRepositories, "The merged repositories cannot be empty!"); - queryContext.setQueryResolver(queryResolver); + queryContext.setQueryExampleResolver(queryExampleResolver); queryContext.setMergedRepositories(mergedRepositories); Map exampleMap = newExampleMap(queryContext); @@ -76,22 +76,22 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { queryContext.setQueryUnit(queryUnitMap.get("/")); } - protected QueryResolver getQueryResolver(Class queryType) { - QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); - Map, QueryResolver> classQueryResolverMap = queryRepositoryResolver.getClassQueryResolverMap(); - return classQueryResolverMap.get(queryType); + protected QueryExampleResolver getQueryExampleResolver(Class queryType) { + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, QueryExampleResolver> classQueryExampleResolverMap = queryTypeResolver.getClassQueryExampleResolverMap(); + return classQueryExampleResolverMap.get(queryType); } protected List getMergedRepositories(Class queryType) { - QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); - Map, List> classMergedRepositoriesMap = queryRepositoryResolver.getClassMergedRepositoriesMap(); + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, List> classMergedRepositoriesMap = queryTypeResolver.getClassMergedRepositoriesMap(); return classMergedRepositoriesMap.get(queryType); } protected Map newExampleMap(QueryContext queryContext) { Object query = queryContext.getQuery(); - QueryResolver queryResolver = queryContext.getQueryResolver(); - return queryResolver.resolve(query); + QueryExampleResolver queryExampleResolver = queryContext.getQueryExampleResolver(); + return queryExampleResolver.resolve(query); } protected Map newQueryUnitMap(QueryContext queryContext) { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index a0adfa7a..aa197e09 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -29,7 +29,7 @@ import com.gitee.dorive.core.util.MultiInBuilder; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; import java.util.*; @@ -43,8 +43,8 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { @Override protected List getMergedRepositories(Class queryType) { - QueryRepositoryResolver queryRepositoryResolver = repository.getQueryRepositoryResolver(); - Map, List> classReversedMergedRepositoriesMap = queryRepositoryResolver.getClassReversedMergedRepositoriesMap(); + QueryTypeResolver queryTypeResolver = repository.getQueryTypeResolver(); + Map, List> classReversedMergedRepositoriesMap = queryTypeResolver.getClassReversedMergedRepositoriesMap(); return classReversedMergedRepositoriesMap.get(queryType); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java similarity index 98% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java index 339915c6..07ba7ccb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryExampleResolver.java @@ -35,7 +35,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class QueryResolver { +public class QueryExampleResolver { private ExampleDef exampleDef; private List queryFields; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java similarity index 93% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index cd424ce6..6aa59491 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -33,14 +33,14 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Data -public class QueryRepositoryResolver { +public class QueryTypeResolver { private AbstractQueryRepository repository; - private Map, QueryResolver> classQueryResolverMap = new ConcurrentHashMap<>(); + private Map, QueryExampleResolver> classQueryExampleResolverMap = new ConcurrentHashMap<>(); private Map, List> classMergedRepositoriesMap = new ConcurrentHashMap<>(); private Map, List> classReversedMergedRepositoriesMap = new ConcurrentHashMap<>(); - public QueryRepositoryResolver(AbstractQueryRepository repository) { + public QueryTypeResolver(AbstractQueryRepository repository) { this.repository = repository; } @@ -88,8 +88,8 @@ public class QueryRepositoryResolver { List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - QueryResolver queryResolver = new QueryResolver(exampleDef, queryFields, specificFields); - classQueryResolverMap.put(queryClass, queryResolver); + QueryExampleResolver queryExampleResolver = new QueryExampleResolver(exampleDef, queryFields, specificFields); + classQueryExampleResolverMap.put(queryClass, queryExampleResolver); classMergedRepositoriesMap.put(queryClass, mergedRepositories); classReversedMergedRepositoriesMap.put(queryClass, reversedMergedRepositories); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index 6fa40a36..a9f52f53 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -30,7 +30,7 @@ import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.executor.StepwiseQueryExecutor; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; -import com.gitee.dorive.query.impl.resolver.QueryRepositoryResolver; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Getter; import lombok.Setter; import org.springframework.core.annotation.AnnotatedElementUtils; @@ -43,7 +43,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; - private QueryRepositoryResolver queryRepositoryResolver; + private QueryTypeResolver queryTypeResolver; private QueryExecutor stepwiseQueryExecutor; @Override @@ -56,8 +56,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi mergedRepositoryResolver.resolve(); } if (repository != null && queryScanDef != null) { - this.queryRepositoryResolver = new QueryRepositoryResolver(this); - queryRepositoryResolver.resolve(); + this.queryTypeResolver = new QueryTypeResolver(this); + queryTypeResolver.resolve(); this.stepwiseQueryExecutor = new StepwiseQueryExecutor(this); } } -- Gitee From 13858ffc42fd2efe68213a5d8a9550df3624f0ef Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 2 Jul 2024 18:59:58 +0800 Subject: [PATCH 59/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MybatisPlusRepository.java | 8 +++---- .../gitee/dorive/query/entity/QueryUnit.java | 20 ++++++++++++++++ .../CountQueryExecutor.java} | 6 ++--- .../sql/impl/segment/SegmentBuilder.java | 23 ++++++++++--------- 4 files changed, 39 insertions(+), 18 deletions(-) rename dorive-sql/src/main/java/com/gitee/dorive/sql/impl/{count/DefaultCountQuerier.java => executor/CountQueryExecutor.java} (95%) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 53ca0227..b011a940 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -37,7 +37,7 @@ import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.common.CountQuery; -import com.gitee.dorive.sql.impl.count.DefaultCountQuerier; +import com.gitee.dorive.sql.impl.executor.CountQueryExecutor; import com.gitee.dorive.sql.impl.executor.SqlQueryExecutor; import com.gitee.dorive.sql.impl.executor.UnionExecutor; import lombok.Getter; @@ -57,14 +57,14 @@ public class MybatisPlusRepository extends AbstractRefRepository i private SqlRunner sqlRunner; private QueryExecutor sqlQueryExecutor; - private CountQuerier defaultCountQuerier; + private CountQuerier countQuerier; @Override public void afterPropertiesSet() throws Exception { ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); this.sqlRunner = implFactory.getInstance(SqlRunner.class); this.sqlQueryExecutor = new SqlQueryExecutor(this, this.sqlRunner); - this.defaultCountQuerier = new DefaultCountQuerier(this, this.sqlRunner); + this.countQuerier = new CountQueryExecutor(this, this.sqlRunner); super.afterPropertiesSet(); } @@ -139,7 +139,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i @Override public Map selectCountMap(Context context, CountQuery countQuery) { - return defaultCountQuerier.selectCountMap(context, countQuery); + return countQuerier.selectCountMap(context, countQuery); } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 8d0e323e..05cb0604 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -17,14 +17,34 @@ package com.gitee.dorive.query.entity; +import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.impl.executor.ExampleExecutor; +import com.gitee.dorive.core.repository.CommonRepository; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.Map; + @Data @AllArgsConstructor public class QueryUnit { + private MergedRepository mergedRepository; private Example example; private boolean abandoned; + + public Example getConvertedExample(Context context) { + CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + EntityElement entityElement = executedRepository.getEntityElement(); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); + ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); + + exampleExecutor.convert(context, example); + return example; + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java similarity index 95% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java index c880c734..d3f73b95 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/count/DefaultCountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.sql.impl.count; +package com.gitee.dorive.sql.impl.executor; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; @@ -42,11 +42,11 @@ import java.util.Map; @Getter @Setter -public class DefaultCountQuerier extends AbstractQueryExecutor implements CountQuerier { +public class CountQueryExecutor extends AbstractQueryExecutor implements CountQuerier { private SqlRunner sqlRunner; - public DefaultCountQuerier(AbstractQueryRepository repository, SqlRunner sqlRunner) { + public CountQueryExecutor(AbstractQueryRepository repository, SqlRunner sqlRunner) { super(repository); this.sqlRunner = sqlRunner; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java index 0cb9ec0b..71cb0c5e 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java @@ -24,7 +24,6 @@ import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueFilterBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; @@ -34,13 +33,17 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CriterionUtils; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.sql.api.Segment; import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.segment.*; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data public class SegmentBuilder { @@ -57,15 +60,15 @@ public class SegmentBuilder { this.matchedSegmentInfos = new ArrayList<>(8); } - List mergedRepositories = queryContext.getMergedRepositories(); - Map exampleMap = queryContext.getExampleMap(); - - Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); + Map queryUnitMap = queryContext.getQueryUnitMap(); + Map nodeMap = new LinkedHashMap<>(queryUnitMap.size() * 4 / 3 + 1); SelectSegment selectSegment = new SelectSegment(); List joinSegments = selectSegment.getJoinSegments(); - for (MergedRepository mergedRepository : mergedRepositories) { - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + for (QueryUnit queryUnit : queryUnitMap.values()) { + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + Example example = queryUnit.getExample(); + String relativeAccessPath = mergedRepository.getRelativeAccessPath(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); @@ -77,6 +80,7 @@ public class SegmentBuilder { String tableName = entityStoreInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); + exampleExecutor.convert(context, example); SegmentInfo segmentInfo = new SegmentInfo(tableAlias, entityElement); boolean isMatch = selector != null && definedRepository.matches(selector); @@ -84,9 +88,6 @@ public class SegmentBuilder { matchedSegmentInfos.add(segmentInfo); } - Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); - exampleExecutor.convert(context, example); - TableSegment tableSegment = new TableSegment(tableName, tableAlias, example.isNotEmpty() || isMatch, new ArrayList<>(example.getCriteria().size())); Node node = new Node(tableSegment, new ArrayList<>(4)); nodeMap.put(relativeAccessPath, node); -- Gitee From 536e50d978f7c45e0eacb9aaeb8c00a85905f074 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 3 Jul 2024 17:47:06 +0800 Subject: [PATCH 60/77] =?UTF-8?q?=E6=9E=81=E5=A4=A7=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MybatisPlusRepository.java | 4 +- .../dorive/query/entity/MergedRepository.java | 12 +- .../dorive/query/entity/QueryContext.java | 5 +- .../gitee/dorive/query/entity/QueryUnit.java | 28 +-- .../impl/executor/AbstractQueryExecutor.java | 9 +- .../impl/executor/StepwiseQueryExecutor.java | 22 +- .../resolver/MergedRepositoryResolver.java | 51 +++-- .../com/gitee/dorive/sql/api/Segment.java | 3 - .../dorive/sql/entity/common/SegmentUnit.java | 12 ++ .../dorive/sql/entity/segment/ArgSegment.java | 3 +- .../dorive/sql/entity/segment/OnSegment.java | 2 + .../sql/entity/segment/OnValueSegment.java | 2 + .../sql/entity/segment/SelectSegment.java | 32 ++- ...JoinSegment.java => TableJoinSegment.java} | 11 +- .../sql/entity/segment/TableSegment.java | 11 +- ...ecutor.java => CountSqlQueryExecutor.java} | 28 +-- .../sql/impl/executor/SqlQueryExecutor.java | 20 +- .../sql/impl/segment/SegmentBuilder.java | 198 ------------------ .../sql/impl/segment/SegmentUnitResolver.java | 147 +++++++++++++ .../impl/segment/SelectSegmentBuilder.java | 80 +++++++ 20 files changed, 359 insertions(+), 321 deletions(-) create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java rename dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/{JoinSegment.java => TableJoinSegment.java} (85%) rename dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/{CountQueryExecutor.java => CountSqlQueryExecutor.java} (79%) delete mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index b011a940..7868dc4a 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -37,7 +37,7 @@ import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.common.CountQuery; -import com.gitee.dorive.sql.impl.executor.CountQueryExecutor; +import com.gitee.dorive.sql.impl.executor.CountSqlQueryExecutor; import com.gitee.dorive.sql.impl.executor.SqlQueryExecutor; import com.gitee.dorive.sql.impl.executor.UnionExecutor; import lombok.Getter; @@ -64,7 +64,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); this.sqlRunner = implFactory.getInstance(SqlRunner.class); this.sqlQueryExecutor = new SqlQueryExecutor(this, this.sqlRunner); - this.countQuerier = new CountQueryExecutor(this, this.sqlRunner); + this.countQuerier = new CountSqlQueryExecutor(this, this.sqlRunner); super.afterPropertiesSet(); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index fec8b38e..afbb9890 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -26,6 +26,7 @@ import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; +import java.util.Set; @Data @NoArgsConstructor @@ -34,13 +35,16 @@ public class MergedRepository { private String lastAccessPath; private String absoluteAccessPath; - private String relativeAccessPath; - private boolean merged; private CommonRepository definedRepository; - private Map> relativeStrongBindersMap; - private Map> relativeValueRouteBindersMap; + // absoluteAccessPath ==> StrongBinder + private Map> mergedStrongBindersMap; + // absoluteAccessPath ==> ValueRouteBinder + private Map> mergedValueRouteBindersMap; + // 血缘路径 + private Set bloodAccessPaths; private CommonRepository executedRepository; private Integer order; + private String alias; public String getName() { return definedRepository.getEntityElement().getEntityDef().getName(); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 73bed216..8895cf33 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -24,9 +24,7 @@ import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.resolver.QueryExampleResolver; import lombok.Data; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; @Data public class QueryContext { @@ -41,6 +39,7 @@ public class QueryContext { private Example example; private Map queryUnitMap; private QueryUnit queryUnit; + private List args = new ArrayList<>(8); public QueryContext(Context context, Object query, ResultType resultType) { this.context = context; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 05cb0604..35726e69 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -17,34 +17,16 @@ package com.gitee.dorive.query.entity; -import com.gitee.dorive.api.entity.ele.EntityElement; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.executor.ExampleExecutor; -import com.gitee.dorive.core.repository.CommonRepository; import lombok.AllArgsConstructor; import lombok.Data; - -import java.util.Map; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor @AllArgsConstructor public class QueryUnit { - - private MergedRepository mergedRepository; - private Example example; - private boolean abandoned; - - public Example getConvertedExample(Context context) { - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - EntityElement entityElement = executedRepository.getEntityElement(); - Map attributes = entityElement.getAttributes(); - EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); - ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); - - exampleExecutor.convert(context, example); - return example; - } - + protected MergedRepository mergedRepository; + protected Example example; + protected boolean abandoned; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index a25d1ac7..56faa5c2 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -100,14 +100,17 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { Map queryUnitMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : mergedRepositories) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); - String relativeAccessPath = mergedRepository.getRelativeAccessPath(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); - QueryUnit queryUnit = new QueryUnit(mergedRepository, example, false); - queryUnitMap.put(relativeAccessPath, queryUnit); + QueryUnit queryUnit = newQueryUnit(queryContext, mergedRepository, example); + queryUnitMap.put(absoluteAccessPath, queryUnit); } return queryUnitMap; } + protected QueryUnit newQueryUnit(QueryContext queryContext, MergedRepository mergedRepository, Example example) { + return new QueryUnit(mergedRepository, example, false); + } + @SuppressWarnings("unchecked") protected Result executeRootQuery(QueryContext queryContext) { Context context = queryContext.getContext(); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index aa197e09..680a3206 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -70,17 +70,17 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { boolean abandoned = queryUnit.isAbandoned(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - Map> relativeStrongBindersMap = mergedRepository.getRelativeStrongBindersMap(); - Map> relativeValueRouteBindersMap = mergedRepository.getRelativeValueRouteBindersMap(); + Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); + Map> mergedValueRouteBindersMap = mergedRepository.getMergedValueRouteBindersMap(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); BinderResolver binderResolver = definedRepository.getBinderResolver(); if (!abandoned) { - abandoned = determineAbandon(queryUnitMap, relativeValueRouteBindersMap.keySet()); + abandoned = determineAbandon(queryUnitMap, mergedValueRouteBindersMap.keySet()); } if (!abandoned) { - abandoned = determineAbandon(queryUnitMap, relativeStrongBindersMap.keySet()); + abandoned = determineAbandon(queryUnitMap, mergedStrongBindersMap.keySet()); } List entities; @@ -96,8 +96,8 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { return; } - relativeValueRouteBindersMap.forEach((relativeAccessPath, valueRouteBinders) -> { - QueryUnit targetQueryUnit = queryUnitMap.get(relativeAccessPath); + mergedValueRouteBindersMap.forEach((absoluteAccessPath, valueRouteBinders) -> { + QueryUnit targetQueryUnit = queryUnitMap.get(absoluteAccessPath); if (targetQueryUnit != null) { Example targetExample = targetQueryUnit.getExample(); for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { @@ -110,8 +110,8 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { } }); - relativeStrongBindersMap.forEach((relativeAccessPath, strongBinders) -> { - QueryUnit targetQueryUnit = queryUnitMap.get(relativeAccessPath); + mergedStrongBindersMap.forEach((absoluteAccessPath, strongBinders) -> { + QueryUnit targetQueryUnit = queryUnitMap.get(absoluteAccessPath); if (targetQueryUnit != null) { if (entities.isEmpty()) { targetQueryUnit.setAbandoned(true); @@ -147,9 +147,9 @@ public class StepwiseQueryExecutor extends AbstractQueryExecutor { }); } - private boolean determineAbandon(Map exampleWrapperMap, Set relativeAccessPaths) { - for (String relativeAccessPath : relativeAccessPaths) { - QueryUnit targetQueryUnit = exampleWrapperMap.get(relativeAccessPath); + private boolean determineAbandon(Map queryUnitMap, Set absoluteAccessPaths) { + for (String absoluteAccessPath : absoluteAccessPaths) { + QueryUnit targetQueryUnit = queryUnitMap.get(absoluteAccessPath); if (targetQueryUnit != null) { if (targetQueryUnit.isAbandoned()) { return true; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 2a2ec028..20bb64d5 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -28,9 +28,7 @@ import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; import org.apache.commons.lang3.StringUtils; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data public class MergedRepositoryResolver { @@ -50,26 +48,32 @@ public class MergedRepositoryResolver { String accessPath = repository.getAccessPath(); BinderResolver binderResolver = repository.getBinderResolver(); - String relativeAccessPath = accessPath; CommonRepository executedRepository = repository; AbstractRepository abstractRepository = repository.getProxyRepository(); AbstractQueryRepository abstractQueryRepository = null; if (abstractRepository instanceof AbstractQueryRepository) { abstractQueryRepository = (AbstractQueryRepository) abstractRepository; - relativeAccessPath = relativeAccessPath + "/"; executedRepository = abstractQueryRepository.getRootRepository(); } MergedRepository mergedRepository = new MergedRepository(); mergedRepository.setLastAccessPath(""); mergedRepository.setAbsoluteAccessPath(accessPath); - mergedRepository.setRelativeAccessPath(relativeAccessPath); - mergedRepository.setMerged(abstractQueryRepository != null); mergedRepository.setDefinedRepository(repository); - mergedRepository.setRelativeStrongBindersMap(new LinkedHashMap<>(binderResolver.getMergedStrongBindersMap())); - mergedRepository.setRelativeValueRouteBindersMap(new LinkedHashMap<>(binderResolver.getMergedValueRouteBindersMap())); + mergedRepository.setMergedStrongBindersMap(new LinkedHashMap<>(binderResolver.getMergedStrongBindersMap())); + mergedRepository.setMergedValueRouteBindersMap(new LinkedHashMap<>(binderResolver.getMergedValueRouteBindersMap())); + + // 血缘分析 + Set bloodAccessPaths = new LinkedHashSet<>(8); + bloodAccessPaths.addAll(mergedRepository.getMergedStrongBindersMap().keySet()); + bloodAccessPaths.addAll(mergedRepository.getMergedValueRouteBindersMap().keySet()); + for (String bloodAccessPath : bloodAccessPaths) { + MergedRepository bloodMergedRepository = mergedRepositoryMap.get(bloodAccessPath); + bloodAccessPaths.addAll(bloodMergedRepository.getBloodAccessPaths()); + } + mergedRepository.setBloodAccessPaths(bloodAccessPaths); + mergedRepository.setExecutedRepository(executedRepository); - mergedRepository.setOrder(mergedRepositoryMap.size() + 1); addMergedRepository(mergedRepository); if (abstractQueryRepository != null) { @@ -79,8 +83,12 @@ public class MergedRepositoryResolver { } private void addMergedRepository(MergedRepository mergedRepository) { + mergedRepository.setOrder(mergedRepositoryMap.size() + 1); + mergedRepository.setAlias("t" + mergedRepository.getOrder()); + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); + String name = mergedRepository.getName(); if (StringUtils.isNotBlank(name)) { nameMergedRepositoryMap.putIfAbsent(name, mergedRepository); @@ -97,24 +105,25 @@ public class MergedRepositoryResolver { MergedRepository newMergedRepository = new MergedRepository(); newMergedRepository.setLastAccessPath(accessPath + mergedRepository.getLastAccessPath()); newMergedRepository.setAbsoluteAccessPath(accessPath + mergedRepository.getAbsoluteAccessPath()); - newMergedRepository.setRelativeAccessPath(accessPath + mergedRepository.getRelativeAccessPath()); - newMergedRepository.setMerged(mergedRepository.isMerged()); newMergedRepository.setDefinedRepository(mergedRepository.getDefinedRepository()); - Map> relativeStrongBindersMap = mergedRepository.getRelativeStrongBindersMap(); - Map> newRelativeStrongBindersMap = new LinkedHashMap<>(relativeStrongBindersMap.size() * 4 / 3 + 1); - relativeStrongBindersMap.forEach((k, v) -> newRelativeStrongBindersMap.put(accessPath + k, v)); - newMergedRepository.setRelativeStrongBindersMap(newRelativeStrongBindersMap); + Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); + Map> newMergedStrongBindersMap = new LinkedHashMap<>(mergedStrongBindersMap.size() * 4 / 3 + 1); + mergedStrongBindersMap.forEach((k, v) -> newMergedStrongBindersMap.put(mergeAccessPath(accessPath, k), v)); + newMergedRepository.setMergedStrongBindersMap(newMergedStrongBindersMap); - Map> relativeValueRouteBindersMap = mergedRepository.getRelativeValueRouteBindersMap(); - Map> newRelativeValueRouteBindersMap = new LinkedHashMap<>(relativeValueRouteBindersMap.size() * 4 / 3 + 1); - relativeValueRouteBindersMap.forEach((k, v) -> newRelativeValueRouteBindersMap.put(accessPath + k, v)); - newMergedRepository.setRelativeValueRouteBindersMap(newRelativeValueRouteBindersMap); + Map> mergedValueRouteBindersMap = mergedRepository.getMergedValueRouteBindersMap(); + Map> newMergedValueRouteBindersMap = new LinkedHashMap<>(mergedValueRouteBindersMap.size() * 4 / 3 + 1); + mergedValueRouteBindersMap.forEach((k, v) -> newMergedValueRouteBindersMap.put(mergeAccessPath(accessPath, k), v)); + newMergedRepository.setMergedValueRouteBindersMap(newMergedValueRouteBindersMap); newMergedRepository.setExecutedRepository(mergedRepository.getExecutedRepository()); - newMergedRepository.setOrder(mergedRepositoryMap.size() + 1); addMergedRepository(newMergedRepository); } } + private String mergeAccessPath(String lastAccessPath, String accessPath) { + return "/".equals(accessPath) ? lastAccessPath : lastAccessPath + accessPath; + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java index ab5d6253..f2804393 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/Segment.java @@ -18,7 +18,4 @@ package com.gitee.dorive.sql.api; public interface Segment { - - String toString(); - } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java new file mode 100644 index 00000000..e6d87da5 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java @@ -0,0 +1,12 @@ +package com.gitee.dorive.sql.entity.common; + +import com.gitee.dorive.query.entity.QueryUnit; +import com.gitee.dorive.sql.entity.segment.TableSegment; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SegmentUnit extends QueryUnit { + private TableSegment tableSegment; +} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java index 5c6e7356..cb19d0d3 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java @@ -17,12 +17,13 @@ package com.gitee.dorive.sql.entity.segment; +import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor -public class ArgSegment { +public class ArgSegment implements Segment { private String tableAlias; private String column; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java index 0affb7e6..69c19b61 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java @@ -20,10 +20,12 @@ package com.gitee.dorive.sql.entity.segment; import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@NoArgsConstructor @AllArgsConstructor public class OnSegment implements Segment { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java index ff881ff0..d6fe2608 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java @@ -20,10 +20,12 @@ package com.gitee.dorive.sql.entity.segment; import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@NoArgsConstructor @AllArgsConstructor public class OnValueSegment implements Segment { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java index 06d51b18..0296e946 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java @@ -19,6 +19,7 @@ package com.gitee.dorive.sql.entity.segment; import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; +import com.gitee.dorive.sql.api.Segment; import lombok.Data; import java.util.ArrayList; @@ -26,38 +27,30 @@ import java.util.Collections; import java.util.List; @Data -public class SelectSegment { +public class SelectSegment implements Segment { - private char letter = 'a'; private boolean distinct; private List selectColumns = Collections.emptyList(); private TableSegment tableSegment; - private List joinSegments = new ArrayList<>(); + private List tableJoinSegments = new ArrayList<>(); private List argSegments = new ArrayList<>(); private List args = new ArrayList<>(); private String groupBy; private String orderBy; private String limit; - public String generateTableAlias() { - String tableAlias = String.valueOf(letter); - letter = (char) (letter + 1); - return tableAlias; - } - public void filterTableSegments() { if (tableSegment.isJoin()) { argSegments.addAll(tableSegment.getArgSegments()); } - List newJoinSegments = new ArrayList<>(joinSegments.size()); - for (JoinSegment joinSegment : joinSegments) { - TableSegment tableSegment = joinSegment.getTableSegment(); - if (tableSegment.isJoin()) { - newJoinSegments.add(joinSegment); - argSegments.addAll(tableSegment.getArgSegments()); + List newTableJoinSegments = new ArrayList<>(tableJoinSegments.size()); + for (TableJoinSegment tableJoinSegment : tableJoinSegments) { + if (tableJoinSegment.isJoin()) { + argSegments.addAll(tableJoinSegment.getArgSegments()); + newTableJoinSegments.add(tableJoinSegment); } } - joinSegments = newJoinSegments; + tableJoinSegments = newTableJoinSegments; } public String selectSql() { @@ -69,10 +62,9 @@ public class SelectSegment { public String fromWhereSql() { SqlBuilder sqlBuilder = SqlBuilder.create(); sqlBuilder.from(tableSegment.toString()); - for (JoinSegment joinSegment : joinSegments) { - TableSegment tableSegment = joinSegment.getTableSegment(); - sqlBuilder.join(tableSegment.toString(), SqlBuilder.Join.LEFT); - sqlBuilder.on(StrUtil.join(" AND ", joinSegment.getOnSegments())); + for (TableJoinSegment tableJoinSegment : tableJoinSegments) { + sqlBuilder.join(tableJoinSegment.toString(), SqlBuilder.Join.LEFT); + sqlBuilder.on(StrUtil.join(" AND ", tableJoinSegment.getOnSegments())); } sqlBuilder.where(StrUtil.join(" AND ", argSegments)); return sqlBuilder.toString(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/JoinSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java similarity index 85% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/JoinSegment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java index a2978d98..3cddb05f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/JoinSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java @@ -19,13 +19,16 @@ package com.gitee.dorive.sql.entity.segment; import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.List; -@Data +@Getter +@Setter +@NoArgsConstructor @AllArgsConstructor -public class JoinSegment { - private TableSegment tableSegment; +public class TableJoinSegment extends TableSegment { private List onSegments; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java index b51db102..420e52c0 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableSegment.java @@ -17,14 +17,19 @@ package com.gitee.dorive.sql.entity.segment; +import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.List; -@Data +@Getter +@Setter +@NoArgsConstructor @AllArgsConstructor -public class TableSegment { +public class TableSegment implements Segment { private String tableName; private String tableAlias; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java similarity index 79% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java index d3f73b95..e765dec7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java @@ -20,10 +20,8 @@ package com.gitee.dorive.sql.impl.executor; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.enums.ResultType; -import com.gitee.dorive.query.impl.executor.AbstractQueryExecutor; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; @@ -31,7 +29,7 @@ import com.gitee.dorive.sql.entity.common.CountQuery; import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableSegment; -import com.gitee.dorive.sql.impl.segment.SegmentBuilder; +import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; import lombok.Getter; import lombok.Setter; @@ -42,18 +40,10 @@ import java.util.Map; @Getter @Setter -public class CountQueryExecutor extends AbstractQueryExecutor implements CountQuerier { +public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuerier { - private SqlRunner sqlRunner; - - public CountQueryExecutor(AbstractQueryRepository repository, SqlRunner sqlRunner) { - super(repository); - this.sqlRunner = sqlRunner; - } - - @Override - protected Result doExecuteQuery(QueryContext queryContext) { - throw new UnsupportedOperationException(); + public CountSqlQueryExecutor(AbstractQueryRepository repository, SqlRunner sqlRunner) { + super(repository, sqlRunner); } @Override @@ -61,14 +51,14 @@ public class CountQueryExecutor extends AbstractQueryExecutor implements CountQu QueryContext queryContext = new QueryContext(context, countQuery.getQuery(), ResultType.COUNT); resolve(queryContext); - SegmentBuilder segmentBuilder = new SegmentBuilder(queryContext); - SelectSegment selectSegment = segmentBuilder.buildSegment(context, countQuery.getSelector()); + SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); + SelectSegment selectSegment = selectSegmentBuilder.build(countQuery.getSelector()); TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); String tableAlias = tableSegment.getTableAlias(); EntityElement entityElement = repository.getEntityElement(); - String countByExp = buildCountByExp(countQuery, segmentBuilder, tableAlias, entityElement); + String countByExp = buildCountByExp(countQuery, selectSegmentBuilder, tableAlias, entityElement); String groupByPrefix = tableAlias + "."; List groupBy = entityElement.toAliases(countQuery.getGroupBy()); @@ -86,8 +76,8 @@ public class CountQueryExecutor extends AbstractQueryExecutor implements CountQu return countMap; } - private String buildCountByExp(CountQuery countQuery, SegmentBuilder segmentBuilder, String tableAlias, EntityElement entityElement) { - List segmentInfos = segmentBuilder.getMatchedSegmentInfos(); + private String buildCountByExp(CountQuery countQuery, SelectSegmentBuilder selectSegmentBuilder, String tableAlias, EntityElement entityElement) { + List segmentInfos = selectSegmentBuilder.getMatchedSegmentInfos(); if (segmentInfos != null && !segmentInfos.isEmpty()) { SegmentInfo segmentInfo = segmentInfos.get(0); tableAlias = segmentInfo.getTableAlias(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index c7022ee0..62cb33b3 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -22,7 +22,9 @@ import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.*; +import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.impl.executor.AbstractQueryExecutor; import com.gitee.dorive.query.repository.AbstractQueryRepository; @@ -30,7 +32,8 @@ import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.segment.ArgSegment; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableSegment; -import com.gitee.dorive.sql.impl.segment.SegmentBuilder; +import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; +import com.gitee.dorive.sql.impl.segment.SegmentUnitResolver; import lombok.Getter; import lombok.Setter; @@ -42,13 +45,19 @@ import java.util.Map; @Setter public class SqlQueryExecutor extends AbstractQueryExecutor { - private SqlRunner sqlRunner; + protected SqlRunner sqlRunner; public SqlQueryExecutor(AbstractQueryRepository repository, SqlRunner sqlRunner) { super(repository); this.sqlRunner = sqlRunner; } + @Override + protected QueryUnit newQueryUnit(QueryContext queryContext, MergedRepository mergedRepository, Example example) { + SegmentUnitResolver segmentUnitResolver = new SegmentUnitResolver(repository, queryContext, mergedRepository, example); + return segmentUnitResolver.resolve(); + } + @Override @SuppressWarnings("unchecked") public Result doExecuteQuery(QueryContext queryContext) { @@ -67,9 +76,8 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { boolean needCount = queryContext.isNeedCount(); Result emptyResult = queryContext.newEmptyResult(); - SegmentBuilder segmentBuilder = new SegmentBuilder(queryContext); - SelectSegment selectSegment = segmentBuilder.buildSegment(context, null); - char letter = selectSegment.getLetter(); + SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); + SelectSegment selectSegment = selectSegmentBuilder.build(null); TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); @@ -88,7 +96,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { if (needCount) { String countSql = selectSql + fromWhereSql; - long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); + long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") c", args.toArray()); if (count == 0L) { return emptyResult; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java deleted file mode 100644 index 71cb0c5e..00000000 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentBuilder.java +++ /dev/null @@ -1,198 +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.sql.impl.segment; - -import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.api.entity.ele.EntityElement; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.impl.binder.StrongBinder; -import com.gitee.dorive.core.impl.binder.ValueFilterBinder; -import com.gitee.dorive.core.impl.binder.ValueRouteBinder; -import com.gitee.dorive.core.impl.executor.ExampleExecutor; -import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.core.util.CriterionUtils; -import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.sql.api.Segment; -import com.gitee.dorive.sql.entity.common.SegmentInfo; -import com.gitee.dorive.sql.entity.segment.*; -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -@Data -public class SegmentBuilder { - - private QueryContext queryContext; - private List matchedSegmentInfos; - - public SegmentBuilder(QueryContext queryContext) { - this.queryContext = queryContext; - } - - public SelectSegment buildSegment(Context context, Selector selector) { - if (selector != null) { - this.matchedSegmentInfos = new ArrayList<>(8); - } - - Map queryUnitMap = queryContext.getQueryUnitMap(); - Map nodeMap = new LinkedHashMap<>(queryUnitMap.size() * 4 / 3 + 1); - SelectSegment selectSegment = new SelectSegment(); - List joinSegments = selectSegment.getJoinSegments(); - - for (QueryUnit queryUnit : queryUnitMap.values()) { - MergedRepository mergedRepository = queryUnit.getMergedRepository(); - Example example = queryUnit.getExample(); - - String relativeAccessPath = mergedRepository.getRelativeAccessPath(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - - EntityElement entityElement = executedRepository.getEntityElement(); - Map attributes = entityElement.getAttributes(); - EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); - ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); - - String tableName = entityStoreInfo.getTableName(); - String tableAlias = selectSegment.generateTableAlias(); - exampleExecutor.convert(context, example); - - SegmentInfo segmentInfo = new SegmentInfo(tableAlias, entityElement); - boolean isMatch = selector != null && definedRepository.matches(selector); - if (isMatch) { - matchedSegmentInfos.add(segmentInfo); - } - - TableSegment tableSegment = new TableSegment(tableName, tableAlias, example.isNotEmpty() || isMatch, new ArrayList<>(example.getCriteria().size())); - Node node = new Node(tableSegment, new ArrayList<>(4)); - nodeMap.put(relativeAccessPath, node); - - if ("/".equals(relativeAccessPath)) { - selectSegment.setTableSegment(tableSegment); - - } else { - List onSegments = newOnSegments(context, nodeMap, mergedRepository, node); - if (onSegments.isEmpty()) { - nodeMap.remove(relativeAccessPath); - continue; - } - JoinSegment joinSegment = new JoinSegment(tableSegment, onSegments); - joinSegments.add(joinSegment); - } - - addTableSegmentArgs(selectSegment, example, tableSegment); - } - - markTableSegmentJoin(nodeMap.get("/")); - selectSegment.filterTableSegments(); - return selectSegment; - } - - private List newOnSegments(Context context, Map nodeMap, MergedRepository mergedRepository, Node node) { - String lastAccessPath = mergedRepository.getLastAccessPath(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - BinderResolver binderResolver = definedRepository.getBinderResolver(); - List strongBinders = binderResolver.getStrongBinders(); - List valueRouteBinders = binderResolver.getValueRouteBinders(); - List valueFilterBinders = binderResolver.getValueFilterBinders(); - - TableSegment tableSegment = node.getTableSegment(); - - List onSegments = new ArrayList<>(strongBinders.size()); - for (StrongBinder strongBinder : strongBinders) { - String relativeAccessPath = lastAccessPath + strongBinder.getBelongAccessPath(); - Node targetNode = nodeMap.get(relativeAccessPath); - if (targetNode != null) { - TableSegment targetTableSegment = targetNode.getTableSegment(); - List children = targetNode.getChildren(); - if (!children.contains(node)) { - children.add(node); - } - OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), strongBinder.getFieldAlias(), targetTableSegment.getTableAlias(), strongBinder.getBindFieldAlias()); - onSegments.add(onSegment); - } - } - for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { - String relativeAccessPath = lastAccessPath + valueRouteBinder.getBelongAccessPath(); - Node targetNode = nodeMap.get(relativeAccessPath); - if (targetNode != null) { - TableSegment targetTableSegment = targetNode.getTableSegment(); - OnValueSegment onValueSegment = new OnValueSegment(targetTableSegment.getTableAlias(), valueRouteBinder.getBindFieldAlias(), CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); - onSegments.add(onValueSegment); - } - } - for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { - OnValueSegment onValueSegment = new OnValueSegment(tableSegment.getTableAlias(), valueFilterBinder.getFieldAlias(), CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); - onSegments.add(onValueSegment); - } - return onSegments; - } - - private void addTableSegmentArgs(SelectSegment selectSegment, Example example, TableSegment tableSegment) { - List args = selectSegment.getArgs(); - String tableAlias = tableSegment.getTableAlias(); - List argSegments = tableSegment.getArgSegments(); - for (Criterion criterion : example.getCriteria()) { - String property = criterion.getProperty(); - String operator = CriterionUtils.getOperator(criterion); - if (Operator.IS_NULL.equals(operator) || Operator.IS_NOT_NULL.equals(operator)) { - ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, null); - argSegments.add(argSegment); - - } else { - Object value = criterion.getValue(); - args.add(CriterionUtils.format(operator, value)); - int index = args.size() - 1; - ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, "{" + index + "}"); - argSegments.add(argSegment); - } - } - } - - private void markTableSegmentJoin(Node node) { - if (node != null) { - TableSegment tableSegment = node.getTableSegment(); - List children = node.getChildren(); - for (Node child : children) { - markTableSegmentJoin(child); - TableSegment childTableSegment = child.getTableSegment(); - if (childTableSegment.isJoin()) { - tableSegment.setJoin(true); - } - } - } - } - - @Data - @AllArgsConstructor - public static class Node { - private TableSegment tableSegment; - private List children; - } - -} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java new file mode 100644 index 00000000..5ee0da99 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java @@ -0,0 +1,147 @@ +package com.gitee.dorive.sql.impl.segment; + +import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.impl.binder.StrongBinder; +import com.gitee.dorive.core.impl.binder.ValueFilterBinder; +import com.gitee.dorive.core.impl.binder.ValueRouteBinder; +import com.gitee.dorive.core.impl.executor.ExampleExecutor; +import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.util.CriterionUtils; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; +import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; +import com.gitee.dorive.sql.api.Segment; +import com.gitee.dorive.sql.entity.common.SegmentUnit; +import com.gitee.dorive.sql.entity.segment.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.*; + +@Getter +@Setter +@AllArgsConstructor +public class SegmentUnitResolver { + + private AbstractQueryRepository repository; + private QueryContext queryContext; + private MergedRepository mergedRepository; + private Example example; + + public SegmentUnit resolve() { + Context context = queryContext.getContext(); + + CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + EntityElement entityElement = executedRepository.getEntityElement(); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); + ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); + + String tableName = entityStoreInfo.getTableName(); + exampleExecutor.convert(context, example); + + SegmentUnit segmentUnit = new SegmentUnit(); + segmentUnit.setMergedRepository(mergedRepository); + segmentUnit.setExample(example); + segmentUnit.setAbandoned(false); + segmentUnit.setTableSegment(newTableSegment(tableName)); + return segmentUnit; + } + + private TableSegment newTableSegment(String tableName) { + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + TableSegment tableSegment = "/".equals(absoluteAccessPath) ? new TableSegment() : new TableJoinSegment(newOnSegments()); + tableSegment.setTableName(tableName); + tableSegment.setTableAlias(mergedRepository.getAlias()); + tableSegment.setJoin(example.isNotEmpty()); + tableSegment.setArgSegments(newArgSegments()); + + if (tableSegment.isJoin()) { + Map queryUnitMap = queryContext.getQueryUnitMap(); + Set bloodAccessPaths = mergedRepository.getBloodAccessPaths(); + for (String bloodAccessPath : bloodAccessPaths) { + SegmentUnit segmentUnit = (SegmentUnit) queryUnitMap.get(bloodAccessPath); + TableSegment targetTableSegment = segmentUnit.getTableSegment(); + targetTableSegment.setJoin(true); + } + } + return tableSegment; + } + + private List newOnSegments() { + MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); + Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); + + Context context = queryContext.getContext(); + + CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + Map> mergedStrongBindersMap = mergedRepository.getMergedStrongBindersMap(); + Map> mergedValueRouteBindersMap = mergedRepository.getMergedValueRouteBindersMap(); + + BinderResolver binderResolver = definedRepository.getBinderResolver(); + List valueFilterBinders = binderResolver.getValueFilterBinders(); + + List onSegments = new ArrayList<>(mergedStrongBindersMap.size() + mergedValueRouteBindersMap.size() + valueFilterBinders.size()); + mergedStrongBindersMap.forEach((absoluteAccessPath, strongBinders) -> { + MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); + for (StrongBinder strongBinder : strongBinders) { + OnSegment onSegment = new OnSegment(); + onSegment.setTableAlias(mergedRepository.getAlias()); + onSegment.setColumn(strongBinder.getFieldAlias()); + onSegment.setJoinTableAlias(targetMergedRepository.getAlias()); + onSegment.setJoinColumn(strongBinder.getBindFieldAlias()); + onSegments.add(onSegment); + } + }); + mergedValueRouteBindersMap.forEach((absoluteAccessPath, valueRouteBinders) -> { + MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); + for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { + OnValueSegment onValueSegment = new OnValueSegment(); + onValueSegment.setTableAlias(targetMergedRepository.getAlias()); + onValueSegment.setColumn(valueRouteBinder.getBindFieldAlias()); + onValueSegment.setLiteral(CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); + onSegments.add(onValueSegment); + } + }); + for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { + OnValueSegment onValueSegment = new OnValueSegment(); + onValueSegment.setTableAlias(mergedRepository.getAlias()); + onValueSegment.setColumn(valueFilterBinder.getFieldAlias()); + onValueSegment.setLiteral(CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); + onSegments.add(onValueSegment); + } + return onSegments; + } + + private List newArgSegments() { + List args = queryContext.getArgs(); + String tableAlias = mergedRepository.getAlias(); + List argSegments = new ArrayList<>(example.getCriteria().size()); + for (Criterion criterion : example.getCriteria()) { + String property = criterion.getProperty(); + String operator = CriterionUtils.getOperator(criterion); + if (Operator.IS_NULL.equals(operator) || Operator.IS_NOT_NULL.equals(operator)) { + ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, null); + argSegments.add(argSegment); + + } else { + Object value = criterion.getValue(); + args.add(CriterionUtils.format(operator, value)); + int index = args.size() - 1; + ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, "{" + index + "}"); + argSegments.add(argSegment); + } + } + return argSegments; + } + +} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java new file mode 100644 index 00000000..972845e1 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -0,0 +1,80 @@ +/* + * 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.sql.impl.segment; + +import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; +import com.gitee.dorive.sql.entity.common.SegmentInfo; +import com.gitee.dorive.sql.entity.common.SegmentUnit; +import com.gitee.dorive.sql.entity.segment.SelectSegment; +import com.gitee.dorive.sql.entity.segment.TableJoinSegment; +import com.gitee.dorive.sql.entity.segment.TableSegment; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class SelectSegmentBuilder { + + private QueryContext queryContext; + private List matchedSegmentInfos; + + public SelectSegmentBuilder(QueryContext queryContext) { + this.queryContext = queryContext; + } + + public SelectSegment build(Selector selector) { + if (selector != null) { + this.matchedSegmentInfos = new ArrayList<>(8); + } + SelectSegment selectSegment = new SelectSegment(); + for (QueryUnit queryUnit : queryContext.getQueryUnitMap().values()) { + SegmentUnit segmentUnit = (SegmentUnit) queryUnit; + MergedRepository mergedRepository = queryUnit.getMergedRepository(); + TableSegment tableSegment = segmentUnit.getTableSegment(); + + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + EntityElement entityElement = executedRepository.getEntityElement(); + + SegmentInfo segmentInfo = new SegmentInfo(tableSegment.getTableAlias(), entityElement); + boolean isMatch = selector != null && definedRepository.matches(selector); + if (isMatch) { + matchedSegmentInfos.add(segmentInfo); + } + tableSegment.setJoin(tableSegment.isJoin() || isMatch); + + if ("/".equals(absoluteAccessPath)) { + selectSegment.setTableSegment(tableSegment); + } else { + TableJoinSegment tableJoinSegment = (TableJoinSegment) tableSegment; + selectSegment.getTableJoinSegments().add(tableJoinSegment); + } + } + selectSegment.filterTableSegments(); + selectSegment.setArgs(queryContext.getArgs()); + return selectSegment; + } + +} -- Gitee From 07f4e7b187cf4af1188f1de75985bfb69458daff Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 3 Jul 2024 17:50:21 +0800 Subject: [PATCH 61/77] =?UTF-8?q?=E6=9E=81=E5=A4=A7=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/entity/MergedRepository.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index afbb9890..51c06679 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -32,22 +32,26 @@ import java.util.Set; @NoArgsConstructor @AllArgsConstructor public class MergedRepository { - + // 上一路径 private String lastAccessPath; + // 绝对路径 private String absoluteAccessPath; - private CommonRepository definedRepository; + // 血缘路径 + private Set bloodAccessPaths; // absoluteAccessPath ==> StrongBinder private Map> mergedStrongBindersMap; // absoluteAccessPath ==> ValueRouteBinder private Map> mergedValueRouteBindersMap; - // 血缘路径 - private Set bloodAccessPaths; + // 定义仓储 + private CommonRepository definedRepository; + // 执行仓储 private CommonRepository executedRepository; + // 序列号 private Integer order; + // 别名 private String alias; public String getName() { return definedRepository.getEntityElement().getEntityDef().getName(); } - } -- Gitee From 92bc4f8fb1b04b8724bd6b9c74ea50d11dcca5bd Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 3 Jul 2024 18:04:37 +0800 Subject: [PATCH 62/77] =?UTF-8?q?=E6=9E=81=E5=A4=A7=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/query/entity/MergedRepository.java | 8 ++++---- .../query/impl/resolver/MergedRepositoryResolver.java | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index 51c06679..25fe500d 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -36,14 +36,14 @@ public class MergedRepository { private String lastAccessPath; // 绝对路径 private String absoluteAccessPath; - // 血缘路径 - private Set bloodAccessPaths; + // 定义仓储 + private CommonRepository definedRepository; // absoluteAccessPath ==> StrongBinder private Map> mergedStrongBindersMap; // absoluteAccessPath ==> ValueRouteBinder private Map> mergedValueRouteBindersMap; - // 定义仓储 - private CommonRepository definedRepository; + // 血缘路径 + private Set bloodAccessPaths; // 执行仓储 private CommonRepository executedRepository; // 序列号 diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 20bb64d5..ef25e5eb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -117,6 +117,11 @@ public class MergedRepositoryResolver { mergedValueRouteBindersMap.forEach((k, v) -> newMergedValueRouteBindersMap.put(mergeAccessPath(accessPath, k), v)); newMergedRepository.setMergedValueRouteBindersMap(newMergedValueRouteBindersMap); + Set bloodAccessPaths = mergedRepository.getBloodAccessPaths(); + Set newBloodAccessPaths = new LinkedHashSet<>(bloodAccessPaths.size() * 4 / 3 + 1); + bloodAccessPaths.forEach(k -> newBloodAccessPaths.add(mergeAccessPath(accessPath, k))); + newMergedRepository.setBloodAccessPaths(newBloodAccessPaths); + newMergedRepository.setExecutedRepository(mergedRepository.getExecutedRepository()); addMergedRepository(newMergedRepository); } -- Gitee From 6e2dacc23a3c1d8accaf43ab759a826ac17d6a2d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 3 Jul 2024 18:55:07 +0800 Subject: [PATCH 63/77] =?UTF-8?q?=E8=B0=83=E6=95=B4segment=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/sql/entity/segment/ArgSegment.java | 25 ++++-------- .../sql/entity/segment/ExprSegment.java | 26 +++++++++++++ .../dorive/sql/entity/segment/OnSegment.java | 17 ++------ .../sql/entity/segment/OnValueSegment.java | 16 ++------ .../sql/entity/segment/TableJoinSegment.java | 3 +- .../sql/impl/segment/SegmentUnitResolver.java | 39 ++++++++++--------- 6 files changed, 60 insertions(+), 66 deletions(-) create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java index cb19d0d3..45e4a084 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ArgSegment.java @@ -17,26 +17,15 @@ package com.gitee.dorive.sql.entity.segment; -import com.gitee.dorive.sql.api.Segment; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data -@AllArgsConstructor -public class ArgSegment implements Segment { +@Getter +@Setter +public class ArgSegment extends ExprSegment { - private String tableAlias; - private String column; - private String operator; - private String expr; - - @Override - public String toString() { - if (expr != null) { - return tableAlias + "." + column + " " + operator + " " + expr; - } else { - return tableAlias + "." + column + " " + operator; - } + public ArgSegment(String leftExpr, String operator, String rightExpr) { + super(leftExpr, operator, rightExpr); } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java new file mode 100644 index 00000000..d0f6c360 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/ExprSegment.java @@ -0,0 +1,26 @@ +package com.gitee.dorive.sql.entity.segment; + +import com.gitee.dorive.sql.api.Segment; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class ExprSegment implements Segment { + + private String leftExpr; + private String operator; + private String rightExpr; + + @Override + public String toString() { + if (rightExpr != null) { + return leftExpr + " " + operator + " " + rightExpr; + } else { + return leftExpr + " " + operator; + } + } + +} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java index 69c19b61..defaa0c9 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnSegment.java @@ -17,26 +17,15 @@ package com.gitee.dorive.sql.entity.segment; -import com.gitee.dorive.sql.api.Segment; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -public class OnSegment implements Segment { +public class OnSegment extends ExprSegment { - private String tableAlias; - private String column; - private String joinTableAlias; - private String joinColumn; - - @Override - public String toString() { - return tableAlias + "." + column + " = " + joinTableAlias + "." + joinColumn; + public OnSegment(String leftExpr, String operator, String rightExpr) { + super(leftExpr, operator, rightExpr); } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java index d6fe2608..f5a7541b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/OnValueSegment.java @@ -17,25 +17,15 @@ package com.gitee.dorive.sql.entity.segment; -import com.gitee.dorive.sql.api.Segment; -import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -public class OnValueSegment implements Segment { +public class OnValueSegment extends OnSegment { - private String tableAlias; - private String column; - private String literal; - - @Override - public String toString() { - return tableAlias + "." + column + " = " + literal; + public OnValueSegment(String leftExpr, String operator, String rightExpr) { + super(leftExpr, operator, rightExpr); } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java index 3cddb05f..03a91693 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/TableJoinSegment.java @@ -17,7 +17,6 @@ package com.gitee.dorive.sql.entity.segment; -import com.gitee.dorive.sql.api.Segment; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -30,5 +29,5 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor public class TableJoinSegment extends TableSegment { - private List onSegments; + private List onSegments; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java index 5ee0da99..3d4c55ed 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java @@ -18,14 +18,16 @@ import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.api.Segment; import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; @Getter @Setter @@ -77,7 +79,7 @@ public class SegmentUnitResolver { return tableSegment; } - private List newOnSegments() { + private List newOnSegments() { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); @@ -90,33 +92,32 @@ public class SegmentUnitResolver { BinderResolver binderResolver = definedRepository.getBinderResolver(); List valueFilterBinders = binderResolver.getValueFilterBinders(); - List onSegments = new ArrayList<>(mergedStrongBindersMap.size() + mergedValueRouteBindersMap.size() + valueFilterBinders.size()); + List onSegments = new ArrayList<>(mergedStrongBindersMap.size() + mergedValueRouteBindersMap.size() + valueFilterBinders.size()); mergedStrongBindersMap.forEach((absoluteAccessPath, strongBinders) -> { MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); for (StrongBinder strongBinder : strongBinders) { - OnSegment onSegment = new OnSegment(); - onSegment.setTableAlias(mergedRepository.getAlias()); - onSegment.setColumn(strongBinder.getFieldAlias()); - onSegment.setJoinTableAlias(targetMergedRepository.getAlias()); - onSegment.setJoinColumn(strongBinder.getBindFieldAlias()); + String leftExpr = mergedRepository.getAlias() + "." + strongBinder.getFieldAlias(); + String operator = "="; + String rightExpr = targetMergedRepository.getAlias() + "." + strongBinder.getBindFieldAlias(); + OnSegment onSegment = new OnSegment(leftExpr, operator, rightExpr); onSegments.add(onSegment); } }); mergedValueRouteBindersMap.forEach((absoluteAccessPath, valueRouteBinders) -> { MergedRepository targetMergedRepository = mergedRepositoryMap.get(absoluteAccessPath); for (ValueRouteBinder valueRouteBinder : valueRouteBinders) { - OnValueSegment onValueSegment = new OnValueSegment(); - onValueSegment.setTableAlias(targetMergedRepository.getAlias()); - onValueSegment.setColumn(valueRouteBinder.getBindFieldAlias()); - onValueSegment.setLiteral(CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null))); + String leftExpr = targetMergedRepository.getAlias() + "." + valueRouteBinder.getBindFieldAlias(); + String operator = "="; + String rightExpr = CriterionUtils.sqlParam(valueRouteBinder.getFieldValue(context, null)); + OnValueSegment onValueSegment = new OnValueSegment(leftExpr, operator, rightExpr); onSegments.add(onValueSegment); } }); for (ValueFilterBinder valueFilterBinder : valueFilterBinders) { - OnValueSegment onValueSegment = new OnValueSegment(); - onValueSegment.setTableAlias(mergedRepository.getAlias()); - onValueSegment.setColumn(valueFilterBinder.getFieldAlias()); - onValueSegment.setLiteral(CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null))); + String leftExpr = mergedRepository.getAlias() + "." + valueFilterBinder.getFieldAlias(); + String operator = "="; + String rightExpr = CriterionUtils.sqlParam(valueFilterBinder.getBoundValue(context, null)); + OnValueSegment onValueSegment = new OnValueSegment(leftExpr, operator, rightExpr); onSegments.add(onValueSegment); } return onSegments; @@ -130,14 +131,14 @@ public class SegmentUnitResolver { String property = criterion.getProperty(); String operator = CriterionUtils.getOperator(criterion); if (Operator.IS_NULL.equals(operator) || Operator.IS_NOT_NULL.equals(operator)) { - ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, null); + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, null); argSegments.add(argSegment); } else { Object value = criterion.getValue(); args.add(CriterionUtils.format(operator, value)); int index = args.size() - 1; - ArgSegment argSegment = new ArgSegment(tableAlias, property, operator, "{" + index + "}"); + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, "{" + index + "}"); argSegments.add(argSegment); } } -- Gitee From 650d08520a767bb6eb0c152f4de5ff29106fe5de Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 09:38:22 +0800 Subject: [PATCH 64/77] =?UTF-8?q?=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/entity/MergedRepository.java | 2 +- .../gitee/dorive/query/entity/QueryUnit.java | 7 +++ .../resolver/MergedRepositoryResolver.java | 4 +- .../impl/resolver/QueryTypeResolver.java | 2 +- .../dorive/sql/entity/common/SegmentInfo.java | 29 ---------- .../dorive/sql/entity/common/SegmentUnit.java | 6 ++ .../sql/entity/segment/SelectSegment.java | 14 ----- .../impl/executor/CountSqlQueryExecutor.java | 18 +++--- .../sql/impl/executor/SqlQueryExecutor.java | 2 +- .../impl/segment/SelectSegmentBuilder.java | 58 ++++++++++--------- 10 files changed, 59 insertions(+), 83 deletions(-) delete mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index 25fe500d..c3dc0a56 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -47,7 +47,7 @@ public class MergedRepository { // 执行仓储 private CommonRepository executedRepository; // 序列号 - private Integer order; + private Integer sequence; // 别名 private String alias; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 35726e69..4ef38bc3 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -17,6 +17,7 @@ package com.gitee.dorive.query.entity; +import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.entity.executor.Example; import lombok.AllArgsConstructor; import lombok.Data; @@ -26,7 +27,13 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class QueryUnit { + protected MergedRepository mergedRepository; protected Example example; protected boolean abandoned; + + public EntityElement getEntityElement() { + return mergedRepository.getExecutedRepository().getEntityElement(); + } + } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index ef25e5eb..a6f46340 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -83,8 +83,8 @@ public class MergedRepositoryResolver { } private void addMergedRepository(MergedRepository mergedRepository) { - mergedRepository.setOrder(mergedRepositoryMap.size() + 1); - mergedRepository.setAlias("t" + mergedRepository.getOrder()); + mergedRepository.setSequence(mergedRepositoryMap.size() + 1); + mergedRepository.setAlias("t" + mergedRepository.getSequence()); String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); mergedRepositoryMap.put(absoluteAccessPath, mergedRepository); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index 6aa59491..71e25ea3 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -84,7 +84,7 @@ public class QueryTypeResolver { } } - mergedRepositories.sort(Comparator.comparing(MergedRepository::getOrder)); + mergedRepositories.sort(Comparator.comparing(MergedRepository::getSequence)); List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java deleted file mode 100644 index 00e24d8a..00000000 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentInfo.java +++ /dev/null @@ -1,29 +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.sql.entity.common; - -import com.gitee.dorive.api.entity.ele.EntityElement; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class SegmentInfo { - private String tableAlias; - private EntityElement entityElement; -} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java index e6d87da5..80c98c49 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/common/SegmentUnit.java @@ -8,5 +8,11 @@ import lombok.Setter; @Getter @Setter public class SegmentUnit extends QueryUnit { + private TableSegment tableSegment; + + public String getTableAlias() { + return tableSegment.getTableAlias(); + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java index 0296e946..05db4482 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java @@ -39,20 +39,6 @@ public class SelectSegment implements Segment { private String orderBy; private String limit; - public void filterTableSegments() { - if (tableSegment.isJoin()) { - argSegments.addAll(tableSegment.getArgSegments()); - } - List newTableJoinSegments = new ArrayList<>(tableJoinSegments.size()); - for (TableJoinSegment tableJoinSegment : tableJoinSegments) { - if (tableJoinSegment.isJoin()) { - argSegments.addAll(tableJoinSegment.getArgSegments()); - newTableJoinSegments.add(tableJoinSegment); - } - } - tableJoinSegments = newTableJoinSegments; - } - public String selectSql() { SqlBuilder sqlBuilder = SqlBuilder.create(); sqlBuilder.select(distinct, selectColumns); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java index e765dec7..e32b496a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java @@ -26,7 +26,7 @@ import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.common.CountQuery; -import com.gitee.dorive.sql.entity.common.SegmentInfo; +import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableSegment; import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; @@ -52,13 +52,14 @@ public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuer resolve(queryContext); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); - SelectSegment selectSegment = selectSegmentBuilder.build(countQuery.getSelector()); + List segmentUnits = selectSegmentBuilder.select(countQuery.getSelector()); + SelectSegment selectSegment = selectSegmentBuilder.build(); TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); String tableAlias = tableSegment.getTableAlias(); EntityElement entityElement = repository.getEntityElement(); - String countByExp = buildCountByExp(countQuery, selectSegmentBuilder, tableAlias, entityElement); + String countByExp = buildCountByExp(countQuery, segmentUnits, tableAlias, entityElement); String groupByPrefix = tableAlias + "."; List groupBy = entityElement.toAliases(countQuery.getGroupBy()); @@ -76,12 +77,11 @@ public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuer return countMap; } - private String buildCountByExp(CountQuery countQuery, SelectSegmentBuilder selectSegmentBuilder, String tableAlias, EntityElement entityElement) { - List segmentInfos = selectSegmentBuilder.getMatchedSegmentInfos(); - if (segmentInfos != null && !segmentInfos.isEmpty()) { - SegmentInfo segmentInfo = segmentInfos.get(0); - tableAlias = segmentInfo.getTableAlias(); - entityElement = segmentInfo.getEntityElement(); + private String buildCountByExp(CountQuery countQuery, List segmentUnits, String tableAlias, EntityElement entityElement) { + if (segmentUnits != null && !segmentUnits.isEmpty()) { + SegmentUnit segmentUnit = segmentUnits.get(0); + tableAlias = segmentUnit.getTableAlias(); + entityElement = segmentUnit.getEntityElement(); } String countByPrefix = tableAlias + "."; List countBy = entityElement.toAliases(countQuery.getCountBy()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 62cb33b3..f4e7225c 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -77,7 +77,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { Result emptyResult = queryContext.newEmptyResult(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); - SelectSegment selectSegment = selectSegmentBuilder.build(null); + SelectSegment selectSegment = selectSegmentBuilder.build(); TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index 972845e1..a731039e 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -17,13 +17,11 @@ package com.gitee.dorive.sql.impl.segment; -import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; -import com.gitee.dorive.sql.entity.common.SegmentInfo; import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableJoinSegment; @@ -32,48 +30,56 @@ import lombok.Data; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Data public class SelectSegmentBuilder { private QueryContext queryContext; - private List matchedSegmentInfos; public SelectSegmentBuilder(QueryContext queryContext) { this.queryContext = queryContext; } - public SelectSegment build(Selector selector) { - if (selector != null) { - this.matchedSegmentInfos = new ArrayList<>(8); - } - SelectSegment selectSegment = new SelectSegment(); - for (QueryUnit queryUnit : queryContext.getQueryUnitMap().values()) { + public List select(Selector selector) { + List segmentUnits = new ArrayList<>(4); + Map queryUnitMap = queryContext.getQueryUnitMap(); + for (QueryUnit queryUnit : queryUnitMap.values()) { SegmentUnit segmentUnit = (SegmentUnit) queryUnit; MergedRepository mergedRepository = queryUnit.getMergedRepository(); - TableSegment tableSegment = segmentUnit.getTableSegment(); - - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - EntityElement entityElement = executedRepository.getEntityElement(); - - SegmentInfo segmentInfo = new SegmentInfo(tableSegment.getTableAlias(), entityElement); - boolean isMatch = selector != null && definedRepository.matches(selector); + boolean isMatch = definedRepository.matches(selector); if (isMatch) { - matchedSegmentInfos.add(segmentInfo); + TableSegment tableSegment = segmentUnit.getTableSegment(); + tableSegment.setJoin(true); + segmentUnits.add(segmentUnit); } - tableSegment.setJoin(tableSegment.isJoin() || isMatch); + } + return segmentUnits; + } - if ("/".equals(absoluteAccessPath)) { - selectSegment.setTableSegment(tableSegment); - } else { - TableJoinSegment tableJoinSegment = (TableJoinSegment) tableSegment; - selectSegment.getTableJoinSegments().add(tableJoinSegment); - } + public SelectSegment build() { + SelectSegment selectSegment = new SelectSegment(); + + SegmentUnit segmentUnit = (SegmentUnit) queryContext.getQueryUnit(); + TableSegment tableSegment = segmentUnit.getTableSegment(); + if (tableSegment.isJoin()) { + selectSegment.setTableSegment(tableSegment); } - selectSegment.filterTableSegments(); + + Map queryUnitMap = queryContext.getQueryUnitMap(); + queryUnitMap.forEach((absoluteAccessPath, queryUnit) -> { + if (!"/".equals(absoluteAccessPath)) { + SegmentUnit subSegmentUnit = (SegmentUnit) queryUnit; + TableJoinSegment tableJoinSegment = (TableJoinSegment) subSegmentUnit.getTableSegment(); + if (tableJoinSegment.isJoin()) { + selectSegment.getTableJoinSegments().add(tableJoinSegment); + } + } + }); + selectSegment.setArgs(queryContext.getArgs()); + return selectSegment; } -- Gitee From c731beb32e2c3a3a0f0b269ce60cd917ce2711d7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 10:07:48 +0800 Subject: [PATCH 65/77] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=80=92=E5=BD=92?= =?UTF-8?q?=E4=BB=A3=E6=9B=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/entity/MergedRepository.java | 4 ++-- .../resolver/MergedRepositoryResolver.java | 21 +++++++------------ .../sql/impl/segment/SegmentUnitResolver.java | 20 +++++++++++------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index c3dc0a56..fbbb0e8c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -42,8 +42,8 @@ public class MergedRepository { private Map> mergedStrongBindersMap; // absoluteAccessPath ==> ValueRouteBinder private Map> mergedValueRouteBindersMap; - // 血缘路径 - private Set bloodAccessPaths; + // 绑定路径 + private Set boundAccessPaths; // 执行仓储 private CommonRepository executedRepository; // 序列号 diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index a6f46340..1cbce93d 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -63,15 +63,10 @@ public class MergedRepositoryResolver { mergedRepository.setMergedStrongBindersMap(new LinkedHashMap<>(binderResolver.getMergedStrongBindersMap())); mergedRepository.setMergedValueRouteBindersMap(new LinkedHashMap<>(binderResolver.getMergedValueRouteBindersMap())); - // 血缘分析 - Set bloodAccessPaths = new LinkedHashSet<>(8); - bloodAccessPaths.addAll(mergedRepository.getMergedStrongBindersMap().keySet()); - bloodAccessPaths.addAll(mergedRepository.getMergedValueRouteBindersMap().keySet()); - for (String bloodAccessPath : bloodAccessPaths) { - MergedRepository bloodMergedRepository = mergedRepositoryMap.get(bloodAccessPath); - bloodAccessPaths.addAll(bloodMergedRepository.getBloodAccessPaths()); - } - mergedRepository.setBloodAccessPaths(bloodAccessPaths); + Set boundAccessPaths = new LinkedHashSet<>(8); + boundAccessPaths.addAll(mergedRepository.getMergedStrongBindersMap().keySet()); + boundAccessPaths.addAll(mergedRepository.getMergedValueRouteBindersMap().keySet()); + mergedRepository.setBoundAccessPaths(boundAccessPaths); mergedRepository.setExecutedRepository(executedRepository); addMergedRepository(mergedRepository); @@ -117,10 +112,10 @@ public class MergedRepositoryResolver { mergedValueRouteBindersMap.forEach((k, v) -> newMergedValueRouteBindersMap.put(mergeAccessPath(accessPath, k), v)); newMergedRepository.setMergedValueRouteBindersMap(newMergedValueRouteBindersMap); - Set bloodAccessPaths = mergedRepository.getBloodAccessPaths(); - Set newBloodAccessPaths = new LinkedHashSet<>(bloodAccessPaths.size() * 4 / 3 + 1); - bloodAccessPaths.forEach(k -> newBloodAccessPaths.add(mergeAccessPath(accessPath, k))); - newMergedRepository.setBloodAccessPaths(newBloodAccessPaths); + Set boundAccessPaths = mergedRepository.getBoundAccessPaths(); + Set newBoundAccessPaths = new LinkedHashSet<>(boundAccessPaths.size() * 4 / 3 + 1); + boundAccessPaths.forEach(k -> newBoundAccessPaths.add(mergeAccessPath(accessPath, k))); + newMergedRepository.setBoundAccessPaths(newBoundAccessPaths); newMergedRepository.setExecutedRepository(mergedRepository.getExecutedRepository()); addMergedRepository(newMergedRepository); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java index 3d4c55ed..54eab82f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java @@ -66,15 +66,8 @@ public class SegmentUnitResolver { tableSegment.setTableAlias(mergedRepository.getAlias()); tableSegment.setJoin(example.isNotEmpty()); tableSegment.setArgSegments(newArgSegments()); - if (tableSegment.isJoin()) { - Map queryUnitMap = queryContext.getQueryUnitMap(); - Set bloodAccessPaths = mergedRepository.getBloodAccessPaths(); - for (String bloodAccessPath : bloodAccessPaths) { - SegmentUnit segmentUnit = (SegmentUnit) queryUnitMap.get(bloodAccessPath); - TableSegment targetTableSegment = segmentUnit.getTableSegment(); - targetTableSegment.setJoin(true); - } + setJoinForBound(mergedRepository); } return tableSegment; } @@ -145,4 +138,15 @@ public class SegmentUnitResolver { return argSegments; } + private void setJoinForBound(MergedRepository mergedRepository) { + Map queryUnitMap = queryContext.getQueryUnitMap(); + Set boundAccessPaths = mergedRepository.getBoundAccessPaths(); + for (String boundAccessPath : boundAccessPaths) { + SegmentUnit segmentUnit = (SegmentUnit) queryUnitMap.get(boundAccessPath); + TableSegment targetTableSegment = segmentUnit.getTableSegment(); + targetTableSegment.setJoin(true); + setJoinForBound(segmentUnit.getMergedRepository()); + } + } + } -- Gitee From ab1f51aba5b2254b6c7268ffe719e66940fa272c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 10:55:10 +0800 Subject: [PATCH 66/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSelectSegment=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/entity/segment/SelectSegment.java | 6 ++--- .../impl/segment/SelectSegmentBuilder.java | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java index 05db4482..5330fd1d 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/segment/SelectSegment.java @@ -32,9 +32,9 @@ public class SelectSegment implements Segment { private boolean distinct; private List selectColumns = Collections.emptyList(); private TableSegment tableSegment; - private List tableJoinSegments = new ArrayList<>(); - private List argSegments = new ArrayList<>(); - private List args = new ArrayList<>(); + private List tableJoinSegments = new ArrayList<>(6); + private List argSegments = new ArrayList<>(8); + private List args = new ArrayList<>(8); private String groupBy; private String orderBy; private String limit; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index a731039e..540f220b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -23,6 +23,7 @@ import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.sql.entity.common.SegmentUnit; +import com.gitee.dorive.sql.entity.segment.ArgSegment; import com.gitee.dorive.sql.entity.segment.SelectSegment; import com.gitee.dorive.sql.entity.segment.TableJoinSegment; import com.gitee.dorive.sql.entity.segment.TableSegment; @@ -60,24 +61,23 @@ public class SelectSegmentBuilder { public SelectSegment build() { SelectSegment selectSegment = new SelectSegment(); - - SegmentUnit segmentUnit = (SegmentUnit) queryContext.getQueryUnit(); - TableSegment tableSegment = segmentUnit.getTableSegment(); - if (tableSegment.isJoin()) { - selectSegment.setTableSegment(tableSegment); - } + List tableJoinSegments = selectSegment.getTableJoinSegments(); + List argSegments = selectSegment.getArgSegments(); Map queryUnitMap = queryContext.getQueryUnitMap(); queryUnitMap.forEach((absoluteAccessPath, queryUnit) -> { - if (!"/".equals(absoluteAccessPath)) { - SegmentUnit subSegmentUnit = (SegmentUnit) queryUnit; - TableJoinSegment tableJoinSegment = (TableJoinSegment) subSegmentUnit.getTableSegment(); - if (tableJoinSegment.isJoin()) { - selectSegment.getTableJoinSegments().add(tableJoinSegment); + SegmentUnit segmentUnit = (SegmentUnit) queryUnit; + TableSegment tableSegment = segmentUnit.getTableSegment(); + if ("/".equals(absoluteAccessPath)) { + selectSegment.setTableSegment(tableSegment); + argSegments.addAll(tableSegment.getArgSegments()); + } else { + if (tableSegment.isJoin()) { + tableJoinSegments.add((TableJoinSegment) tableSegment); + argSegments.addAll(tableSegment.getArgSegments()); } } }); - selectSegment.setArgs(queryContext.getArgs()); return selectSegment; -- Gitee From 6d4014ecf4e9fdc19d33dc4f407caa168c47ddcb Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 11:03:24 +0800 Subject: [PATCH 67/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSelectSegment=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/impl/executor/AbstractQueryExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java index 56faa5c2..ebfc8b4e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -72,7 +72,6 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { queryContext.setExample(exampleMap.get("/")); Map queryUnitMap = newQueryUnitMap(queryContext); - queryContext.setQueryUnitMap(queryUnitMap); queryContext.setQueryUnit(queryUnitMap.get("/")); } @@ -98,6 +97,7 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { List mergedRepositories = queryContext.getMergedRepositories(); Map exampleMap = queryContext.getExampleMap(); Map queryUnitMap = new LinkedHashMap<>(); + queryContext.setQueryUnitMap(queryUnitMap); for (MergedRepository mergedRepository : mergedRepositories) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); -- Gitee From e6f6baa9aae1b75db7711b26d424c367520dfccc Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 11:15:48 +0800 Subject: [PATCH 68/77] =?UTF-8?q?=E4=BC=98=E5=8C=96SelectSegment=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/query/entity/QueryUnit.java | 4 ++++ .../sql/impl/segment/SelectSegmentBuilder.java | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 4ef38bc3..dc36960d 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -32,6 +32,10 @@ public class QueryUnit { protected Example example; protected boolean abandoned; + public boolean isRoot() { + return "/".equals(mergedRepository.getAbsoluteAccessPath()); + } + public EntityElement getEntityElement() { return mergedRepository.getExecutedRepository().getEntityElement(); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index 540f220b..f876b22f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -65,19 +65,19 @@ public class SelectSegmentBuilder { List argSegments = selectSegment.getArgSegments(); Map queryUnitMap = queryContext.getQueryUnitMap(); - queryUnitMap.forEach((absoluteAccessPath, queryUnit) -> { + for (QueryUnit queryUnit : queryUnitMap.values()) { SegmentUnit segmentUnit = (SegmentUnit) queryUnit; TableSegment tableSegment = segmentUnit.getTableSegment(); - if ("/".equals(absoluteAccessPath)) { + if (segmentUnit.isRoot()) { selectSegment.setTableSegment(tableSegment); + + } else if (tableSegment.isJoin()) { + tableJoinSegments.add((TableJoinSegment) tableSegment); + } + if (tableSegment.isJoin()) { argSegments.addAll(tableSegment.getArgSegments()); - } else { - if (tableSegment.isJoin()) { - tableJoinSegments.add((TableJoinSegment) tableSegment); - argSegments.addAll(tableSegment.getArgSegments()); - } } - }); + } selectSegment.setArgs(queryContext.getArgs()); return selectSegment; -- Gitee From 89f040626e0a796a4ec86a508d9f834d0e6d20a8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 11:21:05 +0800 Subject: [PATCH 69/77] =?UTF-8?q?=E4=BC=98=E5=8C=96SelectSegment=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java index f876b22f..7974696d 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SelectSegmentBuilder.java @@ -46,11 +46,11 @@ public class SelectSegmentBuilder { List segmentUnits = new ArrayList<>(4); Map queryUnitMap = queryContext.getQueryUnitMap(); for (QueryUnit queryUnit : queryUnitMap.values()) { - SegmentUnit segmentUnit = (SegmentUnit) queryUnit; MergedRepository mergedRepository = queryUnit.getMergedRepository(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); boolean isMatch = definedRepository.matches(selector); if (isMatch) { + SegmentUnit segmentUnit = (SegmentUnit) queryUnit; TableSegment tableSegment = segmentUnit.getTableSegment(); tableSegment.setJoin(true); segmentUnits.add(segmentUnit); -- Gitee From a8a9244eae1cfa23ab5a34aeb66c710225974cae Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 4 Jul 2024 13:07:02 +0800 Subject: [PATCH 70/77] =?UTF-8?q?=E4=BC=98=E5=8C=96SelectSegment=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/sql/impl/segment/SegmentUnitResolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java index 54eab82f..4a9fe44f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java @@ -143,8 +143,8 @@ public class SegmentUnitResolver { Set boundAccessPaths = mergedRepository.getBoundAccessPaths(); for (String boundAccessPath : boundAccessPaths) { SegmentUnit segmentUnit = (SegmentUnit) queryUnitMap.get(boundAccessPath); - TableSegment targetTableSegment = segmentUnit.getTableSegment(); - targetTableSegment.setJoin(true); + TableSegment tableSegment = segmentUnit.getTableSegment(); + tableSegment.setJoin(true); setJoinForBound(segmentUnit.getMergedRepository()); } } -- Gitee From cc95d0d8814731933504192302ad2d92541314a9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 5 Jul 2024 11:01:45 +0800 Subject: [PATCH 71/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/entity/QueryUnit.java | 14 +++++++++++++ .../sql/impl/executor/SqlQueryExecutor.java | 20 +++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index dc36960d..aaddeace 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -18,11 +18,14 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.api.entity.ele.EntityElement; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Map; + @Data @NoArgsConstructor @AllArgsConstructor @@ -40,4 +43,15 @@ public class QueryUnit { return mergedRepository.getExecutedRepository().getEntityElement(); } + public String getPrimaryKey() { + return getEntityElement().getPrimaryKey(); + } + + public String getPrimaryKeyAlias() { + EntityElement entityElement = getEntityElement(); + Map attributes = entityElement.getAttributes(); + EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); + return entityStoreInfo.getIdColumn(); + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index f4e7225c..d2526a9f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -18,9 +18,7 @@ package com.gitee.dorive.sql.impl.executor; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.QueryContext; @@ -64,23 +62,23 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); - - EntityElement entityElement = repository.getEntityElement(); - Map attributes = entityElement.getAttributes(); - EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); - String idColumn = entityStoreInfo.getIdColumn(); + QueryUnit queryUnit = queryContext.getQueryUnit(); OrderBy orderBy = example.getOrderBy(); Page page = example.getPage(); + String primaryKey = queryUnit.getPrimaryKey(); + String primaryKeyAlias = queryUnit.getPrimaryKeyAlias(); boolean needCount = queryContext.isNeedCount(); Result emptyResult = queryContext.newEmptyResult(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); SelectSegment selectSegment = selectSegmentBuilder.build(); + TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); + if (!tableSegment.isJoin() || argSegments.isEmpty()) { return super.executeRootQuery(queryContext); } @@ -88,7 +86,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { String tableAlias = tableSegment.getTableAlias(); selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); - selectColumns.add(tableAlias + "." + idColumn); + selectColumns.add(tableAlias + "." + primaryKeyAlias); selectSegment.setSelectColumns(selectColumns); String selectSql = selectSegment.selectSql(); @@ -111,7 +109,7 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { boolean rebuildSql = false; if (orderBy != null) { for (String property : orderBy.getProperties()) { - if (!idColumn.equals(property)) { + if (!primaryKeyAlias.equals(property)) { selectColumns.add(tableAlias + "." + property); rebuildSql = true; } @@ -127,9 +125,9 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { String sql = selectSql + fromWhereSql + selectSegment.lastSql(); List> resultMaps = sqlRunner.selectList(sql, args.toArray()); - List primaryKeys = CollUtil.map(resultMaps, map -> map.get(idColumn), true); + List primaryKeys = CollUtil.map(resultMaps, map -> map.get(primaryKeyAlias), true); if (!primaryKeys.isEmpty()) { - Example newExample = new InnerExample().in(entityElement.getPrimaryKey(), primaryKeys); + Example newExample = new InnerExample().in(primaryKey, primaryKeys); List entities = (List) repository.selectByExample(context, newExample); if (page != null) { page.setRecords(entities); -- Gitee From 0db077755f230cf648b0ab887120e181732c3aab Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 5 Jul 2024 13:25:29 +0800 Subject: [PATCH 72/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/sql/impl/executor/SqlQueryExecutor.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index d2526a9f..854e7db7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -64,14 +64,15 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { Example example = queryContext.getExample(); QueryUnit queryUnit = queryContext.getQueryUnit(); + boolean needCount = queryContext.isNeedCount(); + Result emptyResult = queryContext.newEmptyResult(); + OrderBy orderBy = example.getOrderBy(); Page page = example.getPage(); + String primaryKey = queryUnit.getPrimaryKey(); String primaryKeyAlias = queryUnit.getPrimaryKeyAlias(); - boolean needCount = queryContext.isNeedCount(); - Result emptyResult = queryContext.newEmptyResult(); - SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); SelectSegment selectSegment = selectSegmentBuilder.build(); -- Gitee From 411b82255332bfe42ac195b41bbc444776149f6c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 5 Jul 2024 13:35:13 +0800 Subject: [PATCH 73/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java index 854e7db7..6c0f7edc 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/SqlQueryExecutor.java @@ -101,8 +101,8 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { } if (resultType == ResultType.COUNT) { return new Result<>(count); - - } else if (page != null) { + } + if (page != null) { page.setTotal(count); } } -- Gitee From b209545b52dfd5551e3f8db30e1afe4d4bc094e7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 5 Jul 2024 14:21:36 +0800 Subject: [PATCH 74/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/impl/executor/CountSqlQueryExecutor.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java index e32b496a..012006e6 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java @@ -21,6 +21,7 @@ import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; @@ -50,26 +51,27 @@ public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuer public Map selectCountMap(Context context, CountQuery countQuery) { QueryContext queryContext = new QueryContext(context, countQuery.getQuery(), ResultType.COUNT); resolve(queryContext); + QueryUnit queryUnit = queryContext.getQueryUnit(); + EntityElement entityElement = queryUnit.getEntityElement(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); List segmentUnits = selectSegmentBuilder.select(countQuery.getSelector()); SelectSegment selectSegment = selectSegmentBuilder.build(); TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); - String tableAlias = tableSegment.getTableAlias(); - EntityElement entityElement = repository.getEntityElement(); - String countByExp = buildCountByExp(countQuery, segmentUnits, tableAlias, entityElement); - String groupByPrefix = tableAlias + "."; + // group by List groupBy = entityElement.toAliases(countQuery.getGroupBy()); - String groupByColumns = CollUtil.join(groupBy, ",", groupByPrefix, null); + String groupByColumns = CollUtil.join(groupBy, ",", tableAlias + ".", null); + selectSegment.setGroupBy("GROUP BY " + groupByColumns); + // select columns + String countByExp = buildCountByExp(countQuery, segmentUnits, tableAlias, entityElement); List selectColumns = new ArrayList<>(2); selectColumns.add(groupByColumns); selectColumns.add(String.format("COUNT(%s) AS total", countByExp)); selectSegment.setSelectColumns(selectColumns); - selectSegment.setGroupBy("GROUP BY " + groupByColumns); List> resultMaps = sqlRunner.selectList(selectSegment.toString(), args.toArray()); Map countMap = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); -- Gitee From 9bf9a42cb018259cdfcc3316f673c16ead72d951 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 5 Jul 2024 14:51:48 +0800 Subject: [PATCH 75/77] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/executor/CountSqlQueryExecutor.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java index 012006e6..5971b4c7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/CountSqlQueryExecutor.java @@ -21,7 +21,6 @@ import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.ele.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.QueryContext; -import com.gitee.dorive.query.entity.QueryUnit; import com.gitee.dorive.query.entity.enums.ResultType; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.CountQuerier; @@ -29,7 +28,6 @@ import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.common.CountQuery; import com.gitee.dorive.sql.entity.common.SegmentUnit; import com.gitee.dorive.sql.entity.segment.SelectSegment; -import com.gitee.dorive.sql.entity.segment.TableSegment; import com.gitee.dorive.sql.impl.segment.SelectSegmentBuilder; import lombok.Getter; import lombok.Setter; @@ -51,23 +49,25 @@ public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuer public Map selectCountMap(Context context, CountQuery countQuery) { QueryContext queryContext = new QueryContext(context, countQuery.getQuery(), ResultType.COUNT); resolve(queryContext); - QueryUnit queryUnit = queryContext.getQueryUnit(); - EntityElement entityElement = queryUnit.getEntityElement(); + SegmentUnit segmentUnit = (SegmentUnit) queryContext.getQueryUnit(); + EntityElement entityElement = segmentUnit.getEntityElement(); + String tableAlias = segmentUnit.getTableAlias(); SelectSegmentBuilder selectSegmentBuilder = new SelectSegmentBuilder(queryContext); List segmentUnits = selectSegmentBuilder.select(countQuery.getSelector()); SelectSegment selectSegment = selectSegmentBuilder.build(); - TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); - String tableAlias = tableSegment.getTableAlias(); // group by List groupBy = entityElement.toAliases(countQuery.getGroupBy()); String groupByColumns = CollUtil.join(groupBy, ",", tableAlias + ".", null); selectSegment.setGroupBy("GROUP BY " + groupByColumns); + // count by + SegmentUnit selectSegmentUnit = segmentUnits != null && !segmentUnits.isEmpty() ? segmentUnits.get(0) : segmentUnit; + String countByExp = buildCountByExp(countQuery, selectSegmentUnit); + // select columns - String countByExp = buildCountByExp(countQuery, segmentUnits, tableAlias, entityElement); List selectColumns = new ArrayList<>(2); selectColumns.add(groupByColumns); selectColumns.add(String.format("COUNT(%s) AS total", countByExp)); @@ -79,15 +79,12 @@ public class CountSqlQueryExecutor extends SqlQueryExecutor implements CountQuer return countMap; } - private String buildCountByExp(CountQuery countQuery, List segmentUnits, String tableAlias, EntityElement entityElement) { - if (segmentUnits != null && !segmentUnits.isEmpty()) { - SegmentUnit segmentUnit = segmentUnits.get(0); - tableAlias = segmentUnit.getTableAlias(); - entityElement = segmentUnit.getEntityElement(); - } - String countByPrefix = tableAlias + "."; + private String buildCountByExp(CountQuery countQuery, SegmentUnit segmentUnit) { + EntityElement entityElement = segmentUnit.getEntityElement(); + String tableAlias = segmentUnit.getTableAlias(); + List countBy = entityElement.toAliases(countQuery.getCountBy()); - String countByStr = CollUtil.join(countBy, ",',',", countByPrefix, null); + String countByStr = CollUtil.join(countBy, ",',',", tableAlias + ".", null); StringBuilder countByExp = new StringBuilder(); if (countQuery.isDistinct()) { -- Gitee From f1da9811f68bc5713277ae5278316faf95db0784 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 8 Jul 2024 09:40:00 +0800 Subject: [PATCH 76/77] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/mybatis/plus/injector/EasySqlInjector.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java index 9941577c..1341521d 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java @@ -22,14 +22,15 @@ import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; +import org.apache.ibatis.session.Configuration; import java.util.List; public class EasySqlInjector extends DefaultSqlInjector { @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(mapperClass, tableInfo); + public List getMethodList(Configuration configuration, Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(configuration, mapperClass, tableInfo); methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); return methodList; } -- Gitee From 5b4044104b56337aea2d445ff08d871975c60b3f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 8 Jul 2024 09:53:43 +0800 Subject: [PATCH 77/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 0a90646d..72771880 100644 --- a/README.md +++ b/README.md @@ -10,19 +10,19 @@ ### 📚简介 -​ dorive是一个轻量的以领域驱动为核心的业务框架,它提供了诸多开箱即用的功能,旨在帮助开发者,在项目中快速、便捷地应用领域驱动。 +​ dorive是一个轻量的以领域驱动为核心的业务框架,它提供了诸多开箱即用的功能,旨在帮助开发者,在项目中快速、便捷地应用领域驱动。 -​ 这些功能涵盖了依赖注入校验、依赖即用配置、实体定义与映射、级联查询与操作、实体多态、实体事件通知、复杂推导查询、ref引用、复杂计数统计、表结构生成、数据库逆向生成、接口代码生成等,可以满足大部分开发场景。 +​ 这些功能涵盖了依赖注入校验、依赖即用配置、实体定义与映射、级联查询与操作、实体多态、实体事件通知、复杂推导查询、ref引用、复杂计数统计、表结构生成、数据库逆向生成、接口代码生成等,可以满足大部分开发场景。 ### 🎁名称由来 -​ dorive = domain + driven 或 do + driven ,是原公司项目沉淀后的开源库。“do”表明了一种态度,只有付诸行动,才能有所收获。 +​ dorive = domain + driven 或 do + driven ,是原公司项目沉淀后的开源库。“do”表明了一种态度,只有付诸行动,才能有所收获。 ### 🍺设计理念 -​ dorive是Mybatis-Plus的拓展,易于集成,开发者无需添加任何配置与代码。 +​ dorive是Mybatis-Plus的拓展,易于集成,开发者无需添加任何配置与代码。 -​ dorive的优势: +​ dorive的优势: - 极少的sql编写(与数据存储方式解耦) - 一次建模,任意查询(代码的通用性强,开发成本低) @@ -41,7 +41,6 @@ | dorive-inject | 实现了依赖注入校验 | | dorive-env | 实现了依赖即用配置 | | dorive-web | 提供web开发工具类 | -| dorive-proxy | 动态代理工具包 | | dorive-api | 内含实体定义规范 | | dorive-core | 核心实现(实体定义与映射、级联查询与操作、实体多态) | | dorive-event | 实现了实体事件通知 | @@ -53,13 +52,12 @@ ### 🔗依赖说明 -| 依赖库 | 版本 | 说明 | -| ------------------------- | --------------- | ------------------- | -| spring-boot-starter-web | 2.7.8(可降级) | spring-boot web集成 | -| spring-tx | 5.3.9 | spring事务管理 | -| hutool-all | 5.8.12 | 工具库 | -| javassist | 3.29.2-GA | 动态代理库 | -| mybatis-plus-boot-starter | 3.5.3.1 | 数据库操作 | +| 依赖库 | 版本 | 说明 | +| ------------------------- | ------ | ------------------- | +| spring-boot-starter-web | 2.7.18 | spring-boot web集成 | +| spring-tx | 5.3.31 | spring事务管理 | +| hutool-all | 5.8.25 | 工具库 | +| mybatis-plus-boot-starter | 3.5.7 | 数据库操作 | ### 📦安装 @@ -75,7 +73,7 @@ mvn install com.gitee.digital-engine dorive-spring-boot-starter - 3.4.3.5 + 3.5.0.2 ``` -- Gitee