From 1e53ce0e3628767005f27c1856120fdccd4139eb Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 13 Nov 2023 18:04:02 +0800 Subject: [PATCH 001/146] =?UTF-8?q?=E6=94=AF=E6=8C=81lambda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-coating/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-injection/pom.xml | 2 +- dorive-proxy/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- .../entity/executor/LambdaExample.java | 119 ++++++++++++++++++ .../entity/{ => segment}/ArgSegment.java | 2 +- .../entity/{ => segment}/JoinSegment.java | 2 +- .../entity/{ => segment}/OnSegment.java | 2 +- .../starter/entity/{ => segment}/Segment.java | 2 +- .../entity/{ => segment}/SegmentResult.java | 2 +- .../entity/{ => segment}/SelectSegment.java | 2 +- .../boot/starter/impl/CountQuerier.java | 4 +- .../boot/starter/impl/SQLExampleBuilder.java | 4 +- .../boot/starter/impl/SegmentBuilder.java | 12 +- .../spring/boot/starter/util/LambdaUtils.java | 31 +++++ dorive-web/pom.xml | 2 +- pom.xml | 2 +- 22 files changed, 177 insertions(+), 27 deletions(-) create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/ArgSegment.java (95%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/JoinSegment.java (94%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/OnSegment.java (95%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/Segment.java (95%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/SegmentResult.java (95%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ => segment}/SelectSegment.java (97%) create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index dbc29289..5812d41d 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-api diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index cd0dd2e7..f44f3104 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-coating diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 9884ef57..daa6cb88 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index a6204db1..e84f88b5 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index c2072bd2..7891017f 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-event diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index a0b77177..d62cea51 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-injection diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index c292e6c4..f60e37fb 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-proxy diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 713efc50..74c261b4 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index ec641d11..c0149844 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.1 + 3.4.3.2 dorive-spring-boot-starter diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java new file mode 100644 index 00000000..de50ae7b --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.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.spring.boot.starter.entity.executor; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.spring.boot.starter.util.LambdaUtils; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class LambdaExample extends Example { + + public LambdaExample eq(SFunction function, Object value) { + super.eq(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample ne(SFunction function, Object value) { + super.ne(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample gt(SFunction function, Object value) { + super.gt(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample ge(SFunction function, Object value) { + super.ge(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample lt(SFunction function, Object value) { + super.lt(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample le(SFunction function, Object value) { + super.le(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample in(SFunction function, Object value) { + super.in(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample notIn(SFunction function, Object value) { + super.notIn(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample like(SFunction function, Object value) { + super.like(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample notLike(SFunction function, Object value) { + super.notLike(LambdaUtils.toProperty(function), value); + return this; + } + + public LambdaExample isNull(SFunction function) { + super.isNull(LambdaUtils.toProperty(function)); + return this; + } + + public LambdaExample isNotNull(SFunction function) { + super.isNotNull(LambdaUtils.toProperty(function)); + return this; + } + + @SafeVarargs + public final LambdaExample orderByAsc(SFunction... functions) { + if (functions != null && functions.length > 0) { + List properties = new ArrayList<>(functions.length); + for (SFunction function : functions) { + properties.add(LambdaUtils.toProperty(function)); + } + super.orderByAsc(properties.toArray(new String[0])); + } + return this; + } + + @SafeVarargs + public final LambdaExample orderByDesc(SFunction... functions) { + if (functions != null && functions.length > 0) { + List properties = new ArrayList<>(functions.length); + for (SFunction function : functions) { + properties.add(LambdaUtils.toProperty(function)); + } + super.orderByDesc(properties.toArray(new String[0])); + } + return this; + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java index 5f613a35..5702cf83 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/JoinSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java similarity index 94% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/JoinSegment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java index 023c3bd7..49f0f769 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/JoinSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/OnSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/OnSegment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java index 53ff3a25..230a6aad 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/OnSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Segment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Segment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java index db497c4c..bd42df13 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Segment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import lombok.Data; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SegmentResult.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SegmentResult.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java index 231e3da7..08a0ee36 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SegmentResult.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java index 695847cf..3ac12c90 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.spring.boot.starter.entity.segment; import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index 31097b70..8748437e 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -22,8 +22,8 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; -import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; +import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; import lombok.Data; import java.util.ArrayList; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index e07c27fe..c6d86471 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -25,8 +25,8 @@ import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; +import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; import lombok.Data; import java.util.ArrayList; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index a76da67b..87837027 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -31,12 +31,12 @@ import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.api.constant.Keys; -import com.gitee.dorive.spring.boot.starter.entity.ArgSegment; -import com.gitee.dorive.spring.boot.starter.entity.JoinSegment; -import com.gitee.dorive.spring.boot.starter.entity.OnSegment; -import com.gitee.dorive.spring.boot.starter.entity.Segment; -import com.gitee.dorive.spring.boot.starter.entity.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.ArgSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.JoinSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.OnSegment; +import com.gitee.dorive.spring.boot.starter.entity.segment.Segment; +import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; +import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; import lombok.AllArgsConstructor; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java new file mode 100644 index 00000000..dbfba832 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.spring.boot.starter.util; + +import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.apache.ibatis.reflection.property.PropertyNamer; + +public class LambdaUtils { + + public static String toProperty(SFunction function) { + LambdaMeta meta = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.extract(function); + return PropertyNamer.methodToProperty(meta.getImplMethodName()); + } + +} diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index f46594f3..1bae1a02 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 dorive-web diff --git a/pom.xml b/pom.xml index 1c5b1e75..8d06a470 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.3.1 + 3.4.3.2 pom -- Gitee From a377789dab9f1f31de1f7fb6ddcd95a81ca5f0e9 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 13 Nov 2023 21:07:36 +0800 Subject: [PATCH 002/146] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/executor/LambdaExample.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java index de50ae7b..56893f48 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java @@ -25,6 +25,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @Data @@ -32,6 +33,26 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) public class LambdaExample extends Example { + private List toProperties(SFunction[] functions) { + if (functions != null && functions.length > 0) { + List properties = new ArrayList<>(functions.length); + for (SFunction function : functions) { + properties.add(LambdaUtils.toProperty(function)); + } + return properties; + } + return Collections.emptyList(); + } + + @SafeVarargs + public final LambdaExample select(SFunction... functions) { + List properties = toProperties(functions); + if (!properties.isEmpty()) { + super.select(properties); + } + return this; + } + public LambdaExample eq(SFunction function, Object value) { super.eq(LambdaUtils.toProperty(function), value); return this; @@ -94,11 +115,8 @@ public class LambdaExample extends Example { @SafeVarargs public final LambdaExample orderByAsc(SFunction... functions) { - if (functions != null && functions.length > 0) { - List properties = new ArrayList<>(functions.length); - for (SFunction function : functions) { - properties.add(LambdaUtils.toProperty(function)); - } + List properties = toProperties(functions); + if (!properties.isEmpty()) { super.orderByAsc(properties.toArray(new String[0])); } return this; @@ -106,11 +124,8 @@ public class LambdaExample extends Example { @SafeVarargs public final LambdaExample orderByDesc(SFunction... functions) { - if (functions != null && functions.length > 0) { - List properties = new ArrayList<>(functions.length); - for (SFunction function : functions) { - properties.add(LambdaUtils.toProperty(function)); - } + List properties = toProperties(functions); + if (!properties.isEmpty()) { super.orderByDesc(properties.toArray(new String[0])); } return this; -- Gitee From c2e36bfc7835af608a8508f0dd585898e8c8ac49 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 13 Nov 2023 21:25:29 +0800 Subject: [PATCH 003/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9count=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/spring/boot/starter/impl/SQLExampleBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index c6d86471..463eaa67 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -78,7 +78,7 @@ public class SQLExampleBuilder implements ExampleBuilder { if (page != null) { String countSql = selectSegment.selectSql() + fromWhereSql; - long count = SqlRunner.db().selectCount("SELECT COUNT(1) FROM (" + countSql + ") " + letter, args.toArray()); + long count = SqlRunner.db().selectCount("SELECT COUNT(*) FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); buildExample.setCountQueried(true); if (count == 0) { -- Gitee From e91cb611827a91266741c8e2c0fc1188a47118de Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 13 Nov 2023 21:33:11 +0800 Subject: [PATCH 004/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9count=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/spring/boot/starter/impl/SQLExampleBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index 463eaa67..2cddd5de 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -78,7 +78,7 @@ public class SQLExampleBuilder implements ExampleBuilder { if (page != null) { String countSql = selectSegment.selectSql() + fromWhereSql; - long count = SqlRunner.db().selectCount("SELECT COUNT(*) FROM (" + countSql + ") " + letter, args.toArray()); + long count = SqlRunner.db().selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); buildExample.setCountQueried(true); if (count == 0) { -- Gitee From f0ccfc6a9b25e71ec3502771bf16a0e17410ed71 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Nov 2023 10:30:25 +0800 Subject: [PATCH 005/146] =?UTF-8?q?=E6=96=B0=E5=A2=9E3.4.3.3=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-coating/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-injection/pom.xml | 2 +- dorive-proxy/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 5812d41d..ca9f7c8a 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-api diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index f44f3104..053c7c7a 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-coating diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index daa6cb88..23a98eb0 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index e84f88b5..16060c10 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 7891017f..226ec501 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-event diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index d62cea51..dc371ee1 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-injection diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index f60e37fb..162bdd4c 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-proxy diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 74c261b4..fae6bb5c 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index c0149844..5baa0af1 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.2 + 3.4.3.3 dorive-spring-boot-starter diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 1bae1a02..76b7c3fc 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 dorive-web diff --git a/pom.xml b/pom.xml index 8d06a470..7f145c28 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.3.2 + 3.4.3.3 pom -- Gitee From 9db2b1edc1b282eb3f9c9781cc4c27be0968eb09 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 17 Nov 2023 14:56:10 +0800 Subject: [PATCH 006/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9injection=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=90=8D=E4=B8=BAinject?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {dorive-injection => dorive-inject}/pom.xml | 2 +- .../com/gitee/dorive/inject}/annotation/Root.java | 2 +- .../dorive/inject}/api/TypeDomainResolver.java | 4 ++-- .../config/DoriveInjectionConfiguration.java | 14 +++++++------- .../dorive/inject}/entity/DomainDefinition.java | 2 +- .../inject}/impl/DefaultTypeDomainResolver.java | 8 ++++---- .../spring/LimitedAutowiredBeanPostProcessor.java | 4 ++-- ...mitedCglibSubclassingInstantiationStrategy.java | 4 ++-- .../spring/LimitedRootInitializingBean.java | 8 ++++---- .../com/gitee/dorive/inject}/util/AopUtils.java | 2 +- .../META-INF/spring-configuration-metadata.json | 2 +- .../src/main/resources/META-INF/spring.factories | 2 +- ...rk.boot.autoconfigure.AutoConfiguration.imports | 1 + ...rk.boot.autoconfigure.AutoConfiguration.imports | 1 - dorive-spring-boot-starter/pom.xml | 2 +- .../boot/starter/annotation/RootRepository.java | 2 +- pom.xml | 2 +- 17 files changed, 31 insertions(+), 31 deletions(-) rename {dorive-injection => dorive-inject}/pom.xml (95%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/annotation/Root.java (95%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/api/TypeDomainResolver.java (91%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/config/DoriveInjectionConfiguration.java (88%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/entity/DomainDefinition.java (95%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/impl/DefaultTypeDomainResolver.java (95%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/spring/LimitedAutowiredBeanPostProcessor.java (97%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/spring/LimitedCglibSubclassingInstantiationStrategy.java (96%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/spring/LimitedRootInitializingBean.java (90%) rename {dorive-injection/src/main/java/com/gitee/dorive/injection => dorive-inject/src/main/java/com/gitee/dorive/inject}/util/AopUtils.java (97%) rename {dorive-injection => dorive-inject}/src/main/resources/META-INF/spring-configuration-metadata.json (84%) rename {dorive-injection => dorive-inject}/src/main/resources/META-INF/spring.factories (50%) create mode 100644 dorive-inject/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 dorive-injection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/dorive-injection/pom.xml b/dorive-inject/pom.xml similarity index 95% rename from dorive-injection/pom.xml rename to dorive-inject/pom.xml index dc371ee1..756bed41 100644 --- a/dorive-injection/pom.xml +++ b/dorive-inject/pom.xml @@ -8,7 +8,7 @@ dorive 3.4.3.3 - dorive-injection + dorive-inject org.springframework.boot diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/annotation/Root.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java similarity index 95% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/annotation/Root.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java index f5327262..00531fef 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/annotation/Root.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/annotation/Root.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.injection.annotation; +package com.gitee.dorive.inject.annotation; import java.lang.annotation.*; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/api/TypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java similarity index 91% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/api/TypeDomainResolver.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java index d99b70b0..1ea67118 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/api/TypeDomainResolver.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/api/TypeDomainResolver.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.injection.api; +package com.gitee.dorive.inject.api; -import com.gitee.dorive.injection.entity.DomainDefinition; +import com.gitee.dorive.inject.entity.DomainDefinition; public interface TypeDomainResolver { diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/config/DoriveInjectionConfiguration.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java similarity index 88% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/config/DoriveInjectionConfiguration.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java index ae303e91..3fd6e0b8 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/config/DoriveInjectionConfiguration.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/config/DoriveInjectionConfiguration.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.injection.config; +package com.gitee.dorive.inject.config; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.injection.impl.DefaultTypeDomainResolver; -import com.gitee.dorive.injection.spring.LimitedAutowiredBeanPostProcessor; -import com.gitee.dorive.injection.spring.LimitedCglibSubclassingInstantiationStrategy; -import com.gitee.dorive.injection.spring.LimitedRootInitializingBean; -import com.gitee.dorive.injection.api.TypeDomainResolver; -import com.gitee.dorive.injection.entity.DomainDefinition; +import com.gitee.dorive.inject.impl.DefaultTypeDomainResolver; +import com.gitee.dorive.inject.spring.LimitedAutowiredBeanPostProcessor; +import com.gitee.dorive.inject.spring.LimitedCglibSubclassingInstantiationStrategy; +import com.gitee.dorive.inject.spring.LimitedRootInitializingBean; +import com.gitee.dorive.inject.api.TypeDomainResolver; +import com.gitee.dorive.inject.entity.DomainDefinition; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/entity/DomainDefinition.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java similarity index 95% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/entity/DomainDefinition.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java index 7411d586..afc5e0d1 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/entity/DomainDefinition.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/entity/DomainDefinition.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.injection.entity; +package com.gitee.dorive.inject.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/impl/DefaultTypeDomainResolver.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java similarity index 95% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/impl/DefaultTypeDomainResolver.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java index 45f867d4..39015df1 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/impl/DefaultTypeDomainResolver.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/impl/DefaultTypeDomainResolver.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.injection.impl; +package com.gitee.dorive.inject.impl; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.injection.annotation.Root; -import com.gitee.dorive.injection.api.TypeDomainResolver; -import com.gitee.dorive.injection.entity.DomainDefinition; +import com.gitee.dorive.inject.annotation.Root; +import com.gitee.dorive.inject.api.TypeDomainResolver; +import com.gitee.dorive.inject.entity.DomainDefinition; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.BeanCreationException; import org.springframework.core.annotation.AnnotationUtils; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedAutowiredBeanPostProcessor.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java similarity index 97% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedAutowiredBeanPostProcessor.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java index a9aa8989..d28be76e 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedAutowiredBeanPostProcessor.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedAutowiredBeanPostProcessor.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.injection.spring; +package com.gitee.dorive.inject.spring; -import com.gitee.dorive.injection.api.TypeDomainResolver; +import com.gitee.dorive.inject.api.TypeDomainResolver; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedCglibSubclassingInstantiationStrategy.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java similarity index 96% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedCglibSubclassingInstantiationStrategy.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java index 3b24fdf7..50bb20ec 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedCglibSubclassingInstantiationStrategy.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedCglibSubclassingInstantiationStrategy.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.injection.spring; +package com.gitee.dorive.inject.spring; -import com.gitee.dorive.injection.api.TypeDomainResolver; +import com.gitee.dorive.inject.api.TypeDomainResolver; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy; import org.springframework.beans.factory.support.RootBeanDefinition; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java similarity index 90% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java index 857f5124..be189da0 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/spring/LimitedRootInitializingBean.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/spring/LimitedRootInitializingBean.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.injection.spring; +package com.gitee.dorive.inject.spring; -import com.gitee.dorive.injection.annotation.Root; -import com.gitee.dorive.injection.api.TypeDomainResolver; -import com.gitee.dorive.injection.util.AopUtils; +import com.gitee.dorive.inject.annotation.Root; +import com.gitee.dorive.inject.api.TypeDomainResolver; +import com.gitee.dorive.inject.util.AopUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; diff --git a/dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java b/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java similarity index 97% rename from dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java rename to dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java index 0e6818e1..ba2e194b 100644 --- a/dorive-injection/src/main/java/com/gitee/dorive/injection/util/AopUtils.java +++ b/dorive-inject/src/main/java/com/gitee/dorive/inject/util/AopUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.injection.util; +package com.gitee.dorive.inject.util; import java.lang.annotation.Annotation; diff --git a/dorive-injection/src/main/resources/META-INF/spring-configuration-metadata.json b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json similarity index 84% rename from dorive-injection/src/main/resources/META-INF/spring-configuration-metadata.json rename to dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json index 27156759..b4633a74 100644 --- a/dorive-injection/src/main/resources/META-INF/spring-configuration-metadata.json +++ b/dorive-inject/src/main/resources/META-INF/spring-configuration-metadata.json @@ -12,7 +12,7 @@ }, { "name": "dorive.domains", - "type": "com.gitee.dorive.injection.entity.DomainDefinition", + "type": "com.gitee.dorive.inject.entity.DomainDefinition", "description": "Definition of domain." } ] diff --git a/dorive-injection/src/main/resources/META-INF/spring.factories b/dorive-inject/src/main/resources/META-INF/spring.factories similarity index 50% rename from dorive-injection/src/main/resources/META-INF/spring.factories rename to dorive-inject/src/main/resources/META-INF/spring.factories index 0b2fbfbe..120be675 100644 --- a/dorive-injection/src/main/resources/META-INF/spring.factories +++ b/dorive-inject/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.gitee.dorive.injection.config.DoriveInjectionConfiguration \ No newline at end of file + com.gitee.dorive.inject.config.DoriveInjectionConfiguration \ No newline at end of file diff --git a/dorive-inject/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-inject/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..72e2562d --- /dev/null +++ b/dorive-inject/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.gitee.dorive.inject.config.DoriveInjectionConfiguration \ No newline at end of file diff --git a/dorive-injection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-injection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 16035200..00000000 --- a/dorive-injection/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1 +0,0 @@ -com.gitee.dorive.injection.config.DoriveInjectionConfiguration \ No newline at end of file diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 5baa0af1..d96b1947 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -12,7 +12,7 @@ com.gitee.digital-engine - dorive-injection + dorive-inject ${project.version} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java index 5978338f..2fd88bae 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/annotation/RootRepository.java @@ -18,7 +18,7 @@ package com.gitee.dorive.spring.boot.starter.annotation; import com.gitee.dorive.api.annotation.Repository; -import com.gitee.dorive.injection.annotation.Root; +import com.gitee.dorive.inject.annotation.Root; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.Documented; diff --git a/pom.xml b/pom.xml index 7f145c28..c47529de 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ - dorive-injection + dorive-inject dorive-env dorive-web dorive-proxy -- Gitee From d895ea10b702aaa8aea366a13b35a7ed25d561e4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 17 Nov 2023 15:03:09 +0800 Subject: [PATCH 007/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9coating=E4=B8=BAquery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {dorive-coating => dorive-query}/pom.xml | 2 +- .../dorive/query}/annotation/CoatingScan.java | 2 +- .../dorive/query}/annotation/Criterion.java | 2 +- .../dorive/query}/annotation/Example.java | 2 +- .../dorive/query}/api/CoatingRepository.java | 2 +- .../dorive/query}/api/ExampleBuilder.java | 4 ++-- .../dorive/query}/entity/BuildExample.java | 2 +- .../dorive/query}/entity/CoatingCriteria.java | 2 +- .../dorive/query}/entity/CoatingField.java | 4 ++-- .../dorive/query}/entity/CoatingType.java | 6 +++--- .../query}/entity/MergedRepository.java | 2 +- .../dorive/query}/entity/SpecificFields.java | 2 +- .../query}/entity/def/CoatingScanDef.java | 4 ++-- .../query}/entity/def/CriterionDef.java | 4 ++-- .../dorive/query}/entity/def/ExampleDef.java | 4 ++-- .../query}/impl/DefaultExampleBuilder.java | 14 ++++++------- .../impl/resolver/CoatingTypeResolver.java | 20 +++++++++---------- .../resolver/MergedRepositoryResolver.java | 4 ++-- .../repository/AbstractCoatingRepository.java | 18 ++++++++--------- .../dorive/query}/util/ResourceUtils.java | 2 +- dorive-ref/pom.xml | 2 +- .../dorive/ref/api/SelectorRepository.java | 2 +- .../ref/repository/AbstractRefRepository.java | 2 +- .../boot/starter/impl/CountQuerier.java | 2 +- .../boot/starter/impl/SQLExampleBuilder.java | 6 +++--- .../boot/starter/impl/SegmentBuilder.java | 8 ++++---- .../repository/MybatisPlusRepository.java | 4 ++-- pom.xml | 2 +- 28 files changed, 65 insertions(+), 65 deletions(-) rename {dorive-coating => dorive-query}/pom.xml (94%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/annotation/CoatingScan.java (96%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/annotation/Criterion.java (96%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/annotation/Example.java (96%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/api/CoatingRepository.java (96%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/api/ExampleBuilder.java (91%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/BuildExample.java (97%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/CoatingCriteria.java (96%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/CoatingField.java (95%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/CoatingType.java (94%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/MergedRepository.java (97%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/SpecificFields.java (98%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/def/CoatingScanDef.java (93%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/def/CriterionDef.java (94%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/entity/def/ExampleDef.java (93%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/impl/DefaultExampleBuilder.java (95%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/impl/resolver/CoatingTypeResolver.java (91%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/impl/resolver/MergedRepositoryResolver.java (97%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/repository/AbstractCoatingRepository.java (88%) rename {dorive-coating/src/main/java/com/gitee/dorive/coating => dorive-query/src/main/java/com/gitee/dorive/query}/util/ResourceUtils.java (98%) diff --git a/dorive-coating/pom.xml b/dorive-query/pom.xml similarity index 94% rename from dorive-coating/pom.xml rename to dorive-query/pom.xml index 053c7c7a..032a77af 100644 --- a/dorive-coating/pom.xml +++ b/dorive-query/pom.xml @@ -8,7 +8,7 @@ dorive 3.4.3.3 - dorive-coating + dorive-query com.gitee.digital-engine diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java similarity index 96% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java rename to dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java index 8c1c8c5a..c15a6925 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/CoatingScan.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.annotation; +package com.gitee.dorive.query.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/Criterion.java similarity index 96% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java rename to dorive-query/src/main/java/com/gitee/dorive/query/annotation/Criterion.java index 7563ff99..4f182a26 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Criterion.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/Criterion.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.annotation; +package com.gitee.dorive.query.annotation; import org.springframework.core.annotation.AliasFor; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/Example.java similarity index 96% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java rename to dorive-query/src/main/java/com/gitee/dorive/query/annotation/Example.java index 4bbe1677..4ecc2b8f 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/annotation/Example.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/Example.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.annotation; +package com.gitee.dorive.query.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/CoatingRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java similarity index 96% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/api/CoatingRepository.java rename to dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java index f9fe1fe1..a531658d 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/CoatingRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.api; +package com.gitee.dorive.query.api; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.repository.ListableRepository; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java similarity index 91% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java index 350ebf72..024d4af3 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/api/ExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.coating.api; +package com.gitee.dorive.query.api; -import com.gitee.dorive.coating.entity.BuildExample; +import com.gitee.dorive.query.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; public interface ExampleBuilder { diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java similarity index 97% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java index 1f96fbc1..f4581ae0 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/BuildExample.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.InnerExample; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingCriteria.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java similarity index 96% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingCriteria.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java index 7d573b18..9791e4eb 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingCriteria.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java similarity index 95% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java index 898e8b37..90cbdacb 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingField.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.coating.entity.def.CriterionDef; +import com.gitee.dorive.query.entity.def.CriterionDef; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java similarity index 94% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java index eea73b5b..c82e42e5 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/CoatingType.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; -import com.gitee.dorive.coating.entity.def.ExampleDef; -import com.gitee.dorive.coating.entity.def.CriterionDef; +import com.gitee.dorive.query.entity.def.ExampleDef; +import com.gitee.dorive.query.entity.def.CriterionDef; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java similarity index 97% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index 05ce86d9..03eaeb72 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.repository.CommonRepository; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java similarity index 98% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java index 2e393137..f91439c2 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/SpecificFields.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity; +package com.gitee.dorive.query.entity; import cn.hutool.core.convert.Convert; import com.gitee.dorive.api.constant.Order; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java similarity index 93% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java index 05d9ff04..6bce653a 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CoatingScanDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity.def; +package com.gitee.dorive.query.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.coating.annotation.CoatingScan; +import com.gitee.dorive.query.annotation.CoatingScan; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CriterionDef.java similarity index 94% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CriterionDef.java index 220a49c0..b817be6e 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/CriterionDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CriterionDef.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity.def; +package com.gitee.dorive.query.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.coating.annotation.Criterion; +import com.gitee.dorive.query.annotation.Criterion; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/ExampleDef.java similarity index 93% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/def/ExampleDef.java index 6970a7dc..0f0ad3cc 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/entity/def/ExampleDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/ExampleDef.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.entity.def; +package com.gitee.dorive.query.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.coating.annotation.Example; +import com.gitee.dorive.query.annotation.Example; import org.springframework.core.annotation.AnnotatedElementUtils; import java.lang.reflect.AnnotatedElement; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java similarity index 95% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java index 76fb4855..d9919175 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/DefaultExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java @@ -15,15 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.coating.impl; +package com.gitee.dorive.query.impl; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.coating.api.ExampleBuilder; -import com.gitee.dorive.coating.entity.BuildExample; -import com.gitee.dorive.coating.entity.CoatingCriteria; -import com.gitee.dorive.coating.entity.CoatingType; -import com.gitee.dorive.coating.entity.MergedRepository; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.BuildExample; +import com.gitee.dorive.query.entity.CoatingCriteria; +import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.MultiInBuilder; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java similarity index 91% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java index 998cd5c1..1f1c7295 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/CoatingTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.coating.impl.resolver; +package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.coating.entity.CoatingField; -import com.gitee.dorive.coating.entity.CoatingType; -import com.gitee.dorive.coating.entity.MergedRepository; -import com.gitee.dorive.coating.entity.SpecificFields; -import com.gitee.dorive.coating.entity.def.CoatingScanDef; -import com.gitee.dorive.coating.entity.def.CriterionDef; -import com.gitee.dorive.coating.entity.def.ExampleDef; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; -import com.gitee.dorive.coating.util.ResourceUtils; +import com.gitee.dorive.query.entity.CoatingField; +import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.SpecificFields; +import com.gitee.dorive.query.entity.def.CoatingScanDef; +import com.gitee.dorive.query.entity.def.CriterionDef; +import com.gitee.dorive.query.entity.def.ExampleDef; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Data; import org.springframework.util.ReflectionUtils; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java similarity index 97% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index cc1a2287..0f380f1f 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.coating.impl.resolver; +package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.coating.entity.MergedRepository; +import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java similarity index 88% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java rename to dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java index 35818996..f5ecaa5b 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java @@ -15,18 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.coating.repository; +package com.gitee.dorive.query.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.annotation.Repository; -import com.gitee.dorive.coating.api.CoatingRepository; -import com.gitee.dorive.coating.api.ExampleBuilder; -import com.gitee.dorive.coating.entity.BuildExample; -import com.gitee.dorive.coating.entity.CoatingType; -import com.gitee.dorive.coating.entity.def.CoatingScanDef; -import com.gitee.dorive.coating.impl.DefaultExampleBuilder; -import com.gitee.dorive.coating.impl.resolver.CoatingTypeResolver; -import com.gitee.dorive.coating.impl.resolver.MergedRepositoryResolver; +import com.gitee.dorive.query.api.CoatingRepository; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.BuildExample; +import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.def.CoatingScanDef; +import com.gitee.dorive.query.impl.DefaultExampleBuilder; +import com.gitee.dorive.query.impl.resolver.CoatingTypeResolver; +import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.event.repository.AbstractEventRepository; diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/util/ResourceUtils.java b/dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java similarity index 98% rename from dorive-coating/src/main/java/com/gitee/dorive/coating/util/ResourceUtils.java rename to dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java index e9ed74cc..ca473ac4 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/util/ResourceUtils.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/util/ResourceUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.coating.util; +package com.gitee.dorive.query.util; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index fae6bb5c..28b80081 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -12,7 +12,7 @@ com.gitee.digital-engine - dorive-coating + dorive-query ${project.version} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java index c2eba9d5..0b5f3f6d 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java @@ -17,7 +17,7 @@ package com.gitee.dorive.ref.api; -import com.gitee.dorive.coating.api.CoatingRepository; +import com.gitee.dorive.query.api.CoatingRepository; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index b97108dc..056254fe 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -17,7 +17,7 @@ package com.gitee.dorive.ref.repository; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.ref.api.SelectorRepository; import com.gitee.dorive.ref.impl.RefInjector; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index 8748437e..da347e26 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -19,7 +19,7 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index 2cddd5de..1d2fc560 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -19,9 +19,9 @@ package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; -import com.gitee.dorive.coating.api.ExampleBuilder; -import com.gitee.dorive.coating.entity.BuildExample; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.BuildExample; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 87837027..1bb9f84c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -19,10 +19,10 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.coating.entity.CoatingCriteria; -import com.gitee.dorive.coating.entity.CoatingType; -import com.gitee.dorive.coating.entity.MergedRepository; -import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.entity.CoatingCriteria; +import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 400f3ad5..6c48550c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -25,8 +25,8 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.coating.api.ExampleBuilder; -import com.gitee.dorive.coating.entity.BuildExample; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; diff --git a/pom.xml b/pom.xml index c47529de..e40dd46b 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ dorive-api dorive-core dorive-event - dorive-coating + dorive-query dorive-ref dorive-spring-boot-starter -- Gitee From 056af45db06c73beb95bd4c72c2e2aa84943a239 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 17 Nov 2023 15:40:57 +0800 Subject: [PATCH 008/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9coating=E4=B8=BAquery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- .../core/api/repository/Repository.java | 2 +- .../repository/AbstractExampleRepository.java | 4 +- .../repository/AbstractGenericRepository.java | 4 +- .../repository/AbstractProxyRepository.java | 4 +- .../core/repository/AbstractRepository.java | 2 +- .../{CoatingScan.java => QueryScan.java} | 2 +- .../dorive/query/api/ExampleBuilder.java | 2 +- ...ngRepository.java => QueryRepository.java} | 6 +- ...oatingCriteria.java => QueryCriteria.java} | 2 +- .../{CoatingField.java => QueryField.java} | 4 +- .../{CoatingType.java => QueryType.java} | 22 +++--- .../dorive/query/entity/SpecificFields.java | 32 ++++----- ...{CoatingScanDef.java => QueryScanDef.java} | 10 +-- .../query/impl/DefaultExampleBuilder.java | 24 +++---- ...peResolver.java => QueryTypeResolver.java} | 70 +++++++++---------- ...tory.java => AbstractQueryRepository.java} | 46 ++++++------ .../dorive/ref/api/SelectorRepository.java | 16 ++--- .../com/gitee/dorive/ref/impl/RefImpl.java | 8 +-- .../ref/repository/AbstractRefRepository.java | 4 +- .../boot/starter/impl/CountQuerier.java | 18 ++--- .../boot/starter/impl/SQLExampleBuilder.java | 10 +-- .../boot/starter/impl/SegmentBuilder.java | 22 +++--- .../repository/MybatisPlusRepository.java | 6 +- 24 files changed, 163 insertions(+), 163 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/annotation/{CoatingScan.java => QueryScan.java} (97%) rename dorive-query/src/main/java/com/gitee/dorive/query/api/{CoatingRepository.java => QueryRepository.java} (83%) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{CoatingCriteria.java => QueryCriteria.java} (97%) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{CoatingField.java => QueryField.java} (96%) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{CoatingType.java => QueryType.java} (77%) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/def/{CoatingScanDef.java => QueryScanDef.java} (84%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/{CoatingTypeResolver.java => QueryTypeResolver.java} (67%) rename dorive-query/src/main/java/com/gitee/dorive/query/repository/{AbstractCoatingRepository.java => AbstractQueryRepository.java} (65%) diff --git a/README.md b/README.md index 95e1c071..ed00fcfb 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ com.gitee.digital-engine dorive-spring-boot-starter - 3.4.2 + 3.4.3.3 ``` @@ -93,7 +93,7 @@ public class Tenant { ```java @RootRepository -@CoatingScan("xxx.xxx.xxx.xxx.xxx.query") +@QueryScan("xxx.xxx.xxx.xxx.xxx.query") public class TenantRepository extends MybatisPlusRepository { } ``` @@ -143,7 +143,7 @@ tenantQuery.setOrder("desc"); tenantQuery.setPage(1); tenantQuery.setLimit(10); -List tenants = tenantRepository.selectByCoating(Selector.ALL, tenantQuery); +List tenants = tenantRepository.selectByQuery(Selector.ALL, tenantQuery); ``` #### 更新数据 diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java index 711fa84d..5d553011 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java @@ -65,7 +65,7 @@ public interface Repository { * @param example 条件 * @return 计数 */ - long selectCount(Context context, Example example); + long selectCountByExample(Context context, Example example); /** * 插入一个实体 diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java index 310af10f..c26c1d03 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java @@ -48,11 +48,11 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe } @Override - public long selectCount(Context context, Example example) { + public long selectCountByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { example = ExampleUtils.tryClone(example); } - return super.selectCount(context, example); + return super.selectCountByExample(context, example); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index d2feb799..03699bfc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -35,10 +35,10 @@ import java.util.List; public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @Override - public long selectCount(Context context, Example example) { + public long selectCountByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); CommonRepository repository = getRootRepository(); - return repository.selectCount(context, example); + return repository.selectCountByExample(context, example); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index b13b22a7..2243ef1a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -68,8 +68,8 @@ public abstract class AbstractProxyRepository extends AbstractRepository implements Repository, Ex } @Override - public long selectCount(Context context, Example example) { + public long selectCountByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); Query query = operationFactory.buildQueryByExample(example); return executeCount(context, query); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java similarity index 97% rename from dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java rename to dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java index c15a6925..4a3a376a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/annotation/CoatingScan.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/annotation/QueryScan.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -public @interface CoatingScan { +public @interface QueryScan { String[] value() default {}; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java index 024d4af3..4d928e10 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java @@ -22,6 +22,6 @@ import com.gitee.dorive.core.api.context.Context; public interface ExampleBuilder { - BuildExample buildExample(Context context, Object coating); + BuildExample buildExample(Context context, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java similarity index 83% rename from dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java rename to dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java index a531658d..aeae32c9 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/CoatingRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java @@ -23,10 +23,10 @@ import com.gitee.dorive.core.entity.executor.Page; import java.util.List; -public interface CoatingRepository extends ListableRepository { +public interface QueryRepository extends ListableRepository { - List selectByCoating(Context context, Object coating); + List selectByQuery(Context context, Object query); - Page selectPageByCoating(Context context, Object coating); + Page selectPageByQuery(Context context, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java similarity index 97% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java index 9791e4eb..f8e84ec7 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingCriteria.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java @@ -28,7 +28,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class CoatingCriteria { +public class QueryCriteria { private Map> criteriaMap; private OrderBy orderBy; private Page page; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryField.java similarity index 96% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryField.java index 90cbdacb..66146605 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingField.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryField.java @@ -29,7 +29,7 @@ import java.util.Collection; @Data @AllArgsConstructor -public class CoatingField { +public class QueryField { private Field field; private Class type; @@ -38,7 +38,7 @@ public class CoatingField { private String name; private CriterionDef criterionDef; - public CoatingField(Field field) { + public QueryField(Field field) { this.field = field; this.type = field.getType(); this.collection = false; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java similarity index 77% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java index c82e42e5..bff3509e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/CoatingType.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java @@ -32,27 +32,27 @@ import java.util.Map; @Data @AllArgsConstructor -public class CoatingType { +public class QueryType { private ExampleDef exampleDef; - private List coatingFields; + private List queryFields; private SpecificFields specificFields; private List mergedRepositories; private List reversedMergedRepositories; - public CoatingCriteria newCriteria(Object coating) { - Map> criteriaMap = newCriteriaMap(coating); - OrderBy orderBy = specificFields.newOrderBy(coating); - Page page = specificFields.newPage(coating); - return new CoatingCriteria(criteriaMap, orderBy, page); + public QueryCriteria newCriteria(Object query) { + Map> criteriaMap = newCriteriaMap(query); + OrderBy orderBy = specificFields.newOrderBy(query); + Page page = specificFields.newPage(query); + return new QueryCriteria(criteriaMap, orderBy, page); } - public Map> newCriteriaMap(Object coating) { + public Map> newCriteriaMap(Object query) { Map> criteriaMap = new LinkedHashMap<>(8); - for (CoatingField coatingField : coatingFields) { - Object fieldValue = coatingField.getFieldValue(coating); + for (QueryField queryField : queryFields) { + Object fieldValue = queryField.getFieldValue(query); if (fieldValue != null) { - CriterionDef criterionDef = coatingField.getCriterionDef(); + CriterionDef criterionDef = queryField.getCriterionDef(); String belongTo = criterionDef.getBelongTo(); String fieldName = criterionDef.getField(); String operator = criterionDef.getOperator(); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java index f91439c2..c77d1a5d 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/SpecificFields.java @@ -29,36 +29,36 @@ import java.util.List; @Data public class SpecificFields { - private CoatingField sortByField; - private CoatingField orderField; - private CoatingField pageField; - private CoatingField limitField; + private QueryField sortByField; + private QueryField orderField; + private QueryField pageField; + private QueryField limitField; - public boolean tryAddField(CoatingField coatingField) { - String fieldName = coatingField.getName(); + public boolean tryAddField(QueryField queryField) { + String fieldName = queryField.getName(); if ("sortBy".equals(fieldName)) { - sortByField = coatingField; + sortByField = queryField; return true; } else if ("order".equals(fieldName)) { - orderField = coatingField; + orderField = queryField; return true; } else if ("page".equals(fieldName)) { - pageField = coatingField; + pageField = queryField; return true; } else if ("limit".equals(fieldName)) { - limitField = coatingField; + limitField = queryField; return true; } return false; } - public OrderBy newOrderBy(Object coating) { + public OrderBy newOrderBy(Object query) { if (sortByField != null && orderField != null) { - Object sortBy = sortByField.getFieldValue(coating); - Object order = orderField.getFieldValue(coating); + Object sortBy = sortByField.getFieldValue(query); + Object order = orderField.getFieldValue(query); if (sortBy != null && order instanceof String) { List properties = StringUtils.toList(sortBy); if (properties != null && !properties.isEmpty()) { @@ -72,10 +72,10 @@ public class SpecificFields { return null; } - public Page newPage(Object coating) { + public Page newPage(Object query) { if (pageField != null && limitField != null) { - Object page = pageField.getFieldValue(coating); - Object limit = limitField.getFieldValue(coating); + Object page = pageField.getFieldValue(query); + Object limit = limitField.getFieldValue(query); if (page != null && limit != null) { return new Page<>(Convert.convert(Long.class, page), Convert.convert(Long.class, limit)); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java similarity index 84% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java index 6bce653a..a3838549 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/CoatingScanDef.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/def/QueryScanDef.java @@ -18,7 +18,7 @@ package com.gitee.dorive.query.entity.def; import cn.hutool.core.bean.BeanUtil; -import com.gitee.dorive.query.annotation.CoatingScan; +import com.gitee.dorive.query.annotation.QueryScan; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -30,15 +30,15 @@ import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor -public class CoatingScanDef { +public class QueryScanDef { private String[] value; private String regex; private Class[] queries; - public static CoatingScanDef fromElement(AnnotatedElement element) { - Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, CoatingScan.class); - return attributes != null ? BeanUtil.copyProperties(attributes, CoatingScanDef.class) : null; + public static QueryScanDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, QueryScan.class); + return attributes != null ? BeanUtil.copyProperties(attributes, QueryScanDef.class) : null; } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java index d9919175..ca2a30eb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java @@ -20,10 +20,10 @@ package com.gitee.dorive.query.impl; import cn.hutool.core.lang.Assert; import com.gitee.dorive.query.api.ExampleBuilder; import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.entity.CoatingCriteria; -import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.QueryCriteria; +import com.gitee.dorive.query.entity.QueryType; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.MultiInBuilder; @@ -44,22 +44,22 @@ import java.util.stream.Collectors; public class DefaultExampleBuilder implements ExampleBuilder { - private final AbstractCoatingRepository repository; + private final AbstractQueryRepository repository; - public DefaultExampleBuilder(AbstractCoatingRepository repository) { + public DefaultExampleBuilder(AbstractQueryRepository repository) { this.repository = repository; } @Override - public BuildExample buildExample(Context context, Object coating) { - CoatingType coatingType = repository.getCoatingType(coating); - CoatingCriteria coatingCriteria = coatingType.newCriteria(coating); - Map> criteriaMap = coatingCriteria.getCriteriaMap(); - OrderBy orderBy = coatingCriteria.getOrderBy(); - Page page = coatingCriteria.getPage(); + public BuildExample buildExample(Context context, Object query) { + QueryType queryType = repository.getQueryType(query); + QueryCriteria queryCriteria = queryType.newCriteria(query); + Map> criteriaMap = queryCriteria.getCriteriaMap(); + OrderBy orderBy = queryCriteria.getOrderBy(); + Page page = queryCriteria.getPage(); Map repoExampleMap = new LinkedHashMap<>(); - for (MergedRepository mergedRepository : coatingType.getReversedMergedRepositories()) { + for (MergedRepository mergedRepository : queryType.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java similarity index 67% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java index 1f1c7295..a72b3d3e 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/CoatingTypeResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryTypeResolver.java @@ -18,14 +18,14 @@ package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.query.entity.CoatingField; -import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.QueryField; +import com.gitee.dorive.query.entity.QueryType; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.SpecificFields; -import com.gitee.dorive.query.entity.def.CoatingScanDef; +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.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.query.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Data; @@ -42,24 +42,24 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; @Data -public class CoatingTypeResolver { +public class QueryTypeResolver { private static Map>> scannedClasses = new ConcurrentHashMap<>(); - private AbstractCoatingRepository repository; - private Map, CoatingType> classCoatingTypeMap = new ConcurrentHashMap<>(); - private Map nameCoatingTypeMap = new ConcurrentHashMap<>(); + private AbstractQueryRepository repository; + private Map, QueryType> classQueryTypeMap = new ConcurrentHashMap<>(); + private Map nameQueryTypeMap = new ConcurrentHashMap<>(); - public CoatingTypeResolver(AbstractCoatingRepository repository) throws Exception { + public QueryTypeResolver(AbstractQueryRepository repository) throws Exception { this.repository = repository; resolve(); } public void resolve() throws Exception { - CoatingScanDef coatingScanDef = repository.getCoatingScanDef(); - String[] scanPackages = coatingScanDef.getValue(); - String regex = coatingScanDef.getRegex(); - Class[] queries = coatingScanDef.getQueries(); + 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) { @@ -68,56 +68,56 @@ public class CoatingTypeResolver { classes = ResourceUtils.resolveClasses(scanPackage); scannedClasses.put(scanPackage, classes); } - for (Class coatingClass : classes) { - String simpleName = coatingClass.getSimpleName(); + for (Class queryClass : classes) { + String simpleName = queryClass.getSimpleName(); if (pattern.matcher(simpleName).matches()) { - resolveCoatingClass(coatingClass); + resolveQueryClass(queryClass); } } } - for (Class coatingClass : queries) { - resolveCoatingClass(coatingClass); + for (Class queryClass : queries) { + resolveQueryClass(queryClass); } } - private void resolveCoatingClass(Class coatingClass) { - ExampleDef exampleDef = ExampleDef.fromElement(coatingClass); + private void resolveQueryClass(Class queryClass) { + ExampleDef exampleDef = ExampleDef.fromElement(queryClass); if (exampleDef == null) { return; } - List coatingFields = new ArrayList<>(); + List queryFields = new ArrayList<>(); SpecificFields specificFields = new SpecificFields(); - ReflectionUtils.doWithLocalFields(coatingClass, declaredField -> { - CoatingField coatingField = new CoatingField(declaredField); - if (coatingField.isIgnore()) { + ReflectionUtils.doWithLocalFields(queryClass, declaredField -> { + QueryField queryField = new QueryField(declaredField); + if (queryField.isIgnore()) { return; } - if (!specificFields.tryAddField(coatingField)) { - coatingFields.add(coatingField); + if (!specificFields.tryAddField(queryField)) { + queryFields.add(queryField); } }); - List mergedRepositories = matchMergedRepositories(coatingFields); + List mergedRepositories = matchMergedRepositories(queryFields); List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - CoatingType coatingType = new CoatingType(exampleDef, coatingFields, specificFields, mergedRepositories, reversedMergedRepositories); - classCoatingTypeMap.put(coatingClass, coatingType); - nameCoatingTypeMap.put(coatingClass.getName(), coatingType); + QueryType queryType = new QueryType(exampleDef, queryFields, specificFields, mergedRepositories, reversedMergedRepositories); + classQueryTypeMap.put(queryClass, queryType); + nameQueryTypeMap.put(queryClass.getName(), queryType); } - private List matchMergedRepositories(List coatingFields) { + private List matchMergedRepositories(List queryFields) { MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); Map mergedRepositoryMap = mergedRepositoryResolver.getMergedRepositoryMap(); Map nameMergedRepositoryMap = mergedRepositoryResolver.getNameMergedRepositoryMap(); Set mergedRepositorySet = new LinkedHashSet<>(); - for (CoatingField coatingField : coatingFields) { - CriterionDef criterionDef = coatingField.getCriterionDef(); + for (QueryField queryField : queryFields) { + CriterionDef criterionDef = queryField.getCriterionDef(); String belongTo = criterionDef.getBelongTo(); String field = criterionDef.getField(); @@ -132,8 +132,8 @@ public class CoatingTypeResolver { CommonRepository repository = mergedRepository.getExecutedRepository(); Assert.isTrue(repository.hasField(field), - "The field of @Criterion does not exist in the entity! coating field: {}, entity: {}, field: {}", - coatingField.getField(), repository.getEntityEle().getElement(), field); + "The field of @Criterion does not exist in the entity! query field: {}, entity: {}, field: {}", + queryField.getField(), repository.getEntityEle().getElement(), field); mergedRepositorySet.add(mergedRepository); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java similarity index 65% rename from dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java rename to dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index f5ecaa5b..742d6f80 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractCoatingRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -19,13 +19,13 @@ package com.gitee.dorive.query.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.annotation.Repository; -import com.gitee.dorive.query.api.CoatingRepository; +import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.api.ExampleBuilder; import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.entity.CoatingType; -import com.gitee.dorive.query.entity.def.CoatingScanDef; +import com.gitee.dorive.query.entity.QueryType; +import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.impl.DefaultExampleBuilder; -import com.gitee.dorive.query.impl.resolver.CoatingTypeResolver; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Page; @@ -41,43 +41,43 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractCoatingRepository extends AbstractEventRepository implements ExampleBuilder, CoatingRepository { +public abstract class AbstractQueryRepository extends AbstractEventRepository implements ExampleBuilder, QueryRepository { - private CoatingScanDef coatingScanDef; + private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; - private CoatingTypeResolver coatingTypeResolver; + private QueryTypeResolver queryTypeResolver; private ExampleBuilder exampleBuilder; @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); - coatingScanDef = CoatingScanDef.fromElement(this.getClass()); - if (repository != null && coatingScanDef != null) { - if (StringUtils.isBlank(coatingScanDef.getRegex())) { - coatingScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); + queryScanDef = QueryScanDef.fromElement(this.getClass()); + if (repository != null && queryScanDef != null) { + if (StringUtils.isBlank(queryScanDef.getRegex())) { + queryScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); } mergedRepositoryResolver = new MergedRepositoryResolver(this); - coatingTypeResolver = new CoatingTypeResolver(this); + queryTypeResolver = new QueryTypeResolver(this); exampleBuilder = new DefaultExampleBuilder(this); } } - public CoatingType getCoatingType(Object coating) { - Map nameCoatingTypeMap = coatingTypeResolver.getNameCoatingTypeMap(); - CoatingType coatingType = nameCoatingTypeMap.get(coating.getClass().getName()); - Assert.notNull(coatingType, "No coating type found!"); - return coatingType; + public QueryType getQueryType(Object query) { + Map nameQueryTypeMap = queryTypeResolver.getNameQueryTypeMap(); + QueryType queryType = nameQueryTypeMap.get(query.getClass().getName()); + Assert.notNull(queryType, "No query type found!"); + return queryType; } @Override - public BuildExample buildExample(Context context, Object coating) { - return exampleBuilder.buildExample(context, coating); + public BuildExample buildExample(Context context, Object query) { + return exampleBuilder.buildExample(context, query); } @Override - public List selectByCoating(Context context, Object coating) { - BuildExample buildExample = buildExample(context, coating); + public List selectByQuery(Context context, Object query) { + BuildExample buildExample = buildExample(context, query); if (buildExample.isAbandoned()) { return Collections.emptyList(); } @@ -89,8 +89,8 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo @Override @SuppressWarnings("unchecked") - public Page selectPageByCoating(Context context, Object coating) { - BuildExample buildExample = buildExample(context, coating); + public Page selectPageByQuery(Context context, Object query) { + BuildExample buildExample = buildExample(context, query); if (buildExample.isAbandoned()) { return (Page) buildExample.getPage(); } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java index 0b5f3f6d..d7137b08 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java @@ -17,7 +17,7 @@ package com.gitee.dorive.ref.api; -import com.gitee.dorive.query.api.CoatingRepository; +import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; @@ -25,7 +25,7 @@ import com.gitee.dorive.core.entity.executor.Page; import java.util.List; -public interface SelectorRepository extends CoatingRepository { +public interface SelectorRepository extends QueryRepository { default E selectByPrimaryKey(Selector selector, PK primaryKey) { return selectByPrimaryKey(new InnerContext(selector), primaryKey); @@ -39,8 +39,8 @@ public interface SelectorRepository extends CoatingRepository { return selectPageByExample(new InnerContext(selector), example); } - default long selectCount(Selector selector, Example example) { - return selectCount(new InnerContext(selector), example); + default long selectCountByExample(Selector selector, Example example) { + return selectCountByExample(new InnerContext(selector), example); } default int insert(Selector selector, E entity) { @@ -87,12 +87,12 @@ public interface SelectorRepository extends CoatingRepository { return deleteList(new InnerContext(selector), entities); } - default List selectByCoating(Selector selector, Object coating) { - return selectByCoating(new InnerContext(selector), coating); + default List selectByQuery(Selector selector, Object query) { + return selectByQuery(new InnerContext(selector), query); } - default Page selectPageByCoating(Selector selector, Object coating) { - return selectPageByCoating(new InnerContext(selector), coating); + default Page selectPageByQuery(Selector selector, Object query) { + return selectPageByQuery(new InnerContext(selector), query); } } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java index d89e2964..43230cda 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java @@ -63,13 +63,13 @@ public class RefImpl extends AbstractProxyRepository implements Ref { } @Override - public List selectByCoating(Context context, Object coating) { - return repository.selectByCoating(context, coating); + public List selectByQuery(Context context, Object query) { + return repository.selectByQuery(context, query); } @Override - public Page selectPageByCoating(Context context, Object coating) { - return repository.selectPageByCoating(context, coating); + public Page selectPageByQuery(Context context, Object query) { + return repository.selectPageByQuery(context, query); } @Override diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index 056254fe..ee2d01de 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -17,12 +17,12 @@ package com.gitee.dorive.ref.repository; -import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.ref.api.SelectorRepository; import com.gitee.dorive.ref.impl.RefInjector; -public abstract class AbstractRefRepository extends AbstractCoatingRepository implements SelectorRepository { +public abstract class AbstractRefRepository extends AbstractQueryRepository implements SelectorRepository { @Override protected EntityHandler processEntityHandler(EntityHandler entityHandler) { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index da347e26..74d213c8 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -19,7 +19,7 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; @@ -34,16 +34,16 @@ import java.util.Map; @Data public class CountQuerier { - private final AbstractCoatingRepository repository; + private final AbstractQueryRepository repository; private final SegmentBuilder segmentBuilder; - public CountQuerier(AbstractCoatingRepository repository) { + public CountQuerier(AbstractQueryRepository repository) { this.repository = repository; this.segmentBuilder = new SegmentBuilder(repository); } - public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object coating) { - SegmentResult segmentResult = segmentBuilder.buildSegment(context, coating); + public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { + SegmentResult segmentResult = segmentBuilder.buildSegment(context, query); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); @@ -71,12 +71,12 @@ public class CountQuerier { return countMap; } - public Map selectCount(Context context, String groupField, String countField, Object coating) { - return selectCount(context, groupField, true, countField, coating); + public Map selectCount(Context context, String groupField, String countField, Object query) { + return selectCount(context, groupField, true, countField, query); } - public Map selectCount(String groupField, String countField, Object coating) { - return selectCount(new BoundedContext(), groupField, true, countField, coating); + public Map selectCount(String groupField, String countField, Object query) { + return selectCount(new BoundedContext(), groupField, true, countField, query); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index 1d2fc560..3ce5fc22 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -21,7 +21,7 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.query.api.ExampleBuilder; import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; @@ -36,17 +36,17 @@ import java.util.Map; @Data public class SQLExampleBuilder implements ExampleBuilder { - private final AbstractCoatingRepository repository; + private final AbstractQueryRepository repository; private final SegmentBuilder segmentBuilder; - public SQLExampleBuilder(AbstractCoatingRepository repository) { + public SQLExampleBuilder(AbstractQueryRepository repository) { this.repository = repository; this.segmentBuilder = new SegmentBuilder(repository); } @Override - public BuildExample buildExample(Context context, Object coating) { - SegmentResult segmentResult = segmentBuilder.buildSegment(context, coating); + public BuildExample buildExample(Context context, Object query) { + SegmentResult segmentResult = segmentBuilder.buildSegment(context, query); char letter = segmentResult.getLetter(); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 1bb9f84c..8b12f04e 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -19,10 +19,10 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.query.entity.CoatingCriteria; -import com.gitee.dorive.query.entity.CoatingType; +import com.gitee.dorive.query.entity.QueryCriteria; +import com.gitee.dorive.query.entity.QueryType; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.repository.AbstractCoatingRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -52,16 +52,16 @@ import java.util.Map; @AllArgsConstructor public class SegmentBuilder { - private final AbstractCoatingRepository repository; + private final AbstractQueryRepository repository; - public SegmentResult buildSegment(Context context, Object coating) { - CoatingType coatingType = repository.getCoatingType(coating); - CoatingCriteria coatingCriteria = coatingType.newCriteria(coating); - Map> criteriaMap = coatingCriteria.getCriteriaMap(); - OrderBy orderBy = coatingCriteria.getOrderBy(); - Page page = coatingCriteria.getPage(); + public SegmentResult buildSegment(Context context, Object query) { + QueryType queryType = repository.getQueryType(query); + QueryCriteria queryCriteria = queryType.newCriteria(query); + Map> criteriaMap = queryCriteria.getCriteriaMap(); + OrderBy orderBy = queryCriteria.getOrderBy(); + Page page = queryCriteria.getPage(); - List mergedRepositories = coatingType.getMergedRepositories(); + List mergedRepositories = queryType.getMergedRepositories(); Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); char letter = 'a'; SelectSegment selectSegment = null; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 6c48550c..1f6cb38c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -149,13 +149,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - public BuildExample buildExample(Context context, Object coating) { + public BuildExample buildExample(Context context, Object query) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { - return sqlExampleBuilder.buildExample(context, coating); + return sqlExampleBuilder.buildExample(context, query); } else { - return getExampleBuilder().buildExample(context, coating); + return getExampleBuilder().buildExample(context, query); } } -- Gitee From 881f2ad0fc7bceb3260c60ebb35be1c44f878dd9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 17 Nov 2023 18:15:11 +0800 Subject: [PATCH 009/146] =?UTF-8?q?=E5=B0=86query=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=B8=8A=E6=8F=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/{QueryCriteria.java => Query.java} | 5 +++- .../query/impl/DefaultExampleBuilder.java | 29 +++++++++---------- .../resolver/QueryResolver.java} | 14 +++++---- .../impl/resolver/QueryTypeResolver.java | 11 ++++--- .../repository/AbstractQueryRepository.java | 21 ++++++++------ .../boot/starter/impl/SegmentBuilder.java | 16 +++++----- .../repository/MybatisPlusRepository.java | 11 ++++--- 7 files changed, 56 insertions(+), 51 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{QueryCriteria.java => Query.java} (89%) rename dorive-query/src/main/java/com/gitee/dorive/query/{entity/QueryType.java => impl/resolver/QueryResolver.java} (84%) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java similarity index 89% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java index f8e84ec7..538ef9e1 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCriteria.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java @@ -20,6 +20,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; @@ -28,7 +29,9 @@ import java.util.Map; @Data @AllArgsConstructor -public class QueryCriteria { +public class Query { + private QueryResolver queryResolver; + private Object query; private Map> criteriaMap; private OrderBy orderBy; private Page page; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java index ca2a30eb..dac57449 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java @@ -18,20 +18,18 @@ package com.gitee.dorive.query.impl; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.entity.QueryCriteria; -import com.gitee.dorive.query.entity.QueryType; -import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.MultiInBuilder; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.BuildExample; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -52,14 +50,12 @@ public class DefaultExampleBuilder implements ExampleBuilder { @Override public BuildExample buildExample(Context context, Object query) { - QueryType queryType = repository.getQueryType(query); - QueryCriteria queryCriteria = queryType.newCriteria(query); - Map> criteriaMap = queryCriteria.getCriteriaMap(); - OrderBy orderBy = queryCriteria.getOrderBy(); - Page page = queryCriteria.getPage(); + Query newQuery = (Query) query; + QueryResolver queryResolver = newQuery.getQueryResolver(); + Map> criteriaMap = newQuery.getCriteriaMap(); Map repoExampleMap = new LinkedHashMap<>(); - for (MergedRepository mergedRepository : queryType.getReversedMergedRepositories()) { + for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); @@ -73,8 +69,9 @@ public class DefaultExampleBuilder implements ExampleBuilder { Assert.notNull(repoExample, "The criterion cannot be null!"); BuildExample buildExample = repoExample.getBuildExample(); - buildExample.setOrderBy(orderBy); - buildExample.setPage(page); + buildExample.setOrderBy(newQuery.getOrderBy()); + buildExample.setPage(newQuery.getPage()); + return buildExample; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java similarity index 84% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java index bff3509e..8acf9420 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryType.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java @@ -15,8 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.query.entity; +package com.gitee.dorive.query.impl.resolver; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.entity.QueryField; +import com.gitee.dorive.query.entity.SpecificFields; import com.gitee.dorive.query.entity.def.ExampleDef; import com.gitee.dorive.query.entity.def.CriterionDef; import com.gitee.dorive.core.entity.executor.Criterion; @@ -32,7 +36,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class QueryType { +public class QueryResolver { private ExampleDef exampleDef; private List queryFields; @@ -40,14 +44,14 @@ public class QueryType { private List mergedRepositories; private List reversedMergedRepositories; - public QueryCriteria newCriteria(Object query) { + public Query resolve(Object query) { Map> criteriaMap = newCriteriaMap(query); OrderBy orderBy = specificFields.newOrderBy(query); Page page = specificFields.newPage(query); - return new QueryCriteria(criteriaMap, orderBy, page); + return new Query(this, query, criteriaMap, orderBy, page); } - public Map> newCriteriaMap(Object query) { + private Map> newCriteriaMap(Object query) { Map> criteriaMap = new LinkedHashMap<>(8); for (QueryField queryField : queryFields) { Object fieldValue = queryField.getFieldValue(query); 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 a72b3d3e..f2e22a19 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 @@ -19,7 +19,6 @@ package com.gitee.dorive.query.impl.resolver; import cn.hutool.core.lang.Assert; import com.gitee.dorive.query.entity.QueryField; -import com.gitee.dorive.query.entity.QueryType; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.SpecificFields; import com.gitee.dorive.query.entity.def.QueryScanDef; @@ -47,8 +46,8 @@ public class QueryTypeResolver { private static Map>> scannedClasses = new ConcurrentHashMap<>(); private AbstractQueryRepository repository; - private Map, QueryType> classQueryTypeMap = new ConcurrentHashMap<>(); - private Map nameQueryTypeMap = new ConcurrentHashMap<>(); + private Map, QueryResolver> classQueryResolverMap = new ConcurrentHashMap<>(); + private Map nameQueryResolverMap = new ConcurrentHashMap<>(); public QueryTypeResolver(AbstractQueryRepository repository) throws Exception { this.repository = repository; @@ -104,9 +103,9 @@ public class QueryTypeResolver { List reversedMergedRepositories = new ArrayList<>(mergedRepositories); Collections.reverse(reversedMergedRepositories); - QueryType queryType = new QueryType(exampleDef, queryFields, specificFields, mergedRepositories, reversedMergedRepositories); - classQueryTypeMap.put(queryClass, queryType); - nameQueryTypeMap.put(queryClass.getName(), queryType); + 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 742d6f80..84e29766 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 @@ -22,7 +22,8 @@ import com.gitee.dorive.api.annotation.Repository; import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.api.ExampleBuilder; import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.entity.QueryType; +import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.impl.DefaultExampleBuilder; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; @@ -63,16 +64,18 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } } - public QueryType getQueryType(Object query) { - Map nameQueryTypeMap = queryTypeResolver.getNameQueryTypeMap(); - QueryType queryType = nameQueryTypeMap.get(query.getClass().getName()); - Assert.notNull(queryType, "No query type found!"); - return queryType; - } - @Override public BuildExample buildExample(Context context, Object query) { - return exampleBuilder.buildExample(context, query); + Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); + QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); + Assert.notNull(queryResolver, "No query resolver found!"); + Query newQuery = queryResolver.resolve(query); + ExampleBuilder exampleBuilder = adaptiveExampleBuilder(context, newQuery); + return exampleBuilder.buildExample(context, newQuery); + } + + protected ExampleBuilder adaptiveExampleBuilder(Context context, Query query) { + return exampleBuilder; } @Override diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 8b12f04e..563a2388 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -19,8 +19,8 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.query.entity.QueryCriteria; -import com.gitee.dorive.query.entity.QueryType; +import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; @@ -55,13 +55,13 @@ public class SegmentBuilder { private final AbstractQueryRepository repository; public SegmentResult buildSegment(Context context, Object query) { - QueryType queryType = repository.getQueryType(query); - QueryCriteria queryCriteria = queryType.newCriteria(query); - Map> criteriaMap = queryCriteria.getCriteriaMap(); - OrderBy orderBy = queryCriteria.getOrderBy(); - Page page = queryCriteria.getPage(); + Query newQuery = (Query) query; + QueryResolver queryResolver = newQuery.getQueryResolver(); + Map> criteriaMap = newQuery.getCriteriaMap(); + OrderBy orderBy = newQuery.getOrderBy(); + Page page = newQuery.getPage(); - List mergedRepositories = queryType.getMergedRepositories(); + List mergedRepositories = queryResolver.getMergedRepositories(); Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); char letter = 'a'; SelectSegment selectSegment = null; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 1f6cb38c..6d61bc17 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -25,14 +25,14 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; +import com.gitee.dorive.query.api.ExampleBuilder; +import com.gitee.dorive.query.entity.Query; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; import com.gitee.dorive.spring.boot.starter.impl.SQLExampleBuilder; @@ -149,14 +149,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - public BuildExample buildExample(Context context, Object query) { + protected ExampleBuilder adaptiveExampleBuilder(Context context, Query query) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { - return sqlExampleBuilder.buildExample(context, query); - } else { - return getExampleBuilder().buildExample(context, query); + return sqlExampleBuilder; } + return super.adaptiveExampleBuilder(context, query); } } -- Gitee From cd25ed6cb3be6f615b9379f3054263ca02a5decb Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 16:39:27 +0800 Subject: [PATCH 010/146] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...{ExampleBuilder.java => QueryBuilder.java} | 6 +- .../dorive/query/entity/BuildExample.java | 44 ----------- .../entity/{Query.java => QueryCtx.java} | 10 +-- ...eBuilder.java => DefaultQueryBuilder.java} | 73 ++++++++----------- .../query/impl/resolver/QueryResolver.java | 23 +++--- .../repository/AbstractQueryRepository.java | 68 +++++++++-------- .../starter/entity/segment/SegmentResult.java | 4 - .../boot/starter/impl/CountQuerier.java | 7 +- .../boot/starter/impl/SegmentBuilder.java | 45 ++++-------- ...ampleBuilder.java => SqlQueryBuilder.java} | 49 ++++++------- .../repository/MybatisPlusRepository.java | 16 ++-- 11 files changed, 133 insertions(+), 212 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/api/{ExampleBuilder.java => QueryBuilder.java} (85%) delete mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{Query.java => QueryCtx.java} (86%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/{DefaultExampleBuilder.java => DefaultQueryBuilder.java} (73%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/{SQLExampleBuilder.java => SqlQueryBuilder.java} (72%) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java similarity index 85% rename from dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java index 4d928e10..07030b99 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/ExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java @@ -17,11 +17,11 @@ package com.gitee.dorive.query.api; -import com.gitee.dorive.query.entity.BuildExample; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.query.entity.QueryCtx; -public interface ExampleBuilder { +public interface QueryBuilder { - BuildExample buildExample(Context context, Object query); + QueryCtx build(Context context, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java deleted file mode 100644 index f4581ae0..00000000 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildExample.java +++ /dev/null @@ -1,44 +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.entity; - -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.InnerExample; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class BuildExample extends InnerExample { - - private boolean abandoned = false; - private boolean countQueried = false; - - public BuildExample(List criteria) { - super(criteria); - } - - public boolean isQueryAll() { - return !abandoned && isEmpty(); - } - -} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java similarity index 86% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java index 538ef9e1..ad842411 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/Query.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java @@ -18,8 +18,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; @@ -29,10 +28,11 @@ import java.util.Map; @Data @AllArgsConstructor -public class Query { +public class QueryCtx { private QueryResolver queryResolver; private Object query; private Map> criteriaMap; - private OrderBy orderBy; - private Page page; + private Example example; + private boolean abandoned; + private boolean countQueried; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java similarity index 73% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index dac57449..18938368 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultExampleBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -17,62 +17,46 @@ package com.gitee.dorive.query.impl; -import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.BuildExample; +import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.entity.QueryCtx; 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; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; -public class DefaultExampleBuilder implements ExampleBuilder { - - private final AbstractQueryRepository repository; - - public DefaultExampleBuilder(AbstractQueryRepository repository) { - this.repository = repository; - } +public class DefaultQueryBuilder implements QueryBuilder { @Override - public BuildExample buildExample(Context context, Object query) { - Query newQuery = (Query) query; - QueryResolver queryResolver = newQuery.getQueryResolver(); - Map> criteriaMap = newQuery.getCriteriaMap(); + public QueryCtx build(Context context, Object query) { + QueryCtx queryCtx = (QueryCtx) query; + QueryResolver queryResolver = queryCtx.getQueryResolver(); + Map> criteriaMap = queryCtx.getCriteriaMap(); Map repoExampleMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); - BuildExample buildExample = new BuildExample(criteria); - repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, buildExample)); + Example example = new InnerExample(criteria); + repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, example, false)); } - executeQuery(context, repoExampleMap); RepoExample repoExample = repoExampleMap.get("/"); - Assert.notNull(repoExample, "The criterion cannot be null!"); - - BuildExample buildExample = repoExample.getBuildExample(); - buildExample.setOrderBy(newQuery.getOrderBy()); - buildExample.setPage(newQuery.getPage()); - - return buildExample; + queryCtx.getExample().setCriteria(repoExample.getExample().getCriteria()); + queryCtx.setAbandoned(repoExample.isAbandoned()); + return queryCtx; } private void executeQuery(Context context, Map repoExampleMap) { @@ -80,7 +64,8 @@ public class DefaultExampleBuilder implements ExampleBuilder { if ("/".equals(accessPath)) return; MergedRepository mergedRepository = repoExample.getMergedRepository(); - BuildExample buildExample = repoExample.getBuildExample(); + Example example = repoExample.getExample(); + boolean abandoned = repoExample.isAbandoned(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedBindersMap = mergedRepository.getMergedBindersMap(); @@ -91,22 +76,21 @@ public class DefaultExampleBuilder implements ExampleBuilder { for (String relativeAccessPath : mergedBindersMap.keySet()) { RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); if (targetRepoExample != null) { - BuildExample targetExample = targetRepoExample.getBuildExample(); - if (targetExample.isAbandoned()) { - buildExample.setAbandoned(true); + if (targetRepoExample.isAbandoned()) { + abandoned = true; break; } } } - if (buildExample.isQueryAll()) { + if (!abandoned && example.isEmpty()) { return; } List entities = Collections.emptyList(); - if (!buildExample.isAbandoned() && buildExample.isNotEmpty()) { - buildExample.select(binderResolver.getSelfFields()); - entities = executedRepository.selectByExample(context, buildExample); + if (!abandoned && example.isNotEmpty()) { + example.select(binderResolver.getSelfFields()); + entities = executedRepository.selectByExample(context, example); } for (Map.Entry> entry : mergedBindersMap.entrySet()) { @@ -114,11 +98,11 @@ public class DefaultExampleBuilder implements ExampleBuilder { List binders = entry.getValue(); RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); if (targetRepoExample != null) { - BuildExample targetExample = targetRepoExample.getBuildExample(); if (entities.isEmpty()) { - targetExample.setAbandoned(true); + targetRepoExample.setAbandoned(true); return; } + Example targetExample = targetRepoExample.getExample(); if (binders.size() == 1) { PropertyBinder binder = binders.get(0); List fieldValues = binder.collectFieldValues(context, entities); @@ -130,7 +114,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { targetExample.in(boundName, fieldValues); } } else { - targetExample.setAbandoned(true); + targetRepoExample.setAbandoned(true); } } else { @@ -140,7 +124,7 @@ public class DefaultExampleBuilder implements ExampleBuilder { if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.build()); } else { - targetExample.setAbandoned(true); + targetRepoExample.setAbandoned(true); } } } @@ -167,7 +151,8 @@ public class DefaultExampleBuilder implements ExampleBuilder { @AllArgsConstructor public static class RepoExample { private MergedRepository mergedRepository; - private BuildExample buildExample; + private Example example; + private boolean abandoned; } } 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 8acf9420..97eda949 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 @@ -17,22 +17,17 @@ package com.gitee.dorive.query.impl.resolver; +import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.entity.QueryCtx; import com.gitee.dorive.query.entity.QueryField; import com.gitee.dorive.query.entity.SpecificFields; import com.gitee.dorive.query.entity.def.ExampleDef; import com.gitee.dorive.query.entity.def.CriterionDef; -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data @AllArgsConstructor @@ -44,11 +39,15 @@ public class QueryResolver { private List mergedRepositories; private List reversedMergedRepositories; - public Query resolve(Object query) { + public QueryCtx newQuery(Object query) { Map> criteriaMap = newCriteriaMap(query); - OrderBy orderBy = specificFields.newOrderBy(query); - Page page = specificFields.newPage(query); - return new Query(this, query, criteriaMap, orderBy, page); + + Example example = new InnerExample(); + example.setCriteria(criteriaMap.computeIfAbsent("/", key -> new ArrayList<>(4))); + example.setOrderBy(specificFields.newOrderBy(query)); + example.setPage(specificFields.newPage(query)); + + return new QueryCtx(this, query, criteriaMap, example, false, false); } private Map> newCriteriaMap(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 84e29766..49de6d83 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,18 +19,18 @@ package com.gitee.dorive.query.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.annotation.Repository; -import com.gitee.dorive.query.api.QueryRepository; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.entity.Query; -import com.gitee.dorive.query.impl.resolver.QueryResolver; -import com.gitee.dorive.query.entity.def.QueryScanDef; -import com.gitee.dorive.query.impl.DefaultExampleBuilder; -import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.event.repository.AbstractEventRepository; +import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.api.QueryRepository; +import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.def.QueryScanDef; +import com.gitee.dorive.query.impl.DefaultQueryBuilder; +import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; +import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; @@ -42,12 +42,12 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractQueryRepository extends AbstractEventRepository implements ExampleBuilder, QueryRepository { +public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryBuilder, QueryRepository { private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private QueryTypeResolver queryTypeResolver; - private ExampleBuilder exampleBuilder; + private QueryBuilder queryBuilder; @Override public void afterPropertiesSet() throws Exception { @@ -60,51 +60,57 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } mergedRepositoryResolver = new MergedRepositoryResolver(this); queryTypeResolver = new QueryTypeResolver(this); - exampleBuilder = new DefaultExampleBuilder(this); + queryBuilder = new DefaultQueryBuilder(); } } @Override - public BuildExample buildExample(Context context, Object query) { + public QueryCtx build(Context context, Object query) { + QueryCtx queryCtx = newQuery(query); + QueryBuilder queryBuilder = adaptiveBuilder(context, queryCtx); + return queryBuilder.build(context, queryCtx); + } + + public QueryCtx newQuery(Object query) { Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); Assert.notNull(queryResolver, "No query resolver found!"); - Query newQuery = queryResolver.resolve(query); - ExampleBuilder exampleBuilder = adaptiveExampleBuilder(context, newQuery); - return exampleBuilder.buildExample(context, newQuery); + return queryResolver.newQuery(query); } - protected ExampleBuilder adaptiveExampleBuilder(Context context, Query query) { - return exampleBuilder; + protected QueryBuilder adaptiveBuilder(Context context, QueryCtx queryCtx) { + return queryBuilder; } @Override public List selectByQuery(Context context, Object query) { - BuildExample buildExample = buildExample(context, query); - if (buildExample.isAbandoned()) { + QueryCtx queryCtx = build(context, query); + Example example = queryCtx.getExample(); + if (queryCtx.isAbandoned()) { return Collections.emptyList(); } - if (buildExample.isCountQueried()) { - buildExample.setPage(null); + if (queryCtx.isCountQueried()) { + example.setPage(null); } - return selectByExample(context, buildExample); + return selectByExample(context, example); } @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { - BuildExample buildExample = buildExample(context, query); - if (buildExample.isAbandoned()) { - return (Page) buildExample.getPage(); + QueryCtx queryCtx = build(context, query); + Example example = queryCtx.getExample(); + if (queryCtx.isAbandoned()) { + return (Page) example.getPage(); } - if (buildExample.isCountQueried()) { - Page page = buildExample.getPage(); - buildExample.setPage(null); - List records = selectByExample(context, buildExample); + if (queryCtx.isCountQueried()) { + Page page = example.getPage(); + example.setPage(null); + List records = selectByExample(context, example); page.setRecords((List) records); return (Page) page; } - return selectPageByExample(context, buildExample); + return selectPageByExample(context, example); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java index 08a0ee36..56924f2f 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java @@ -17,8 +17,6 @@ package com.gitee.dorive.spring.boot.starter.entity.segment; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; import lombok.AllArgsConstructor; import lombok.Data; @@ -30,6 +28,4 @@ public class SegmentResult { private char letter; private SelectSegment selectSegment; private List args; - private OrderBy orderBy; - private Page page; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index 74d213c8..68e8d26f 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -19,6 +19,7 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.query.entity.QueryCtx; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; @@ -39,11 +40,13 @@ public class CountQuerier { public CountQuerier(AbstractQueryRepository repository) { this.repository = repository; - this.segmentBuilder = new SegmentBuilder(repository); + this.segmentBuilder = new SegmentBuilder(); } public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { - SegmentResult segmentResult = segmentBuilder.buildSegment(context, query); + QueryCtx queryCtx = repository.newQuery(query); + + SegmentResult segmentResult = segmentBuilder.buildSegment(context, queryCtx); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 563a2388..a602e0d0 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -18,48 +18,31 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.query.entity.Query; -import com.gitee.dorive.query.impl.resolver.QueryResolver; -import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.impl.binder.PropertyBinder; +import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.api.constant.Keys; -import com.gitee.dorive.spring.boot.starter.entity.segment.ArgSegment; -import com.gitee.dorive.spring.boot.starter.entity.segment.JoinSegment; -import com.gitee.dorive.spring.boot.starter.entity.segment.OnSegment; -import com.gitee.dorive.spring.boot.starter.entity.segment.Segment; -import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; -import com.gitee.dorive.core.impl.executor.FieldExecutor; +import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.spring.boot.starter.entity.segment.*; import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; -import lombok.AllArgsConstructor; import lombok.Data; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Data -@AllArgsConstructor public class SegmentBuilder { - private final AbstractQueryRepository repository; - - public SegmentResult buildSegment(Context context, Object query) { - Query newQuery = (Query) query; - QueryResolver queryResolver = newQuery.getQueryResolver(); - Map> criteriaMap = newQuery.getCriteriaMap(); - OrderBy orderBy = newQuery.getOrderBy(); - Page page = newQuery.getPage(); + public SegmentResult buildSegment(Context context, QueryCtx queryCtx) { + QueryResolver queryResolver = queryCtx.getQueryResolver(); + Map> criteriaMap = queryCtx.getCriteriaMap(); + Example example = queryCtx.getExample(); List mergedRepositories = queryResolver.getMergedRepositories(); Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); @@ -102,7 +85,7 @@ public class SegmentBuilder { selectSegment.setArgSegments(argSegments); segmentMap.put(relativeAccessPath, selectSegment); - fieldExecutor.convertOrderBy(orderBy); + fieldExecutor.convertOrderBy(example.getOrderBy()); } else { JoinSegment joinSegment = new JoinSegment(); @@ -128,7 +111,7 @@ public class SegmentBuilder { markReachableAndDirty(selectSegment); } - return new SegmentResult(letter, selectSegment, args, orderBy, page); + return new SegmentResult(letter, selectSegment, args); } private void appendArguments(List argSegments, diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java similarity index 72% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java index 3ce5fc22..1eca104c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java @@ -19,12 +19,12 @@ package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.BuildExample; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.entity.QueryCtx; import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; import lombok.Data; @@ -34,37 +34,30 @@ import java.util.List; import java.util.Map; @Data -public class SQLExampleBuilder implements ExampleBuilder { +public class SqlQueryBuilder implements QueryBuilder { - private final AbstractQueryRepository repository; - private final SegmentBuilder segmentBuilder; - - public SQLExampleBuilder(AbstractQueryRepository repository) { - this.repository = repository; - this.segmentBuilder = new SegmentBuilder(repository); - } + private SegmentBuilder segmentBuilder = new SegmentBuilder(); @Override - public BuildExample buildExample(Context context, Object query) { - SegmentResult segmentResult = segmentBuilder.buildSegment(context, query); + public QueryCtx build(Context context, Object query) { + QueryCtx queryCtx = (QueryCtx) query; + Example example = queryCtx.getExample(); + OrderBy orderBy = example.getOrderBy(); + Page page = example.getPage(); + + SegmentResult segmentResult = segmentBuilder.buildSegment(context, queryCtx); char letter = segmentResult.getLetter(); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); - OrderBy orderBy = segmentResult.getOrderBy(); - Page page = segmentResult.getPage(); - - BuildExample buildExample = new BuildExample(); - buildExample.setOrderBy(orderBy); - buildExample.setPage(page); if (selectSegment == null) { throw new RuntimeException("Unable to build SQL statement!"); } if (selectSegment.getArgSegments().isEmpty()) { - return buildExample; + return queryCtx; } if (!selectSegment.isDirtyQuery()) { - return buildExample; + return queryCtx; } selectSegment.setDistinct(true); @@ -80,10 +73,10 @@ public class SQLExampleBuilder implements ExampleBuilder { String countSql = selectSegment.selectSql() + fromWhereSql; long count = SqlRunner.db().selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - buildExample.setCountQueried(true); - if (count == 0) { - buildExample.setAbandoned(true); - return buildExample; + queryCtx.setCountQueried(true); + if (count == 0L) { + queryCtx.setAbandoned(true); + return queryCtx; } } @@ -103,12 +96,12 @@ public class SQLExampleBuilder implements ExampleBuilder { List> resultMaps = SqlRunner.db().selectList(selectSql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { - buildExample.eq("id", primaryKeys); + example.eq("id", primaryKeys); } else { - buildExample.setAbandoned(true); + queryCtx.setAbandoned(true); } - return buildExample; + return queryCtx; } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 6d61bc17..07f46469 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -31,11 +31,11 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; -import com.gitee.dorive.query.api.ExampleBuilder; -import com.gitee.dorive.query.entity.Query; +import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.entity.QueryCtx; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; -import com.gitee.dorive.spring.boot.starter.impl.SQLExampleBuilder; +import com.gitee.dorive.spring.boot.starter.impl.SqlQueryBuilder; import com.gitee.dorive.spring.boot.starter.impl.executor.MybatisPlusExecutor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -52,13 +52,13 @@ import java.util.stream.Collectors; @EqualsAndHashCode(callSuper = false) public class MybatisPlusRepository extends AbstractRefRepository { - private ExampleBuilder sqlExampleBuilder; + private QueryBuilder sqlQueryBuilder; private CountQuerier countQuerier; @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - this.sqlExampleBuilder = new SQLExampleBuilder(this); + this.sqlQueryBuilder = new SqlQueryBuilder(); this.countQuerier = new CountQuerier(this); } @@ -149,13 +149,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - protected ExampleBuilder adaptiveExampleBuilder(Context context, Query query) { + protected QueryBuilder adaptiveBuilder(Context context, QueryCtx queryCtx) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { - return sqlExampleBuilder; + return sqlQueryBuilder; } - return super.adaptiveExampleBuilder(context, query); + return super.adaptiveBuilder(context, queryCtx); } } -- Gitee From d1a05464a90ccd521440b1ba204e023354a1d709 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 16:53:00 +0800 Subject: [PATCH 011/146] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/query/entity/QueryCtx.java | 2 +- .../com/gitee/dorive/query/impl/resolver/QueryResolver.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java index ad842411..2d5db4e2 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java @@ -29,8 +29,8 @@ import java.util.Map; @Data @AllArgsConstructor public class QueryCtx { - private QueryResolver queryResolver; private Object query; + private QueryResolver queryResolver; private Map> criteriaMap; private Example example; private boolean abandoned; 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 97eda949..56eb8c6f 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 @@ -47,7 +47,7 @@ public class QueryResolver { example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new QueryCtx(this, query, criteriaMap, example, false, false); + return new QueryCtx(query, this, criteriaMap, example, false, false); } private Map> newCriteriaMap(Object query) { -- Gitee From 0dc877c5e3c5bfe81d3a4bbf161a5bcc80a698da Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 16:53:43 +0800 Subject: [PATCH 012/146] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/query/entity/QueryCtx.java | 2 +- .../com/gitee/dorive/query/impl/resolver/QueryResolver.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java index 2d5db4e2..ad842411 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java @@ -29,8 +29,8 @@ import java.util.Map; @Data @AllArgsConstructor public class QueryCtx { - private Object query; private QueryResolver queryResolver; + private Object query; private Map> criteriaMap; private Example example; private boolean abandoned; 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 56eb8c6f..97eda949 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 @@ -47,7 +47,7 @@ public class QueryResolver { example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new QueryCtx(query, this, criteriaMap, example, false, false); + return new QueryCtx(this, query, criteriaMap, example, false, false); } private Map> newCriteriaMap(Object query) { -- Gitee From abc1228c25be9fbe26d88fae2d1b6921733b6f35 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 17:02:31 +0800 Subject: [PATCH 013/146] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/query/impl/DefaultQueryBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index 18938368..f4b13b47 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -42,19 +42,19 @@ public class DefaultQueryBuilder implements QueryBuilder { QueryCtx queryCtx = (QueryCtx) query; QueryResolver queryResolver = queryCtx.getQueryResolver(); Map> criteriaMap = queryCtx.getCriteriaMap(); + Example example = queryCtx.getExample(); Map repoExampleMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); - Example example = new InnerExample(criteria); - repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, example, false)); + repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, new InnerExample(criteria), false)); } executeQuery(context, repoExampleMap); RepoExample repoExample = repoExampleMap.get("/"); - queryCtx.getExample().setCriteria(repoExample.getExample().getCriteria()); + example.setCriteria(repoExample.getExample().getCriteria()); queryCtx.setAbandoned(repoExample.isAbandoned()); return queryCtx; } -- Gitee From 254b28476da79b45c6a2300e2262d889d6d7ebf6 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 19:57:38 +0800 Subject: [PATCH 014/146] =?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/executor/FieldExecutor.java | 6 +- .../gitee/dorive/query/entity/QueryCtx.java | 4 +- .../query/impl/DefaultQueryBuilder.java | 65 ++++++++++--------- .../query/impl/resolver/QueryResolver.java | 17 +++-- .../boot/starter/impl/SegmentBuilder.java | 24 +++---- .../boot/starter/impl/SqlQueryBuilder.java | 6 +- 6 files changed, 63 insertions(+), 59 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java index 21234563..c9680021 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java @@ -50,7 +50,7 @@ public class FieldExecutor extends AbstractExampleExecutor { convertOrderBy(example.getOrderBy()); } - public void convertSelectProps(Example example) { + private void convertSelectProps(Example example) { List properties = example.getSelectProps(); if (properties != null && !properties.isEmpty()) { properties = entityEle.toAliases(properties); @@ -58,7 +58,7 @@ public class FieldExecutor extends AbstractExampleExecutor { } } - public void convertCriteria(Context context, List criteria) { + private void convertCriteria(Context context, List criteria) { if (criteria != null && !criteria.isEmpty()) { for (Criterion criterion : criteria) { String property = criterion.getProperty(); @@ -77,7 +77,7 @@ public class FieldExecutor extends AbstractExampleExecutor { } } - public void convertOrderBy(OrderBy orderBy) { + private void convertOrderBy(OrderBy orderBy) { if (orderBy != null) { List properties = orderBy.getProperties(); properties = entityEle.toAliases(properties); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java index ad842411..ee048e3b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java @@ -17,13 +17,11 @@ package com.gitee.dorive.query.entity; -import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.List; import java.util.Map; @Data @@ -31,7 +29,7 @@ import java.util.Map; public class QueryCtx { private QueryResolver queryResolver; private Object query; - private Map> criteriaMap; + private Map exampleMap; private Example example; private boolean abandoned; private boolean countQueried; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index f4b13b47..9ba12eb8 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -18,7 +18,6 @@ package com.gitee.dorive.query.impl; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.MultiInBuilder; @@ -32,7 +31,10 @@ import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.*; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class DefaultQueryBuilder implements QueryBuilder { @@ -40,32 +42,37 @@ public class DefaultQueryBuilder implements QueryBuilder { @Override public QueryCtx build(Context context, Object query) { QueryCtx queryCtx = (QueryCtx) query; - QueryResolver queryResolver = queryCtx.getQueryResolver(); - Map> criteriaMap = queryCtx.getCriteriaMap(); - Example example = queryCtx.getExample(); - Map repoExampleMap = new LinkedHashMap<>(); + Map exampleWrapperMap = buildExampleWrapperMap(queryCtx); + executeQuery(context, exampleWrapperMap); + + ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); + queryCtx.setAbandoned(exampleWrapper.isAbandoned()); + + return queryCtx; + } + + private Map buildExampleWrapperMap(QueryCtx queryCtx) { + QueryResolver queryResolver = queryCtx.getQueryResolver(); + Map exampleMap = queryCtx.getExampleMap(); + Map exampleWrapperMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); - List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> new ArrayList<>(2)); - repoExampleMap.put(relativeAccessPath, new RepoExample(mergedRepository, new InnerExample(criteria), false)); + Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample()); + ExampleWrapper exampleWrapper = new ExampleWrapper(mergedRepository, example, false); + exampleWrapperMap.put(relativeAccessPath, exampleWrapper); } - executeQuery(context, repoExampleMap); - - RepoExample repoExample = repoExampleMap.get("/"); - example.setCriteria(repoExample.getExample().getCriteria()); - queryCtx.setAbandoned(repoExample.isAbandoned()); - return queryCtx; + return exampleWrapperMap; } - private void executeQuery(Context context, Map repoExampleMap) { - repoExampleMap.forEach((accessPath, repoExample) -> { + private void executeQuery(Context context, Map exampleWrapperMap) { + exampleWrapperMap.forEach((accessPath, exampleWrapper) -> { if ("/".equals(accessPath)) return; - MergedRepository mergedRepository = repoExample.getMergedRepository(); - Example example = repoExample.getExample(); - boolean abandoned = repoExample.isAbandoned(); + MergedRepository mergedRepository = exampleWrapper.getMergedRepository(); + Example example = exampleWrapper.getExample(); + boolean abandoned = exampleWrapper.isAbandoned(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); Map> mergedBindersMap = mergedRepository.getMergedBindersMap(); @@ -74,9 +81,9 @@ public class DefaultQueryBuilder implements QueryBuilder { BinderResolver binderResolver = definedRepository.getBinderResolver(); for (String relativeAccessPath : mergedBindersMap.keySet()) { - RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); - if (targetRepoExample != null) { - if (targetRepoExample.isAbandoned()) { + ExampleWrapper targetExampleWrapper = exampleWrapperMap.get(relativeAccessPath); + if (targetExampleWrapper != null) { + if (targetExampleWrapper.isAbandoned()) { abandoned = true; break; } @@ -96,13 +103,13 @@ public class DefaultQueryBuilder implements QueryBuilder { for (Map.Entry> entry : mergedBindersMap.entrySet()) { String relativeAccessPath = entry.getKey(); List binders = entry.getValue(); - RepoExample targetRepoExample = repoExampleMap.get(relativeAccessPath); - if (targetRepoExample != null) { + ExampleWrapper targetExampleWrapper = exampleWrapperMap.get(relativeAccessPath); + if (targetExampleWrapper != null) { if (entities.isEmpty()) { - targetRepoExample.setAbandoned(true); + targetExampleWrapper.setAbandoned(true); return; } - Example targetExample = targetRepoExample.getExample(); + Example targetExample = targetExampleWrapper.getExample(); if (binders.size() == 1) { PropertyBinder binder = binders.get(0); List fieldValues = binder.collectFieldValues(context, entities); @@ -114,7 +121,7 @@ public class DefaultQueryBuilder implements QueryBuilder { targetExample.in(boundName, fieldValues); } } else { - targetRepoExample.setAbandoned(true); + targetExampleWrapper.setAbandoned(true); } } else { @@ -124,7 +131,7 @@ public class DefaultQueryBuilder implements QueryBuilder { if (!builder.isEmpty()) { targetExample.getCriteria().add(builder.build()); } else { - targetRepoExample.setAbandoned(true); + targetExampleWrapper.setAbandoned(true); } } } @@ -149,7 +156,7 @@ public class DefaultQueryBuilder implements QueryBuilder { @Data @AllArgsConstructor - public static class RepoExample { + 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/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java index 97eda949..f8756abd 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 @@ -40,18 +40,17 @@ public class QueryResolver { private List reversedMergedRepositories; public QueryCtx newQuery(Object query) { - Map> criteriaMap = newCriteriaMap(query); + Map exampleMap = newExampleMap(query); - Example example = new InnerExample(); - example.setCriteria(criteriaMap.computeIfAbsent("/", key -> new ArrayList<>(4))); + Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new QueryCtx(this, query, criteriaMap, example, false, false); + return new QueryCtx(this, query, exampleMap, example, false, false); } - private Map> newCriteriaMap(Object query) { - Map> criteriaMap = new LinkedHashMap<>(8); + private Map newExampleMap(Object query) { + Map exampleMap = new LinkedHashMap<>(8); for (QueryField queryField : queryFields) { Object fieldValue = queryField.getFieldValue(query); if (fieldValue != null) { @@ -59,11 +58,11 @@ public class QueryResolver { String belongTo = criterionDef.getBelongTo(); String fieldName = criterionDef.getField(); String operator = criterionDef.getOperator(); - List criteria = criteriaMap.computeIfAbsent(belongTo, key -> new ArrayList<>(4)); - criteria.add(new Criterion(fieldName, operator, fieldValue)); + Example example = exampleMap.computeIfAbsent(belongTo, key -> new InnerExample()); + example.getCriteria().add(new Criterion(fieldName, operator, fieldValue)); } } - return criteriaMap; + return exampleMap; } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index a602e0d0..3dec3fee 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -23,6 +23,7 @@ import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -41,8 +42,7 @@ public class SegmentBuilder { public SegmentResult buildSegment(Context context, QueryCtx queryCtx) { QueryResolver queryResolver = queryCtx.getQueryResolver(); - Map> criteriaMap = queryCtx.getCriteriaMap(); - Example example = queryCtx.getExample(); + Map exampleMap = queryCtx.getExampleMap(); List mergedRepositories = queryResolver.getMergedRepositories(); Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); @@ -68,14 +68,15 @@ public class SegmentBuilder { String tableAlias = String.valueOf(letter); letter = (char) (letter + 1); - List criteria = criteriaMap.computeIfAbsent(absoluteAccessPath, key -> Collections.emptyList()); - fieldExecutor.convertCriteria(context, criteria); - appendArguments(argSegments, args, tableAlias, criteria); + Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); + fieldExecutor.convert(context, example); + + appendArguments(argSegments, args, tableAlias, example); if ("/".equals(relativeAccessPath)) { selectSegment = new SelectSegment(); selectSegment.setReachable(true); - selectSegment.setDirtyQuery(!criteria.isEmpty()); + selectSegment.setDirtyQuery(example.isNotEmpty()); selectSegment.setDirectedSegments(new ArrayList<>(8)); selectSegment.setDistinct(false); selectSegment.setColumns(Collections.emptyList()); @@ -85,12 +86,10 @@ public class SegmentBuilder { selectSegment.setArgSegments(argSegments); segmentMap.put(relativeAccessPath, selectSegment); - fieldExecutor.convertOrderBy(example.getOrderBy()); - } else { JoinSegment joinSegment = new JoinSegment(); joinSegment.setReachable(false); - joinSegment.setDirtyQuery(!criteria.isEmpty()); + joinSegment.setDirtyQuery(example.isNotEmpty()); joinSegment.setDirectedSegments(new ArrayList<>(4)); joinSegment.setTableName(tableName); joinSegment.setTableAlias(tableAlias); @@ -114,11 +113,8 @@ public class SegmentBuilder { return new SegmentResult(letter, selectSegment, args); } - private void appendArguments(List argSegments, - List args, - String tableAlias, - List criteria) { - for (Criterion criterion : criteria) { + private void appendArguments(List argSegments, List args, String tableAlias, Example example) { + 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)) { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java index 1eca104c..da188a17 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java @@ -23,6 +23,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.QueryCtx; import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; @@ -43,7 +44,10 @@ public class SqlQueryBuilder implements QueryBuilder { QueryCtx queryCtx = (QueryCtx) query; Example example = queryCtx.getExample(); OrderBy orderBy = example.getOrderBy(); - Page page = example.getPage(); + + Example newExample = ExampleUtils.tryClone(example); + queryCtx.setExample(newExample); + Page page = newExample.getPage(); SegmentResult segmentResult = segmentBuilder.buildSegment(context, queryCtx); char letter = segmentResult.getLetter(); -- Gitee From 81f0ec59bae53ed25b427c9d2b29c0d0a1ebe4c0 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 18 Nov 2023 21:01:22 +0800 Subject: [PATCH 015/146] =?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 --- .../src/main/java/com/gitee/dorive/query/entity/QueryCtx.java | 2 +- .../dorive/query/repository/AbstractQueryRepository.java | 4 ++-- .../dorive/spring/boot/starter/impl/SqlQueryBuilder.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java index ee048e3b..4b5d5040 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java @@ -32,5 +32,5 @@ public class QueryCtx { private Map exampleMap; private Example example; private boolean abandoned; - private boolean countQueried; + private boolean pageQueried; } 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 49de6d83..aaa97ffb 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 @@ -89,7 +89,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (queryCtx.isAbandoned()) { return Collections.emptyList(); } - if (queryCtx.isCountQueried()) { + if (queryCtx.isPageQueried()) { example.setPage(null); } return selectByExample(context, example); @@ -103,7 +103,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (queryCtx.isAbandoned()) { return (Page) example.getPage(); } - if (queryCtx.isCountQueried()) { + if (queryCtx.isPageQueried()) { Page page = example.getPage(); example.setPage(null); List records = selectByExample(context, example); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java index da188a17..b5f0f078 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java @@ -77,7 +77,7 @@ public class SqlQueryBuilder implements QueryBuilder { String countSql = selectSegment.selectSql() + fromWhereSql; long count = SqlRunner.db().selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - queryCtx.setCountQueried(true); + queryCtx.setPageQueried(true); if (count == 0L) { queryCtx.setAbandoned(true); return queryCtx; -- Gitee From 0c89922c88b473dbe197425b550e2e739254cb3d Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sun, 19 Nov 2023 23:21:20 +0800 Subject: [PATCH 016/146] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=B1=BB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/api/QueryBuilder.java | 4 +-- .../entity/{QueryCtx.java => BuildQuery.java} | 2 +- .../query/impl/DefaultQueryBuilder.java | 18 +++++------ .../query/impl/resolver/QueryResolver.java | 6 ++-- .../repository/AbstractQueryRepository.java | 30 +++++++++---------- .../boot/starter/impl/CountQuerier.java | 6 ++-- .../boot/starter/impl/SegmentBuilder.java | 8 ++--- .../boot/starter/impl/SqlQueryBuilder.java | 26 ++++++++-------- .../repository/MybatisPlusRepository.java | 6 ++-- 9 files changed, 53 insertions(+), 53 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{QueryCtx.java => BuildQuery.java} (97%) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java index 07030b99..85f49b83 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java @@ -18,10 +18,10 @@ package com.gitee.dorive.query.api; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; public interface QueryBuilder { - QueryCtx build(Context context, Object query); + BuildQuery build(Context context, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java similarity index 97% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index 4b5d5040..7ae3e71b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryCtx.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -26,7 +26,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class QueryCtx { +public class BuildQuery { private QueryResolver queryResolver; private Object query; private Map exampleMap; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index 9ba12eb8..946d912f 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -26,7 +26,7 @@ import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; @@ -40,21 +40,21 @@ import java.util.stream.Collectors; public class DefaultQueryBuilder implements QueryBuilder { @Override - public QueryCtx build(Context context, Object query) { - QueryCtx queryCtx = (QueryCtx) query; + public BuildQuery build(Context context, Object query) { + BuildQuery buildQuery = (BuildQuery) query; - Map exampleWrapperMap = buildExampleWrapperMap(queryCtx); + Map exampleWrapperMap = buildExampleWrapperMap(buildQuery); executeQuery(context, exampleWrapperMap); ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); - queryCtx.setAbandoned(exampleWrapper.isAbandoned()); + buildQuery.setAbandoned(exampleWrapper.isAbandoned()); - return queryCtx; + return buildQuery; } - private Map buildExampleWrapperMap(QueryCtx queryCtx) { - QueryResolver queryResolver = queryCtx.getQueryResolver(); - Map exampleMap = queryCtx.getExampleMap(); + private Map buildExampleWrapperMap(BuildQuery buildQuery) { + QueryResolver queryResolver = buildQuery.getQueryResolver(); + Map exampleMap = buildQuery.getExampleMap(); Map exampleWrapperMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); 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 f8756abd..db803b4b 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 @@ -19,7 +19,7 @@ package com.gitee.dorive.query.impl.resolver; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.QueryField; import com.gitee.dorive.query.entity.SpecificFields; import com.gitee.dorive.query.entity.def.ExampleDef; @@ -39,14 +39,14 @@ public class QueryResolver { private List mergedRepositories; private List reversedMergedRepositories; - public QueryCtx newQuery(Object query) { + public BuildQuery newQuery(Object query) { Map exampleMap = newExampleMap(query); Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new QueryCtx(this, query, exampleMap, example, false, false); + return new BuildQuery(this, query, exampleMap, example, false, false); } 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 aaa97ffb..176ff815 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 @@ -25,7 +25,7 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.event.repository.AbstractEventRepository; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.api.QueryRepository; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.impl.DefaultQueryBuilder; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; @@ -65,31 +65,31 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } @Override - public QueryCtx build(Context context, Object query) { - QueryCtx queryCtx = newQuery(query); - QueryBuilder queryBuilder = adaptiveBuilder(context, queryCtx); - return queryBuilder.build(context, queryCtx); + public BuildQuery build(Context context, Object query) { + BuildQuery buildQuery = newQuery(query); + QueryBuilder queryBuilder = adaptiveBuilder(context, buildQuery); + return queryBuilder.build(context, buildQuery); } - public QueryCtx newQuery(Object query) { + public BuildQuery newQuery(Object query) { Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); Assert.notNull(queryResolver, "No query resolver found!"); return queryResolver.newQuery(query); } - protected QueryBuilder adaptiveBuilder(Context context, QueryCtx queryCtx) { + protected QueryBuilder adaptiveBuilder(Context context, BuildQuery buildQuery) { return queryBuilder; } @Override public List selectByQuery(Context context, Object query) { - QueryCtx queryCtx = build(context, query); - Example example = queryCtx.getExample(); - if (queryCtx.isAbandoned()) { + BuildQuery buildQuery = build(context, query); + Example example = buildQuery.getExample(); + if (buildQuery.isAbandoned()) { return Collections.emptyList(); } - if (queryCtx.isPageQueried()) { + if (buildQuery.isPageQueried()) { example.setPage(null); } return selectByExample(context, example); @@ -98,12 +98,12 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { - QueryCtx queryCtx = build(context, query); - Example example = queryCtx.getExample(); - if (queryCtx.isAbandoned()) { + BuildQuery buildQuery = build(context, query); + Example example = buildQuery.getExample(); + if (buildQuery.isAbandoned()) { return (Page) example.getPage(); } - if (queryCtx.isPageQueried()) { + if (buildQuery.isPageQueried()) { Page page = example.getPage(); example.setPage(null); List records = selectByExample(context, example); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index 68e8d26f..5643d681 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -19,7 +19,7 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; @@ -44,9 +44,9 @@ public class CountQuerier { } public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { - QueryCtx queryCtx = repository.newQuery(query); + BuildQuery buildQuery = repository.newQuery(query); - SegmentResult segmentResult = segmentBuilder.buildSegment(context, queryCtx); + SegmentResult segmentResult = segmentBuilder.buildSegment(context, buildQuery); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java index 3dec3fee..d1c3ae10 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -29,7 +29,7 @@ import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.spring.boot.starter.entity.segment.*; import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; @@ -40,9 +40,9 @@ import java.util.*; @Data public class SegmentBuilder { - public SegmentResult buildSegment(Context context, QueryCtx queryCtx) { - QueryResolver queryResolver = queryCtx.getQueryResolver(); - Map exampleMap = queryCtx.getExampleMap(); + public SegmentResult buildSegment(Context context, BuildQuery buildQuery) { + QueryResolver queryResolver = buildQuery.getQueryResolver(); + Map exampleMap = buildQuery.getExampleMap(); List mergedRepositories = queryResolver.getMergedRepositories(); Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java index b5f0f078..164018ef 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java @@ -25,7 +25,7 @@ import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; import lombok.Data; @@ -40,16 +40,16 @@ public class SqlQueryBuilder implements QueryBuilder { private SegmentBuilder segmentBuilder = new SegmentBuilder(); @Override - public QueryCtx build(Context context, Object query) { - QueryCtx queryCtx = (QueryCtx) query; - Example example = queryCtx.getExample(); + public BuildQuery build(Context context, Object query) { + BuildQuery buildQuery = (BuildQuery) query; + Example example = buildQuery.getExample(); OrderBy orderBy = example.getOrderBy(); Example newExample = ExampleUtils.tryClone(example); - queryCtx.setExample(newExample); + buildQuery.setExample(newExample); Page page = newExample.getPage(); - SegmentResult segmentResult = segmentBuilder.buildSegment(context, queryCtx); + SegmentResult segmentResult = segmentBuilder.buildSegment(context, buildQuery); char letter = segmentResult.getLetter(); SelectSegment selectSegment = segmentResult.getSelectSegment(); List args = segmentResult.getArgs(); @@ -58,10 +58,10 @@ public class SqlQueryBuilder implements QueryBuilder { throw new RuntimeException("Unable to build SQL statement!"); } if (selectSegment.getArgSegments().isEmpty()) { - return queryCtx; + return buildQuery; } if (!selectSegment.isDirtyQuery()) { - return queryCtx; + return buildQuery; } selectSegment.setDistinct(true); @@ -77,10 +77,10 @@ public class SqlQueryBuilder implements QueryBuilder { String countSql = selectSegment.selectSql() + fromWhereSql; long count = SqlRunner.db().selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - queryCtx.setPageQueried(true); + buildQuery.setPageQueried(true); if (count == 0L) { - queryCtx.setAbandoned(true); - return queryCtx; + buildQuery.setAbandoned(true); + return buildQuery; } } @@ -102,10 +102,10 @@ public class SqlQueryBuilder implements QueryBuilder { if (!primaryKeys.isEmpty()) { example.eq("id", primaryKeys); } else { - queryCtx.setAbandoned(true); + buildQuery.setAbandoned(true); } - return queryCtx; + return buildQuery; } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 07f46469..948be7aa 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -32,7 +32,7 @@ import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.query.api.QueryBuilder; -import com.gitee.dorive.query.entity.QueryCtx; +import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; import com.gitee.dorive.spring.boot.starter.impl.SqlQueryBuilder; @@ -149,13 +149,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - protected QueryBuilder adaptiveBuilder(Context context, QueryCtx queryCtx) { + protected QueryBuilder adaptiveBuilder(Context context, BuildQuery buildQuery) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { return sqlQueryBuilder; } - return super.adaptiveBuilder(context, queryCtx); + return super.adaptiveBuilder(context, buildQuery); } } -- Gitee From a001c14f6a59806b7139e8afce1bd9d51dd0ce50 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 20 Nov 2023 14:16:41 +0800 Subject: [PATCH 017/146] =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/impl/DefaultQueryBuilder.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index 946d912f..3993fb7c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -90,14 +90,16 @@ public class DefaultQueryBuilder implements QueryBuilder { } } - if (!abandoned && example.isEmpty()) { - return; - } + List entities; + if (abandoned) { + entities = Collections.emptyList(); - List entities = Collections.emptyList(); - if (!abandoned && example.isNotEmpty()) { + } else if (example.isNotEmpty()) { example.select(binderResolver.getSelfFields()); entities = executedRepository.selectByExample(context, example); + + } else { + return; } for (Map.Entry> entry : mergedBindersMap.entrySet()) { -- Gitee From 57a2160e41d52a5353e287fb773cdaa39c2d598b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 24 Nov 2023 17:01:52 +0800 Subject: [PATCH 018/146] =?UTF-8?q?=E5=B0=86sql=E6=8B=BC=E8=A3=85=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=86=E7=A6=BB=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/api/ImplFactory.java | 24 ++++++++++ .../com/gitee/dorive/api/constant/Keys.java | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- .../config/DoriveStarterConfiguration.java | 35 +++++++++++++++ .../boot/starter/impl/AppenderContext.java | 2 +- .../boot/starter/impl/CountQuerier.java | 5 ++- .../boot/starter/impl/DefaultImplFactory.java | 34 ++++++++++++++ .../boot/starter/impl/DefaultSqlHelper.java | 44 +++++++++++++++++++ .../impl/executor/MybatisPlusExecutor.java | 2 +- .../repository/MybatisPlusRepository.java | 12 +++-- .../main/resources/META-INF/spring.factories | 3 +- ...ot.autoconfigure.AutoConfiguration.imports | 3 +- dorive-sql/pom.xml | 19 ++++++++ .../com/gitee/dorive/sql/api/SqlHelper.java | 31 +++++++++++++ .../gitee/dorive/sql/entity}/ArgSegment.java | 2 +- .../gitee/dorive/sql/entity}/JoinSegment.java | 2 +- .../gitee/dorive/sql/entity}/OnSegment.java | 2 +- .../com/gitee/dorive/sql/entity}/Segment.java | 2 +- .../dorive/sql/entity}/SegmentResult.java | 2 +- .../dorive/sql/entity}/SelectSegment.java | 2 +- .../dorive/sql}/impl/SegmentBuilder.java | 23 ++++++---- .../dorive/sql}/impl/SqlQueryBuilder.java | 17 ++++--- .../dorive/sql}/util/CriterionUtils.java | 15 +++++-- .../com/gitee/dorive/sql}/util/SqlUtils.java | 2 +- pom.xml | 1 + 25 files changed, 252 insertions(+), 36 deletions(-) create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java create mode 100644 dorive-sql/pom.xml create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/ArgSegment.java (95%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/JoinSegment.java (94%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/OnSegment.java (95%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/Segment.java (95%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/SegmentResult.java (94%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment => dorive-sql/src/main/java/com/gitee/dorive/sql/entity}/SelectSegment.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-sql/src/main/java/com/gitee/dorive/sql}/impl/SegmentBuilder.java (93%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-sql/src/main/java/com/gitee/dorive/sql}/impl/SqlQueryBuilder.java (86%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-sql/src/main/java/com/gitee/dorive/sql}/util/CriterionUtils.java (86%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-sql/src/main/java/com/gitee/dorive/sql}/util/SqlUtils.java (95%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java b/dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java new file mode 100644 index 00000000..5e6f9f0c --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/api/ImplFactory.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.api; + +public interface ImplFactory { + + T getInstance(Class clazz, Object... args); + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java index 75e0b5a4..c9f13a32 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java @@ -20,5 +20,5 @@ package com.gitee.dorive.api.constant; public interface Keys { String FIELD_EXECUTOR = "FIELD_EXECUTOR"; String QUERIER = "QUERIER"; - String TABLE_INFO = "TABLE_INFO"; + String TABLE_NAME = "TABLE_NAME"; } diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index d96b1947..41cc71c8 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -27,7 +27,7 @@ com.gitee.digital-engine - dorive-ref + dorive-sql ${project.version} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java new file mode 100644 index 00000000..80a8aaea --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.spring.boot.starter.config; + +import com.gitee.dorive.spring.boot.starter.impl.DefaultImplFactory; +import com.gitee.dorive.api.api.ImplFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +@Order(-100) +@Configuration +public class DoriveStarterConfiguration { + + @Bean + public static ImplFactory implFactory() { + return new DefaultImplFactory(); + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index ec31c3f3..dd83daa5 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -22,7 +22,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.spring.boot.starter.util.SqlUtils; +import com.gitee.dorive.sql.util.SqlUtils; import java.util.Collection; import java.util.List; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java index 5643d681..cbee0c1c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java @@ -23,8 +23,9 @@ import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; -import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; +import com.gitee.dorive.sql.entity.SegmentResult; +import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.impl.SegmentBuilder; import lombok.Data; import java.util.ArrayList; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java new file mode 100644 index 00000000..abbf73b7 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java @@ -0,0 +1,34 @@ +/* + * 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.spring.boot.starter.impl; + +import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.sql.api.SqlHelper; + +public class DefaultImplFactory implements ImplFactory { + + @Override + @SuppressWarnings("unchecked") + public T getInstance(Class clazz, Object... args) { + if (clazz == SqlHelper.class) { + return (T) new DefaultSqlHelper(); + } + return null; + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java new file mode 100644 index 00000000..4a14451b --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.spring.boot.starter.impl; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; +import com.gitee.dorive.sql.api.SqlHelper; + +import java.util.List; +import java.util.Map; + +public class DefaultSqlHelper implements SqlHelper { + + @Override + public String sqlParam(Object obj) { + return StringUtils.sqlParam(obj); + } + + @Override + public long selectCount(String sql, Object... args) { + return SqlRunner.db().selectCount(sql, args); + } + + @Override + public List> selectList(String sql, Object... args) { + return SqlRunner.db().selectList(sql, args); + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java index c438df9e..bd8ece04 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java @@ -36,7 +36,7 @@ import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.core.entity.operation.*; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; +import com.gitee.dorive.sql.util.CriterionUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 948be7aa..b6b5677f 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -35,8 +35,11 @@ import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; -import com.gitee.dorive.spring.boot.starter.impl.SqlQueryBuilder; import com.gitee.dorive.spring.boot.starter.impl.executor.MybatisPlusExecutor; +import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.impl.SegmentBuilder; +import com.gitee.dorive.sql.impl.SqlQueryBuilder; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; @@ -58,7 +61,8 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - this.sqlQueryBuilder = new SqlQueryBuilder(); + ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); + this.sqlQueryBuilder = new SqlQueryBuilder(new SegmentBuilder(), implFactory.getInstance(SqlHelper.class)); this.countQuerier = new CountQuerier(this); } @@ -83,7 +87,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); - attachments.put(Keys.TABLE_INFO, tableInfo); + if (tableInfo != null) { + attachments.put(Keys.TABLE_NAME, tableInfo.getTableName()); + } EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, pojoClass, tableInfo, converterMap); Executor executor = new MybatisPlusExecutor(entityDef, entityEle, (BaseMapper) mapper, (Class) pojoClass); diff --git a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories b/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories index 094855eb..a004902c 100644 --- a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ org.springframework.boot.env.EnvironmentPostProcessor=\ com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration + com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration,\ + com.gitee.dorive.spring.boot.starter.config.DoriveStarterConfiguration diff --git a/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 071b7b70..58f7d2cf 100644 --- a/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ -com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration \ No newline at end of file +com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration +com.gitee.dorive.spring.boot.starter.config.DoriveStarterConfiguration \ No newline at end of file diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml new file mode 100644 index 00000000..bc1a3471 --- /dev/null +++ b/dorive-sql/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + com.gitee.digital-engine + dorive + 3.4.3.3 + + dorive-sql + + + com.gitee.digital-engine + dorive-ref + ${project.version} + + + \ No newline at end of file diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java new file mode 100644 index 00000000..55c625c2 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.sql.api; + +import java.util.List; +import java.util.Map; + +public interface SqlHelper { + + String sqlParam(Object obj); + + long selectCount(String sql, Object... args); + + List> selectList(String sql, Object... args); + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java index 5702cf83..0019c6c6 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/ArgSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java similarity index 94% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java index 49f0f769..32f4373e 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/JoinSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java index 230a6aad..7a5a9f8d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/OnSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java index bd42df13..eac0a141 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/Segment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import lombok.Data; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java similarity index 94% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java index 56924f2f..6d0ea2a1 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SegmentResult.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index 3ac12c90..4c4e4825 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/segment/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.segment; +package com.gitee.dorive.sql.entity; import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java similarity index 93% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index d1c3ae10..7a41e7b6 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -15,9 +15,8 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.sql.impl; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.context.Context; @@ -28,14 +27,23 @@ import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.BuildQuery; +import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.resolver.QueryResolver; -import com.gitee.dorive.spring.boot.starter.entity.segment.*; -import com.gitee.dorive.spring.boot.starter.util.CriterionUtils; +import com.gitee.dorive.sql.entity.ArgSegment; +import com.gitee.dorive.sql.entity.JoinSegment; +import com.gitee.dorive.sql.entity.OnSegment; +import com.gitee.dorive.sql.entity.Segment; +import com.gitee.dorive.sql.entity.SegmentResult; +import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.util.CriterionUtils; import lombok.Data; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data public class SegmentBuilder { @@ -61,10 +69,9 @@ public class SegmentBuilder { BinderResolver binderResolver = definedRepository.getBinderResolver(); Map attachments = executedRepository.getAttachments(); - TableInfo tableInfo = (TableInfo) attachments.get(Keys.TABLE_INFO); + String tableName = (String) attachments.get(Keys.TABLE_NAME); FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); - String tableName = tableInfo.getTableName(); String tableAlias = String.valueOf(letter); letter = (char) (letter + 1); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java similarity index 86% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 164018ef..08e83bda 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -15,10 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.sql.impl; import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -26,8 +25,10 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; -import com.gitee.dorive.spring.boot.starter.entity.segment.SegmentResult; -import com.gitee.dorive.spring.boot.starter.entity.segment.SelectSegment; +import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.entity.SegmentResult; +import com.gitee.dorive.sql.entity.SelectSegment; +import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; @@ -35,9 +36,11 @@ import java.util.List; import java.util.Map; @Data +@AllArgsConstructor public class SqlQueryBuilder implements QueryBuilder { - private SegmentBuilder segmentBuilder = new SegmentBuilder(); + private SegmentBuilder segmentBuilder; + private SqlHelper sqlHelper; @Override public BuildQuery build(Context context, Object query) { @@ -75,7 +78,7 @@ public class SqlQueryBuilder implements QueryBuilder { if (page != null) { String countSql = selectSegment.selectSql() + fromWhereSql; - long count = SqlRunner.db().selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); + long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); buildQuery.setPageQueried(true); if (count == 0L) { @@ -97,7 +100,7 @@ public class SqlQueryBuilder implements QueryBuilder { } String selectSql = selectSegment.selectSql() + fromWhereSql + selectSegment.lastSql(); - List> resultMaps = SqlRunner.db().selectList(selectSql, args.toArray()); + List> resultMaps = sqlHelper.selectList(selectSql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.eq("id", primaryKeys); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/CriterionUtils.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java similarity index 86% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/CriterionUtils.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java index f3dba511..4d394510 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/CriterionUtils.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java @@ -15,18 +15,27 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.util; +package com.gitee.dorive.sql.util; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import cn.hutool.extra.spring.SpringUtil; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.api.api.ImplFactory; +import com.gitee.dorive.sql.api.SqlHelper; import java.util.Collection; import java.util.Date; public class CriterionUtils { + private static final SqlHelper sqlHelper; + + static { + ImplFactory implFactory = SpringUtil.getBean(ImplFactory.class); + sqlHelper = implFactory.getInstance(SqlHelper.class); + } + public static String getOperator(Criterion criterion) { String operator = criterion.getOperator(); Object value = criterion.getValue(); @@ -54,7 +63,7 @@ public class CriterionUtils { public static Object getValue(Criterion criterion) { String operator = criterion.getOperator(); Object value = criterion.getValue(); - return StringUtils.sqlParam(format(operator, value)); + return sqlHelper.sqlParam(format(operator, value)); } public static Object format(String operator, Object value) { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/SqlUtils.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/SqlUtils.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java index e9f23486..eaeafd0d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/SqlUtils.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.util; +package com.gitee.dorive.sql.util; public class SqlUtils { diff --git a/pom.xml b/pom.xml index e40dd46b..91c57ed0 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ dorive-event dorive-query dorive-ref + dorive-sql dorive-spring-boot-starter -- Gitee From 79dc2cfb28374d92c153b8716c38a4bf55c43171 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 24 Nov 2023 17:19:21 +0800 Subject: [PATCH 019/146] =?UTF-8?q?=E5=B0=86sql=E6=8B=BC=E8=A3=85=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=86=E7=A6=BB=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/{executor => }/LambdaExample.java | 2 +- .../{executor => }/MybatisPlusExecutor.java | 2 +- .../repository/MybatisPlusRepository.java | 13 +++++++---- .../gitee/dorive/sql}/impl/CountQuerier.java | 23 ++++++++----------- 4 files changed, 21 insertions(+), 19 deletions(-) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{executor => }/LambdaExample.java (98%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/{executor => }/MybatisPlusExecutor.java (99%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-sql/src/main/java/com/gitee/dorive/sql}/impl/CountQuerier.java (85%) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java similarity index 98% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java index 56893f48..c48d9448 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/executor/LambdaExample.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity.executor; +package com.gitee.dorive.spring.boot.starter.entity; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java similarity index 99% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index bd8ece04..a76b7998 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl.executor; +package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index b6b5677f..6865d835 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -34,8 +34,8 @@ import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import com.gitee.dorive.spring.boot.starter.impl.CountQuerier; -import com.gitee.dorive.spring.boot.starter.impl.executor.MybatisPlusExecutor; +import com.gitee.dorive.sql.impl.CountQuerier; +import com.gitee.dorive.spring.boot.starter.impl.MybatisPlusExecutor; import com.gitee.dorive.api.api.ImplFactory; import com.gitee.dorive.sql.api.SqlHelper; import com.gitee.dorive.sql.impl.SegmentBuilder; @@ -61,9 +61,14 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); + + SegmentBuilder segmentBuilder = new SegmentBuilder(); + ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); - this.sqlQueryBuilder = new SqlQueryBuilder(new SegmentBuilder(), implFactory.getInstance(SqlHelper.class)); - this.countQuerier = new CountQuerier(this); + SqlHelper sqlHelper = implFactory.getInstance(SqlHelper.class); + + this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlHelper); + this.countQuerier = new CountQuerier(this, segmentBuilder, sqlHelper); } @Override diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java similarity index 85% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index cbee0c1c..5589939c 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -15,17 +15,17 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.sql.impl; -import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.query.entity.BuildQuery; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.context.BoundedContext; +import com.gitee.dorive.query.entity.BuildQuery; +import com.gitee.dorive.query.repository.AbstractQueryRepository; +import com.gitee.dorive.sql.api.SqlHelper; import com.gitee.dorive.sql.entity.SegmentResult; import com.gitee.dorive.sql.entity.SelectSegment; -import com.gitee.dorive.sql.impl.SegmentBuilder; +import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; @@ -34,15 +34,12 @@ import java.util.List; import java.util.Map; @Data +@AllArgsConstructor public class CountQuerier { - private final AbstractQueryRepository repository; - private final SegmentBuilder segmentBuilder; - - public CountQuerier(AbstractQueryRepository repository) { - this.repository = repository; - this.segmentBuilder = new SegmentBuilder(); - } + private AbstractQueryRepository repository; + private SegmentBuilder segmentBuilder; + private SqlHelper sqlHelper; public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { BuildQuery buildQuery = repository.newQuery(query); @@ -69,7 +66,7 @@ public class CountQuerier { selectSegment.setColumns(columns); selectSegment.setGroupBy("GROUP BY " + groupByColumn); - List> resultMaps = SqlRunner.db().selectList(selectSegment.toString(), args.toArray()); + List> resultMaps = sqlHelper.selectList(selectSegment.toString(), args.toArray()); Map countMap = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); resultMaps.forEach(resultMap -> countMap.put(resultMap.get("recordId").toString(), (Long) resultMap.get("totalCount"))); return countMap; -- Gitee From ff897d77b9cd346d126d97bbe81cb921c3b6b0e4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 27 Nov 2023 18:12:23 +0800 Subject: [PATCH 020/146] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=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 --- .../{SegmentResult.java => BuildResult.java} | 4 +- .../gitee/dorive/sql/entity/JoinSegment.java | 9 +- .../gitee/dorive/sql/entity/OnSegment.java | 4 +- .../dorive/sql/entity/SelectSegment.java | 22 +-- .../{Segment.java => TableSegment.java} | 25 +-- .../gitee/dorive/sql/impl/CountQuerier.java | 8 +- .../gitee/dorive/sql/impl/SegmentBuilder.java | 159 +++++++++--------- .../dorive/sql/impl/SqlQueryBuilder.java | 10 +- 8 files changed, 109 insertions(+), 132 deletions(-) rename dorive-sql/src/main/java/com/gitee/dorive/sql/entity/{SegmentResult.java => BuildResult.java} (97%) rename dorive-sql/src/main/java/com/gitee/dorive/sql/entity/{Segment.java => TableSegment.java} (70%) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java similarity index 97% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java index 6d0ea2a1..33860f37 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SegmentResult.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java @@ -24,8 +24,8 @@ import java.util.List; @Data @AllArgsConstructor -public class SegmentResult { - private char letter; +public class BuildResult { private SelectSegment selectSegment; private List args; + private char letter; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java index 32f4373e..f2b9fe25 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/JoinSegment.java @@ -17,15 +17,14 @@ package com.gitee.dorive.sql.entity; +import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.List; @Data -@EqualsAndHashCode(callSuper = false) -public class JoinSegment extends Segment { - private String tableName; - private String tableAlias; +@AllArgsConstructor +public class JoinSegment { + private TableSegment tableSegment; private List onSegments; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java index 7a5a9f8d..6c0af7ac 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java @@ -18,11 +18,9 @@ package com.gitee.dorive.sql.entity; import lombok.Data; -import lombok.EqualsAndHashCode; @Data -@EqualsAndHashCode(callSuper = false) -public class OnSegment extends Segment { +public class OnSegment { private String tableAlias; private String column; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index 4c4e4825..0605fdad 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -22,19 +22,19 @@ import cn.hutool.db.sql.SqlBuilder; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Data -@EqualsAndHashCode(callSuper = false) -public class SelectSegment extends Segment { +public class SelectSegment { private boolean distinct; - private List columns; - private String tableName; - private String tableAlias; - private List joinSegments; - private List argSegments; + private List columns = Collections.emptyList(); + private TableSegment tableSegment; + private List joinSegments = new ArrayList<>(); + private List argSegments = new ArrayList<>(); private String groupBy; private String orderBy; private String limit; @@ -49,13 +49,7 @@ public class SelectSegment extends Segment { SqlBuilder sqlBuilder = SqlBuilder.create(); sqlBuilder.from(tableName + " " + tableAlias); for (JoinSegment joinSegment : joinSegments) { - if (joinSegment.isAvailable()) { - sqlBuilder.join(joinSegment.getTableName() + " " + joinSegment.getTableAlias(), SqlBuilder.Join.LEFT); - List onSegments = joinSegment.getOnSegments().stream() - .filter(onSegment -> onSegment.getDirectedSegments().get(0).isAvailable()) - .collect(Collectors.toList()); - sqlBuilder.on(StrUtil.join(" AND ", onSegments)); - } + sqlBuilder.on(StrUtil.join(" AND ", joinSegment.getOnSegments())); } sqlBuilder.where(StrUtil.join(" AND ", argSegments)); return sqlBuilder.toString(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java similarity index 70% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java index eac0a141..8e4075ff 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/Segment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java @@ -17,27 +17,12 @@ package com.gitee.dorive.sql.entity; +import lombok.AllArgsConstructor; import lombok.Data; -import java.util.List; - @Data -public class Segment { - - private boolean reachable; - private boolean dirtyQuery; - private List directedSegments; - - public boolean isAvailable() { - return reachable && dirtyQuery; - } - - public String getTableName() { - return null; - } - - public String getTableAlias() { - return null; - } - +@AllArgsConstructor +public class TableSegment { + private String tableName; + private String tableAlias; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index 5589939c..5c8818a9 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -23,7 +23,7 @@ import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlHelper; -import com.gitee.dorive.sql.entity.SegmentResult; +import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; import lombok.AllArgsConstructor; import lombok.Data; @@ -44,9 +44,9 @@ public class CountQuerier { public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { BuildQuery buildQuery = repository.newQuery(query); - SegmentResult segmentResult = segmentBuilder.buildSegment(context, buildQuery); - SelectSegment selectSegment = segmentResult.getSelectSegment(); - List args = segmentResult.getArgs(); + BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); + SelectSegment selectSegment = buildResult.getSelectSegment(); + List args = buildResult.getArgs(); EntityEle entityEle = repository.getEntityEle(); String groupByColumn = entityEle.toAlias(groupField); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 7a41e7b6..620dfb17 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -17,6 +17,7 @@ package com.gitee.dorive.sql.impl; +import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.context.Context; @@ -31,35 +32,41 @@ import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.sql.entity.ArgSegment; +import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.JoinSegment; import com.gitee.dorive.sql.entity.OnSegment; -import com.gitee.dorive.sql.entity.Segment; -import com.gitee.dorive.sql.entity.SegmentResult; import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.entity.TableSegment; import com.gitee.dorive.sql.util.CriterionUtils; +import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; @Data public class SegmentBuilder { - public SegmentResult buildSegment(Context context, BuildQuery buildQuery) { + public BuildResult buildSegment(Context context, BuildQuery buildQuery) { QueryResolver queryResolver = buildQuery.getQueryResolver(); Map exampleMap = buildQuery.getExampleMap(); List mergedRepositories = queryResolver.getMergedRepositories(); - Map segmentMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); - char letter = 'a'; - SelectSegment selectSegment = null; - List argSegments = new ArrayList<>(); + Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); + + SelectSegment selectSegment = new SelectSegment(); List args = new ArrayList<>(); + char letter = 'a'; for (MergedRepository mergedRepository : mergedRepositories) { + String tableAlias = String.valueOf(letter); + letter = (char) (letter + 1); + String lastAccessPath = mergedRepository.getLastAccessPath(); String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); @@ -72,55 +79,73 @@ public class SegmentBuilder { String tableName = (String) attachments.get(Keys.TABLE_NAME); FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); - String tableAlias = String.valueOf(letter); - letter = (char) (letter + 1); - Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); fieldExecutor.convert(context, example); - appendArguments(argSegments, args, tableAlias, example); + TableSegment tableSegment = new TableSegment(tableName, tableAlias); + Node node = new Node(tableSegment, example.isNotEmpty(), new ArrayList<>(4)); + nodeMap.put(relativeAccessPath, node); if ("/".equals(relativeAccessPath)) { - selectSegment = new SelectSegment(); - selectSegment.setReachable(true); - selectSegment.setDirtyQuery(example.isNotEmpty()); - selectSegment.setDirectedSegments(new ArrayList<>(8)); - selectSegment.setDistinct(false); - selectSegment.setColumns(Collections.emptyList()); - selectSegment.setTableName(tableName); - selectSegment.setTableAlias(tableAlias); - selectSegment.setJoinSegments(new ArrayList<>()); - selectSegment.setArgSegments(argSegments); - segmentMap.put(relativeAccessPath, selectSegment); + node.setDirty(true); + selectSegment.setTableSegment(tableSegment); } else { - JoinSegment joinSegment = new JoinSegment(); - joinSegment.setReachable(false); - joinSegment.setDirtyQuery(example.isNotEmpty()); - joinSegment.setDirectedSegments(new ArrayList<>(4)); - joinSegment.setTableName(tableName); - joinSegment.setTableAlias(tableAlias); - - List onSegments = newOnSegments(segmentMap, lastAccessPath, binderResolver, tableAlias, joinSegment); - joinSegment.setOnSegments(onSegments); - - if (selectSegment != null) { - List joinSegments = selectSegment.getJoinSegments(); - joinSegments.add(joinSegment); + List onSegments = newOnSegments(nodeMap, lastAccessPath, binderResolver, tableAlias, node); + if (onSegments.isEmpty()) { + nodeMap.remove(relativeAccessPath); + continue; } - - segmentMap.put(relativeAccessPath, joinSegment); + JoinSegment joinSegment = new JoinSegment(tableSegment, onSegments); + List joinSegments = selectSegment.getJoinSegments(); + joinSegments.add(joinSegment); } - } - if (selectSegment != null) { - markReachableAndDirty(selectSegment); + appendArguments(selectSegment, args, tableAlias, example); } - return new SegmentResult(letter, selectSegment, args); + markDirty(nodeMap.get("/")); + Set tableSegments = new LinkedHashSet<>(); + nodeMap.forEach((path, node) -> { + if (node.isDirty()) { + tableSegments.add(node.getTableSegment()); + } + }); + List joinSegments = selectSegment.getJoinSegments(); + joinSegments = CollUtil.filter(joinSegments, joinSegment -> tableSegments.contains(joinSegment.getTableSegment())); + selectSegment.setJoinSegments(joinSegments); + + return new BuildResult(selectSegment, args, letter); + } + + private List newOnSegments(Map nodeMap, String lastAccessPath, BinderResolver binderResolver, String tableAlias, Node node) { + List propertyBinders = binderResolver.getPropertyBinders(); + List onSegments = new ArrayList<>(propertyBinders.size()); + + for (PropertyBinder propertyBinder : propertyBinders) { + String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); + Node targetNode = nodeMap.get(relativeAccessPath); + if (targetNode != null) { + TableSegment tableSegment = targetNode.getTableSegment(); + List children = targetNode.getChildren(); + + if (!children.contains(node)) { + children.add(node); + } + + OnSegment onSegment = new OnSegment(); + onSegment.setTableAlias(tableAlias); + onSegment.setColumn(propertyBinder.getAlias()); + onSegment.setJoinTableAlias(tableSegment.getTableAlias()); + onSegment.setJoinColumn(propertyBinder.getBindAlias()); + onSegments.add(onSegment); + } + } + return onSegments; } - private void appendArguments(List argSegments, List args, String tableAlias, Example example) { + private void appendArguments(SelectSegment selectSegment, List args, String tableAlias, Example example) { + List argSegments = selectSegment.getArgSegments(); for (Criterion criterion : example.getCriteria()) { String property = criterion.getProperty(); String operator = CriterionUtils.getOperator(criterion); @@ -138,48 +163,24 @@ public class SegmentBuilder { } } - private List newOnSegments(Map segmentMap, - String lastAccessPath, - BinderResolver binderResolver, - String tableAlias, - JoinSegment joinSegment) { - List propertyBinders = binderResolver.getPropertyBinders(); - List onSegments = new ArrayList<>(propertyBinders.size()); - - for (PropertyBinder propertyBinder : propertyBinders) { - String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); - Segment segment = segmentMap.get(relativeAccessPath); - if (segment != null) { - String alias = propertyBinder.getAlias(); - String joinTableAlias = segment.getTableAlias(); - String bindAlias = propertyBinder.getBindAlias(); - - OnSegment onSegment = new OnSegment(); - onSegment.setDirectedSegments(Collections.singletonList(segment)); - onSegment.setTableAlias(tableAlias); - onSegment.setColumn(alias); - onSegment.setJoinTableAlias(joinTableAlias); - onSegment.setJoinColumn(bindAlias); - onSegments.add(onSegment); - - List directedSegments = segment.getDirectedSegments(); - if (!directedSegments.contains(joinSegment)) { - directedSegments.add(joinSegment); + private void markDirty(Node node) { + if (node != null) { + List children = node.getChildren(); + for (Node child : children) { + markDirty(child); + if (child.isDirty()) { + node.setDirty(true); } } } - return onSegments; } - private void markReachableAndDirty(Segment lastSegment) { - List directedSegments = lastSegment.getDirectedSegments(); - for (Segment directedSegment : directedSegments) { - directedSegment.setReachable(true); - markReachableAndDirty(directedSegment); - if (directedSegment.isDirtyQuery()) { - lastSegment.setDirtyQuery(true); - } - } + @Data + @AllArgsConstructor + public static class Node { + private TableSegment tableSegment; + private boolean dirty; + private List children; } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 08e83bda..c484e9c7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -26,7 +26,7 @@ import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.sql.api.SqlHelper; -import com.gitee.dorive.sql.entity.SegmentResult; +import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; import lombok.AllArgsConstructor; import lombok.Data; @@ -52,10 +52,10 @@ public class SqlQueryBuilder implements QueryBuilder { buildQuery.setExample(newExample); Page page = newExample.getPage(); - SegmentResult segmentResult = segmentBuilder.buildSegment(context, buildQuery); - char letter = segmentResult.getLetter(); - SelectSegment selectSegment = segmentResult.getSelectSegment(); - List args = segmentResult.getArgs(); + BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); + char letter = buildResult.getLetter(); + SelectSegment selectSegment = buildResult.getSelectSegment(); + List args = buildResult.getArgs(); if (selectSegment == null) { throw new RuntimeException("Unable to build SQL statement!"); -- Gitee From b1ee4243beeb3508266b65d47ef7ac595c675b57 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 27 Nov 2023 23:18:13 +0800 Subject: [PATCH 021/146] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=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 --- .../dorive/sql/entity/SelectSegment.java | 19 +++++- .../gitee/dorive/sql/entity/TableSegment.java | 11 ++++ .../gitee/dorive/sql/impl/CountQuerier.java | 5 +- .../gitee/dorive/sql/impl/SegmentBuilder.java | 65 ++++++------------- .../dorive/sql/impl/SqlQueryBuilder.java | 16 ++--- 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index 0605fdad..bf2b779a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -20,12 +20,10 @@ package com.gitee.dorive.sql.entity; import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; @Data public class SelectSegment { @@ -39,6 +37,19 @@ public class SelectSegment { private String orderBy; private String limit; + public void filterSegments() { + 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()); + } + } + joinSegments = newJoinSegments; + } + public String selectSql() { SqlBuilder sqlBuilder = SqlBuilder.create(); sqlBuilder.select(distinct, columns); @@ -47,8 +58,10 @@ public class SelectSegment { public String fromWhereSql() { SqlBuilder sqlBuilder = SqlBuilder.create(); - sqlBuilder.from(tableName + " " + tableAlias); + 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())); } sqlBuilder.where(StrUtil.join(" AND ", argSegments)); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java index 8e4075ff..5d563ff7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/TableSegment.java @@ -20,9 +20,20 @@ package com.gitee.dorive.sql.entity; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.List; + @Data @AllArgsConstructor public class TableSegment { + private String tableName; private String tableAlias; + private boolean join; + private List argSegments; + + @Override + public String toString() { + return tableName + " " + tableAlias; + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index 5c8818a9..dfc5a413 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -25,6 +25,7 @@ import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlHelper; import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; import lombok.Data; @@ -48,11 +49,13 @@ public class CountQuerier { SelectSegment selectSegment = buildResult.getSelectSegment(); List args = buildResult.getArgs(); + TableSegment tableSegment = selectSegment.getTableSegment(); + EntityEle entityEle = repository.getEntityEle(); String groupByColumn = entityEle.toAlias(groupField); String countColumn = entityEle.toAlias(countField); - String tableAlias = selectSegment.getTableAlias(); + String tableAlias = tableSegment.getTableAlias(); groupByColumn = tableAlias + "." + groupByColumn; countColumn = tableAlias + "." + countColumn; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 620dfb17..80ebb909 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -17,7 +17,6 @@ package com.gitee.dorive.sql.impl; -import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.context.Context; @@ -31,23 +30,12 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.resolver.QueryResolver; -import com.gitee.dorive.sql.entity.ArgSegment; -import com.gitee.dorive.sql.entity.BuildResult; -import com.gitee.dorive.sql.entity.JoinSegment; -import com.gitee.dorive.sql.entity.OnSegment; -import com.gitee.dorive.sql.entity.SelectSegment; -import com.gitee.dorive.sql.entity.TableSegment; +import com.gitee.dorive.sql.entity.*; import com.gitee.dorive.sql.util.CriterionUtils; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Data public class SegmentBuilder { @@ -58,7 +46,6 @@ public class SegmentBuilder { List mergedRepositories = queryResolver.getMergedRepositories(); Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); - SelectSegment selectSegment = new SelectSegment(); List args = new ArrayList<>(); char letter = 'a'; @@ -67,14 +54,10 @@ public class SegmentBuilder { String tableAlias = String.valueOf(letter); letter = (char) (letter + 1); - String lastAccessPath = mergedRepository.getLastAccessPath(); String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - BinderResolver binderResolver = definedRepository.getBinderResolver(); - Map attachments = executedRepository.getAttachments(); String tableName = (String) attachments.get(Keys.TABLE_NAME); FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); @@ -82,16 +65,15 @@ public class SegmentBuilder { Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); fieldExecutor.convert(context, example); - TableSegment tableSegment = new TableSegment(tableName, tableAlias); - Node node = new Node(tableSegment, example.isNotEmpty(), new ArrayList<>(4)); + TableSegment tableSegment = new TableSegment(tableName, tableAlias, example.isNotEmpty(), new ArrayList<>(example.getCriteria().size())); + Node node = new Node(tableSegment, new ArrayList<>(4)); nodeMap.put(relativeAccessPath, node); if ("/".equals(relativeAccessPath)) { - node.setDirty(true); selectSegment.setTableSegment(tableSegment); } else { - List onSegments = newOnSegments(nodeMap, lastAccessPath, binderResolver, tableAlias, node); + List onSegments = newOnSegments(nodeMap, mergedRepository, tableAlias, node); if (onSegments.isEmpty()) { nodeMap.remove(relativeAccessPath); continue; @@ -101,38 +83,30 @@ public class SegmentBuilder { joinSegments.add(joinSegment); } - appendArguments(selectSegment, args, tableAlias, example); + appendArguments(args, tableAlias, example, tableSegment); } - markDirty(nodeMap.get("/")); - Set tableSegments = new LinkedHashSet<>(); - nodeMap.forEach((path, node) -> { - if (node.isDirty()) { - tableSegments.add(node.getTableSegment()); - } - }); - List joinSegments = selectSegment.getJoinSegments(); - joinSegments = CollUtil.filter(joinSegments, joinSegment -> tableSegments.contains(joinSegment.getTableSegment())); - selectSegment.setJoinSegments(joinSegments); + markTableSegmentJoin(nodeMap.get("/")); + selectSegment.filterSegments(); return new BuildResult(selectSegment, args, letter); } - private List newOnSegments(Map nodeMap, String lastAccessPath, BinderResolver binderResolver, String tableAlias, Node node) { + private List newOnSegments(Map nodeMap, MergedRepository mergedRepository, String tableAlias, Node node) { + String lastAccessPath = mergedRepository.getLastAccessPath(); + CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + BinderResolver binderResolver = definedRepository.getBinderResolver(); List propertyBinders = binderResolver.getPropertyBinders(); List onSegments = new ArrayList<>(propertyBinders.size()); - for (PropertyBinder propertyBinder : propertyBinders) { String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); Node targetNode = nodeMap.get(relativeAccessPath); if (targetNode != null) { TableSegment tableSegment = targetNode.getTableSegment(); List children = targetNode.getChildren(); - if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment(); onSegment.setTableAlias(tableAlias); onSegment.setColumn(propertyBinder.getAlias()); @@ -144,8 +118,8 @@ public class SegmentBuilder { return onSegments; } - private void appendArguments(SelectSegment selectSegment, List args, String tableAlias, Example example) { - List argSegments = selectSegment.getArgSegments(); + private void appendArguments(List args, String tableAlias, Example example, TableSegment tableSegment) { + List argSegments = tableSegment.getArgSegments(); for (Criterion criterion : example.getCriteria()) { String property = criterion.getProperty(); String operator = CriterionUtils.getOperator(criterion); @@ -163,13 +137,15 @@ public class SegmentBuilder { } } - private void markDirty(Node node) { + private void markTableSegmentJoin(Node node) { if (node != null) { + TableSegment tableSegment = node.getTableSegment(); List children = node.getChildren(); for (Node child : children) { - markDirty(child); - if (child.isDirty()) { - node.setDirty(true); + markTableSegmentJoin(child); + TableSegment childTableSegment = child.getTableSegment(); + if (childTableSegment.isJoin()) { + tableSegment.setJoin(true); } } } @@ -179,7 +155,6 @@ public class SegmentBuilder { @AllArgsConstructor public static class Node { private TableSegment tableSegment; - private boolean dirty; private List children; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index c484e9c7..55f83647 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -26,8 +26,10 @@ import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.entity.ArgSegment; import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; import lombok.Data; @@ -53,24 +55,20 @@ public class SqlQueryBuilder implements QueryBuilder { Page page = newExample.getPage(); BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); - char letter = buildResult.getLetter(); SelectSegment selectSegment = buildResult.getSelectSegment(); List args = buildResult.getArgs(); + char letter = buildResult.getLetter(); - if (selectSegment == null) { - throw new RuntimeException("Unable to build SQL statement!"); - } - if (selectSegment.getArgSegments().isEmpty()) { - return buildQuery; - } - if (!selectSegment.isDirtyQuery()) { + TableSegment tableSegment = selectSegment.getTableSegment(); + List argSegments = selectSegment.getArgSegments(); + if (!tableSegment.isJoin() || argSegments.isEmpty()) { return buildQuery; } selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); - String tableAlias = selectSegment.getTableAlias(); + String tableAlias = tableSegment.getTableAlias(); selectColumns.add(tableAlias + ".id"); selectSegment.setColumns(selectColumns); -- Gitee From 472d30be1581b16b00a1ffd5ca7b177aa46428e6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 09:36:33 +0800 Subject: [PATCH 022/146] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=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 --- .../main/java/com/gitee/dorive/sql/entity/SelectSegment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index bf2b779a..6f323d32 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -38,7 +38,9 @@ public class SelectSegment { private String limit; public void filterSegments() { - argSegments.addAll(tableSegment.getArgSegments()); + if (tableSegment.isJoin()) { + argSegments.addAll(tableSegment.getArgSegments()); + } List newJoinSegments = new ArrayList<>(joinSegments.size()); for (JoinSegment joinSegment : joinSegments) { TableSegment tableSegment = joinSegment.getTableSegment(); -- Gitee From c2f21a6fac7f340cd89f9f4d3feb8503ff950bc7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 09:42:06 +0800 Subject: [PATCH 023/146] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=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 --- .../main/java/com/gitee/dorive/sql/entity/SelectSegment.java | 2 +- .../src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index 6f323d32..f9d83e5f 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -37,7 +37,7 @@ public class SelectSegment { private String orderBy; private String limit; - public void filterSegments() { + public void filterTableSegments() { if (tableSegment.isJoin()) { argSegments.addAll(tableSegment.getArgSegments()); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 80ebb909..ed2b72f2 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -87,7 +87,7 @@ public class SegmentBuilder { } markTableSegmentJoin(nodeMap.get("/")); - selectSegment.filterSegments(); + selectSegment.filterTableSegments(); return new BuildResult(selectSegment, args, letter); } -- Gitee From 7d7474f72d08a570ec16e97a324ef575c3d09cf7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 10:03:18 +0800 Subject: [PATCH 024/146] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E9=94=99=E4=B9=B1=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 --- .../java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 55f83647..b90b2542 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -50,9 +50,9 @@ public class SqlQueryBuilder implements QueryBuilder { Example example = buildQuery.getExample(); OrderBy orderBy = example.getOrderBy(); - Example newExample = ExampleUtils.tryClone(example); - buildQuery.setExample(newExample); - Page page = newExample.getPage(); + example = ExampleUtils.tryClone(example); + buildQuery.setExample(example); + Page page = example.getPage(); BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); SelectSegment selectSegment = buildResult.getSelectSegment(); -- Gitee From ec49213b3c37bca68e38056e2c5e348122d512c8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 10:19:11 +0800 Subject: [PATCH 025/146] =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/sql/entity/BuildResult.java | 31 ------------------- .../dorive/sql/entity/SelectSegment.java | 8 +++++ .../gitee/dorive/sql/impl/CountQuerier.java | 7 ++--- .../gitee/dorive/sql/impl/SegmentBuilder.java | 18 +++++------ .../dorive/sql/impl/SqlQueryBuilder.java | 8 ++--- 5 files changed, 21 insertions(+), 51 deletions(-) delete mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.java deleted file mode 100644 index 33860f37..00000000 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/BuildResult.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.sql.entity; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.List; - -@Data -@AllArgsConstructor -public class BuildResult { - private SelectSegment selectSegment; - private List args; - private char letter; -} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index f9d83e5f..07012d86 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -28,15 +28,23 @@ import java.util.List; @Data public class SelectSegment { + private char letter = 'a'; private boolean distinct; private List columns = Collections.emptyList(); private TableSegment tableSegment; private List joinSegments = 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()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index dfc5a413..fa442cd8 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -23,7 +23,6 @@ import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlHelper; -import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; @@ -45,11 +44,9 @@ public class CountQuerier { public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { BuildQuery buildQuery = repository.newQuery(query); - BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); - SelectSegment selectSegment = buildResult.getSelectSegment(); - List args = buildResult.getArgs(); - + SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); TableSegment tableSegment = selectSegment.getTableSegment(); + List args = selectSegment.getArgs(); EntityEle entityEle = repository.getEntityEle(); String groupByColumn = entityEle.toAlias(groupField); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index ed2b72f2..63b6785b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -40,19 +40,17 @@ import java.util.*; @Data public class SegmentBuilder { - public BuildResult buildSegment(Context context, BuildQuery buildQuery) { + public SelectSegment buildSegment(Context context, BuildQuery buildQuery) { QueryResolver queryResolver = buildQuery.getQueryResolver(); Map exampleMap = buildQuery.getExampleMap(); List mergedRepositories = queryResolver.getMergedRepositories(); Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); SelectSegment selectSegment = new SelectSegment(); - List args = new ArrayList<>(); - char letter = 'a'; + List joinSegments = selectSegment.getJoinSegments(); for (MergedRepository mergedRepository : mergedRepositories) { - String tableAlias = String.valueOf(letter); - letter = (char) (letter + 1); + String tableAlias = selectSegment.generateTableAlias(); String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); @@ -79,17 +77,15 @@ public class SegmentBuilder { continue; } JoinSegment joinSegment = new JoinSegment(tableSegment, onSegments); - List joinSegments = selectSegment.getJoinSegments(); joinSegments.add(joinSegment); } - appendArguments(args, tableAlias, example, tableSegment); + appendArguments(selectSegment, tableAlias, example, tableSegment); } markTableSegmentJoin(nodeMap.get("/")); selectSegment.filterTableSegments(); - - return new BuildResult(selectSegment, args, letter); + return selectSegment; } private List newOnSegments(Map nodeMap, MergedRepository mergedRepository, String tableAlias, Node node) { @@ -97,6 +93,7 @@ public class SegmentBuilder { CommonRepository definedRepository = mergedRepository.getDefinedRepository(); BinderResolver binderResolver = definedRepository.getBinderResolver(); List propertyBinders = binderResolver.getPropertyBinders(); + List onSegments = new ArrayList<>(propertyBinders.size()); for (PropertyBinder propertyBinder : propertyBinders) { String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); @@ -118,7 +115,8 @@ public class SegmentBuilder { return onSegments; } - private void appendArguments(List args, String tableAlias, Example example, TableSegment tableSegment) { + private void appendArguments(SelectSegment selectSegment, String tableAlias, Example example, TableSegment tableSegment) { + List args = selectSegment.getArgs(); List argSegments = tableSegment.getArgSegments(); for (Criterion criterion : example.getCriteria()) { String property = criterion.getProperty(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index b90b2542..c0c9799a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -27,7 +27,6 @@ import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.sql.api.SqlHelper; import com.gitee.dorive.sql.entity.ArgSegment; -import com.gitee.dorive.sql.entity.BuildResult; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; @@ -54,10 +53,9 @@ public class SqlQueryBuilder implements QueryBuilder { buildQuery.setExample(example); Page page = example.getPage(); - BuildResult buildResult = segmentBuilder.buildSegment(context, buildQuery); - SelectSegment selectSegment = buildResult.getSelectSegment(); - List args = buildResult.getArgs(); - char letter = buildResult.getLetter(); + SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); + char letter = selectSegment.getLetter(); + List args = selectSegment.getArgs(); TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); -- Gitee From 2299d042282f3ffdf47d345d596b824c3eb1d54c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 10:28:01 +0800 Subject: [PATCH 026/146] =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/sql/entity/ArgSegment.java | 2 -- .../main/java/com/gitee/dorive/sql/entity/OnSegment.java | 2 ++ .../java/com/gitee/dorive/sql/impl/SegmentBuilder.java | 7 ++----- .../java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 4 ++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java index 0019c6c6..c56c2079 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/ArgSegment.java @@ -19,10 +19,8 @@ package com.gitee.dorive.sql.entity; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @AllArgsConstructor public class ArgSegment { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java index 6c0af7ac..9773da95 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/OnSegment.java @@ -17,9 +17,11 @@ package com.gitee.dorive.sql.entity; +import lombok.AllArgsConstructor; import lombok.Data; @Data +@AllArgsConstructor public class OnSegment { private String tableAlias; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 63b6785b..466ceed7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -104,11 +104,8 @@ public class SegmentBuilder { if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment(); - onSegment.setTableAlias(tableAlias); - onSegment.setColumn(propertyBinder.getAlias()); - onSegment.setJoinTableAlias(tableSegment.getTableAlias()); - onSegment.setJoinColumn(propertyBinder.getBindAlias()); + OnSegment onSegment = new OnSegment(tableAlias, propertyBinder.getAlias(), + tableSegment.getTableAlias(), propertyBinder.getBindAlias()); onSegments.add(onSegment); } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index c0c9799a..a79f3f41 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -55,10 +55,10 @@ public class SqlQueryBuilder implements QueryBuilder { SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); char letter = selectSegment.getLetter(); - List args = selectSegment.getArgs(); - TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); + List args = selectSegment.getArgs(); + if (!tableSegment.isJoin() || argSegments.isEmpty()) { return buildQuery; } -- Gitee From 7dd5d56a2b09a7f3df887c5be8f6e737acb87723 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 10:33:09 +0800 Subject: [PATCH 027/146] =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 466ceed7..0d9ceedd 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -80,7 +80,7 @@ public class SegmentBuilder { joinSegments.add(joinSegment); } - appendArguments(selectSegment, tableAlias, example, tableSegment); + addTableSegmentArgs(selectSegment, tableAlias, example, tableSegment); } markTableSegmentJoin(nodeMap.get("/")); @@ -112,7 +112,7 @@ public class SegmentBuilder { return onSegments; } - private void appendArguments(SelectSegment selectSegment, String tableAlias, Example example, TableSegment tableSegment) { + private void addTableSegmentArgs(SelectSegment selectSegment, String tableAlias, Example example, TableSegment tableSegment) { List args = selectSegment.getArgs(); List argSegments = tableSegment.getArgSegments(); for (Criterion criterion : example.getCriteria()) { -- Gitee From c20d0210f65339665007e7cf0e2dec06c63b9dd5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 10:43:01 +0800 Subject: [PATCH 028/146] =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/sql/entity/SelectSegment.java | 4 ++-- .../src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java | 2 +- .../main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java index 07012d86..f01c1393 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/entity/SelectSegment.java @@ -30,7 +30,7 @@ public class SelectSegment { private char letter = 'a'; private boolean distinct; - private List columns = Collections.emptyList(); + private List selectColumns = Collections.emptyList(); private TableSegment tableSegment; private List joinSegments = new ArrayList<>(); private List argSegments = new ArrayList<>(); @@ -62,7 +62,7 @@ public class SelectSegment { public String selectSql() { SqlBuilder sqlBuilder = SqlBuilder.create(); - sqlBuilder.select(distinct, columns); + sqlBuilder.select(distinct, selectColumns); return sqlBuilder.toString(); } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index fa442cd8..7cda15cf 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -63,7 +63,7 @@ public class CountQuerier { } else { columns.add("count(" + countColumn + ") AS totalCount"); } - selectSegment.setColumns(columns); + selectSegment.setSelectColumns(columns); selectSegment.setGroupBy("GROUP BY " + groupByColumn); List> resultMaps = sqlHelper.selectList(selectSegment.toString(), args.toArray()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index a79f3f41..d4bc0045 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -68,7 +68,7 @@ public class SqlQueryBuilder implements QueryBuilder { List selectColumns = new ArrayList<>(2); String tableAlias = tableSegment.getTableAlias(); selectColumns.add(tableAlias + ".id"); - selectSegment.setColumns(selectColumns); + selectSegment.setSelectColumns(selectColumns); String fromWhereSql = selectSegment.fromWhereSql(); -- Gitee From 41b33573975e878b09b9397b4e548b19735e5521 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 11:03:58 +0800 Subject: [PATCH 029/146] =?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/SqlQueryBuilder.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index d4bc0045..df87a3a8 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -63,17 +63,18 @@ public class SqlQueryBuilder implements QueryBuilder { return buildQuery; } - selectSegment.setDistinct(true); + String tableAlias = tableSegment.getTableAlias(); + selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); - String tableAlias = tableSegment.getTableAlias(); selectColumns.add(tableAlias + ".id"); selectSegment.setSelectColumns(selectColumns); + String selectSql = selectSegment.selectSql(); String fromWhereSql = selectSegment.fromWhereSql(); if (page != null) { - String countSql = selectSegment.selectSql() + fromWhereSql; + String countSql = selectSql + fromWhereSql; long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); buildQuery.setPageQueried(true); @@ -83,10 +84,12 @@ public class SqlQueryBuilder implements QueryBuilder { } } + boolean rebuildSql = false; if (orderBy != null) { for (String property : orderBy.getProperties()) { if (!"id".equals(property)) { selectColumns.add(tableAlias + "." + property); + rebuildSql = true; } } selectSegment.setOrderBy(orderBy.toString()); @@ -95,8 +98,11 @@ public class SqlQueryBuilder implements QueryBuilder { selectSegment.setLimit(page.toString()); } - String selectSql = selectSegment.selectSql() + fromWhereSql + selectSegment.lastSql(); - List> resultMaps = sqlHelper.selectList(selectSql, args.toArray()); + if (rebuildSql) { + selectSql = selectSegment.selectSql(); + } + String sql = selectSql + fromWhereSql + selectSegment.lastSql(); + List> resultMaps = sqlHelper.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.eq("id", primaryKeys); -- Gitee From 9c6947a80e7d959b189ca421135ae8d5692c53b3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 11:04:31 +0800 Subject: [PATCH 030/146] =?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 --- .../java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index df87a3a8..9ae25b7b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -94,13 +94,14 @@ public class SqlQueryBuilder implements QueryBuilder { } selectSegment.setOrderBy(orderBy.toString()); } + if (rebuildSql) { + selectSql = selectSegment.selectSql(); + } + if (page != null) { selectSegment.setLimit(page.toString()); } - if (rebuildSql) { - selectSql = selectSegment.selectSql(); - } String sql = selectSql + fromWhereSql + selectSegment.lastSql(); List> resultMaps = sqlHelper.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); -- Gitee From 4fd8e05bf7a7922dc396c853088f803458f820ea Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 11:09:48 +0800 Subject: [PATCH 031/146] =?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 --- .../java/com/gitee/dorive/query/api/QueryBuilder.java | 2 +- .../com/gitee/dorive/query/impl/DefaultQueryBuilder.java | 2 +- .../dorive/query/repository/AbstractQueryRepository.java | 8 ++++---- .../java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java index 85f49b83..86322068 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java @@ -22,6 +22,6 @@ import com.gitee.dorive.query.entity.BuildQuery; public interface QueryBuilder { - BuildQuery build(Context context, Object query); + BuildQuery buildQuery(Context context, Object query); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index 3993fb7c..c8402f8b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -40,7 +40,7 @@ import java.util.stream.Collectors; public class DefaultQueryBuilder implements QueryBuilder { @Override - public BuildQuery build(Context context, Object query) { + public BuildQuery buildQuery(Context context, Object query) { BuildQuery buildQuery = (BuildQuery) query; Map exampleWrapperMap = buildExampleWrapperMap(buildQuery); 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 176ff815..c993888b 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 @@ -65,10 +65,10 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } @Override - public BuildQuery build(Context context, Object query) { + public BuildQuery buildQuery(Context context, Object query) { BuildQuery buildQuery = newQuery(query); QueryBuilder queryBuilder = adaptiveBuilder(context, buildQuery); - return queryBuilder.build(context, buildQuery); + return queryBuilder.buildQuery(context, buildQuery); } public BuildQuery newQuery(Object query) { @@ -84,7 +84,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public List selectByQuery(Context context, Object query) { - BuildQuery buildQuery = build(context, query); + BuildQuery buildQuery = buildQuery(context, query); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { return Collections.emptyList(); @@ -98,7 +98,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { - BuildQuery buildQuery = build(context, query); + BuildQuery buildQuery = buildQuery(context, query); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { return (Page) example.getPage(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 9ae25b7b..38e1eec5 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -44,7 +44,7 @@ public class SqlQueryBuilder implements QueryBuilder { private SqlHelper sqlHelper; @Override - public BuildQuery build(Context context, Object query) { + public BuildQuery buildQuery(Context context, Object query) { BuildQuery buildQuery = (BuildQuery) query; Example example = buildQuery.getExample(); OrderBy orderBy = example.getOrderBy(); -- Gitee From d6d5c41e87630a3963336e6567ec02f9aa9ddf8c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 13:02:01 +0800 Subject: [PATCH 032/146] =?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 --- .../main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 38e1eec5..4d83ff85 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -106,7 +106,7 @@ public class SqlQueryBuilder implements QueryBuilder { List> resultMaps = sqlHelper.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { - example.eq("id", primaryKeys); + example.in("id", primaryKeys); } else { buildQuery.setAbandoned(true); } -- Gitee From e68a0a9936338c0ae08819c18641c552ed41d674 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 28 Nov 2023 14:27:58 +0800 Subject: [PATCH 033/146] =?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 --- .../spring/boot/starter/repository/MybatisPlusRepository.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 6865d835..0dbdf33a 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -61,12 +61,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); - SegmentBuilder segmentBuilder = new SegmentBuilder(); - ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); SqlHelper sqlHelper = implFactory.getInstance(SqlHelper.class); - this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlHelper); this.countQuerier = new CountQuerier(this, segmentBuilder, sqlHelper); } -- Gitee From 40cd7e464eccf2a9268435f1ae5f401fb710aa2a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 29 Nov 2023 13:43:57 +0800 Subject: [PATCH 034/146] =?UTF-8?q?=E5=A4=8D=E6=9D=82=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=94=AF=E6=8C=81selectCountByQuery=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/api/QueryBuilder.java | 2 +- .../dorive/query/api/QueryRepository.java | 2 + .../gitee/dorive/query/entity/BuildQuery.java | 3 +- .../query/impl/DefaultQueryBuilder.java | 7 +--- .../query/impl/resolver/QueryResolver.java | 2 +- .../repository/AbstractQueryRepository.java | 37 +++++++++++++++---- .../com/gitee/dorive/ref/impl/RefImpl.java | 5 +++ .../repository/MybatisPlusRepository.java | 4 +- .../dorive/sql/impl/SqlQueryBuilder.java | 24 ++++++++---- 9 files changed, 60 insertions(+), 26 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java index 86322068..1f905540 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java @@ -22,6 +22,6 @@ import com.gitee.dorive.query.entity.BuildQuery; public interface QueryBuilder { - BuildQuery buildQuery(Context context, Object query); + void buildQuery(Context context, BuildQuery buildQuery); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java index aeae32c9..5047bf61 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java @@ -29,4 +29,6 @@ public interface QueryRepository extends ListableRepository { Page selectPageByQuery(Context context, Object query); + long selectCountByQuery(Context context, Object query); + } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index 7ae3e71b..2cc7687b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -31,6 +31,7 @@ public class BuildQuery { private Object query; private Map exampleMap; private Example example; + private boolean onlyCount; private boolean abandoned; - private boolean pageQueried; + private boolean countQueried; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java index c8402f8b..547f18e6 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java @@ -40,16 +40,11 @@ import java.util.stream.Collectors; public class DefaultQueryBuilder implements QueryBuilder { @Override - public BuildQuery buildQuery(Context context, Object query) { - BuildQuery buildQuery = (BuildQuery) query; - + public void buildQuery(Context context, BuildQuery buildQuery) { Map exampleWrapperMap = buildExampleWrapperMap(buildQuery); executeQuery(context, exampleWrapperMap); - ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); buildQuery.setAbandoned(exampleWrapper.isAbandoned()); - - return buildQuery; } private Map buildExampleWrapperMap(BuildQuery buildQuery) { 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 db803b4b..f25f380f 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 @@ -46,7 +46,7 @@ public class QueryResolver { example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new BuildQuery(this, query, exampleMap, example, false, false); + return new BuildQuery(this, query, exampleMap, example, false, false, false); } 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 c993888b..45ada81c 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 @@ -42,7 +42,7 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryBuilder, QueryRepository { +public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryRepository { private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; @@ -64,11 +64,18 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } } - @Override - public BuildQuery buildQuery(Context context, Object query) { + public BuildQuery buildQuery(Context context, Object query, QueryBuilder builder) { BuildQuery buildQuery = newQuery(query); - QueryBuilder queryBuilder = adaptiveBuilder(context, buildQuery); - return queryBuilder.buildQuery(context, buildQuery); + if (builder != null) { + builder.buildQuery(context, buildQuery); + } + QueryBuilder queryBuilder = adaptiveQueryBuilder(context, buildQuery); + queryBuilder.buildQuery(context, buildQuery); + return buildQuery; + } + + public BuildQuery buildQuery(Context context, Object query) { + return buildQuery(context, query, null); } public BuildQuery newQuery(Object query) { @@ -78,7 +85,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi return queryResolver.newQuery(query); } - protected QueryBuilder adaptiveBuilder(Context context, BuildQuery buildQuery) { + protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { return queryBuilder; } @@ -89,7 +96,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return Collections.emptyList(); } - if (buildQuery.isPageQueried()) { + if (buildQuery.isCountQueried()) { example.setPage(null); } return selectByExample(context, example); @@ -103,7 +110,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return (Page) example.getPage(); } - if (buildQuery.isPageQueried()) { + if (buildQuery.isCountQueried()) { Page page = example.getPage(); example.setPage(null); List records = selectByExample(context, example); @@ -113,4 +120,18 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi return selectPageByExample(context, example); } + @Override + public long selectCountByQuery(Context context, Object query) { + BuildQuery buildQuery = buildQuery(context, query, (ctx, q) -> q.setOnlyCount(true)); + Example example = buildQuery.getExample(); + if (buildQuery.isAbandoned()) { + return 0L; + } + if (buildQuery.isCountQueried()) { + Page page = example.getPage(); + return page.getTotal(); + } + return selectCountByExample(context, example); + } + } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java index 43230cda..2ee9690a 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java @@ -72,6 +72,11 @@ public class RefImpl extends AbstractProxyRepository implements Ref { return repository.selectPageByQuery(context, query); } + @Override + public long selectCountByQuery(Context context, Object query) { + return repository.selectCountByQuery(context, query); + } + @Override @SuppressWarnings("unchecked") public > R get() { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 0dbdf33a..7f02514d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -157,13 +157,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - protected QueryBuilder adaptiveBuilder(Context context, BuildQuery buildQuery) { + protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { Map attachments = context.getAttachments(); String querier = (String) attachments.get(Keys.QUERIER); if (querier == null || "SQL".equals(querier)) { return sqlQueryBuilder; } - return super.adaptiveBuilder(context, buildQuery); + return super.adaptiveQueryBuilder(context, buildQuery); } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 4d83ff85..4cba52ec 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -44,9 +44,9 @@ public class SqlQueryBuilder implements QueryBuilder { private SqlHelper sqlHelper; @Override - public BuildQuery buildQuery(Context context, Object query) { - BuildQuery buildQuery = (BuildQuery) query; + public void buildQuery(Context context, BuildQuery buildQuery) { Example example = buildQuery.getExample(); + boolean onlyCount = buildQuery.isOnlyCount(); OrderBy orderBy = example.getOrderBy(); example = ExampleUtils.tryClone(example); @@ -60,7 +60,7 @@ public class SqlQueryBuilder implements QueryBuilder { List args = selectSegment.getArgs(); if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return buildQuery; + return; } String tableAlias = tableSegment.getTableAlias(); @@ -73,14 +73,26 @@ public class SqlQueryBuilder implements QueryBuilder { String selectSql = selectSegment.selectSql(); String fromWhereSql = selectSegment.fromWhereSql(); + if (onlyCount) { + String countSql = selectSql + fromWhereSql; + long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); + if (page == null) { + page = new Page<>(); + example.setPage(page); + } + page.setTotal(count); + buildQuery.setCountQueried(true); + return; + } + if (page != null) { String countSql = selectSql + fromWhereSql; long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - buildQuery.setPageQueried(true); + buildQuery.setCountQueried(true); if (count == 0L) { buildQuery.setAbandoned(true); - return buildQuery; + return; } } @@ -110,8 +122,6 @@ public class SqlQueryBuilder implements QueryBuilder { } else { buildQuery.setAbandoned(true); } - - return buildQuery; } } -- Gitee From f257eb58682d92b11b6b68eaa6716f3d2cdd148a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 29 Nov 2023 14:22:31 +0800 Subject: [PATCH 035/146] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E7=A7=8D?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/query/entity/BuildQuery.java | 1 + .../com/gitee/dorive/query/impl/resolver/QueryResolver.java | 3 ++- .../dorive/query/repository/AbstractQueryRepository.java | 6 ++++-- .../java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 1 + 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index 2cc7687b..b4ffd14b 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -34,4 +34,5 @@ public class BuildQuery { private boolean onlyCount; private boolean abandoned; private boolean countQueried; + private boolean pageQueried; } 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 f25f380f..3806768b 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 @@ -46,7 +46,8 @@ public class QueryResolver { example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - return new BuildQuery(this, query, exampleMap, example, false, false, false); + return new BuildQuery(this, query, exampleMap, example, + false, false, false, false); } 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 45ada81c..8187b6d4 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 @@ -96,8 +96,9 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return Collections.emptyList(); } - if (buildQuery.isCountQueried()) { + if (buildQuery.isPageQueried()) { example.setPage(null); + return selectByExample(context, example); } return selectByExample(context, example); } @@ -110,10 +111,11 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return (Page) example.getPage(); } - if (buildQuery.isCountQueried()) { + if (buildQuery.isPageQueried()) { Page page = example.getPage(); example.setPage(null); List records = selectByExample(context, example); + example.setPage(page); page.setRecords((List) records); return (Page) page; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 4cba52ec..27545973 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -119,6 +119,7 @@ public class SqlQueryBuilder implements QueryBuilder { List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.in("id", primaryKeys); + buildQuery.setPageQueried(true); } else { buildQuery.setAbandoned(true); } -- Gitee From b116d199ace943429d3a812077b259c5156592cc Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 30 Nov 2023 09:29:38 +0800 Subject: [PATCH 036/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=9B=B4=E8=B4=B4=E5=88=87=E7=9A=84=E5=8F=98=E9=87=8F=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/query/entity/BuildQuery.java | 2 +- .../dorive/query/repository/AbstractQueryRepository.java | 4 ++-- .../main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index b4ffd14b..5a2f3c58 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -34,5 +34,5 @@ public class BuildQuery { private boolean onlyCount; private boolean abandoned; private boolean countQueried; - private boolean pageQueried; + private boolean dataSetQueried; } 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 8187b6d4..940bbba0 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 @@ -96,7 +96,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return Collections.emptyList(); } - if (buildQuery.isPageQueried()) { + if (buildQuery.isDataSetQueried()) { example.setPage(null); return selectByExample(context, example); } @@ -111,7 +111,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi if (buildQuery.isAbandoned()) { return (Page) example.getPage(); } - if (buildQuery.isPageQueried()) { + if (buildQuery.isDataSetQueried()) { Page page = example.getPage(); example.setPage(null); List records = selectByExample(context, example); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 27545973..9eb19f1b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -119,7 +119,7 @@ public class SqlQueryBuilder implements QueryBuilder { List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.in("id", primaryKeys); - buildQuery.setPageQueried(true); + buildQuery.setDataSetQueried(true); } else { buildQuery.setAbandoned(true); } -- Gitee From 7a4993cd05804646c6cc9ca62afdadfb3f7a984d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 30 Nov 2023 10:29:18 +0800 Subject: [PATCH 037/146] =?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/BuildQuery.java | 13 ++++--- .../query/impl/resolver/QueryResolver.java | 15 ++++---- .../repository/AbstractQueryRepository.java | 34 +++++++++---------- .../gitee/dorive/sql/impl/CountQuerier.java | 2 +- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index 5a2f3c58..00d6920a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -19,20 +19,25 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.impl.resolver.QueryResolver; -import lombok.AllArgsConstructor; import lombok.Data; import java.util.Map; @Data -@AllArgsConstructor public class BuildQuery { - private QueryResolver queryResolver; + private Object query; + private boolean onlyCount; + private QueryResolver queryResolver; private Map exampleMap; private Example example; - private boolean onlyCount; private boolean abandoned; private boolean countQueried; private boolean dataSetQueried; + + public BuildQuery(Object query, boolean onlyCount) { + this.query = query; + this.onlyCount = onlyCount; + } + } 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 3806768b..e5e90f2b 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 @@ -17,7 +17,9 @@ package com.gitee.dorive.query.impl.resolver; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.*; +import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.QueryField; @@ -31,7 +33,7 @@ import java.util.*; @Data @AllArgsConstructor -public class QueryResolver { +public class QueryResolver implements QueryBuilder { private ExampleDef exampleDef; private List queryFields; @@ -39,15 +41,16 @@ public class QueryResolver { private List mergedRepositories; private List reversedMergedRepositories; - public BuildQuery newQuery(Object query) { + @Override + public void buildQuery(Context context, BuildQuery buildQuery) { + Object query = buildQuery.getQuery(); Map exampleMap = newExampleMap(query); - Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - - return new BuildQuery(this, query, exampleMap, example, - false, false, false, false); + buildQuery.setQueryResolver(this); + buildQuery.setExampleMap(exampleMap); + buildQuery.setExample(example); } 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 940bbba0..f0f463c2 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 @@ -42,7 +42,7 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryRepository { +public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryBuilder, QueryRepository { private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; @@ -64,25 +64,25 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } } - public BuildQuery buildQuery(Context context, Object query, QueryBuilder builder) { - BuildQuery buildQuery = newQuery(query); - if (builder != null) { - builder.buildQuery(context, buildQuery); - } - QueryBuilder queryBuilder = adaptiveQueryBuilder(context, buildQuery); - queryBuilder.buildQuery(context, buildQuery); + public BuildQuery newQuery(Context context, Object query, boolean onlyCount) { + BuildQuery buildQuery = doNewQuery(context, query, onlyCount); + buildQuery(context, buildQuery); return buildQuery; } - public BuildQuery buildQuery(Context context, Object query) { - return buildQuery(context, query, null); - } - - public BuildQuery newQuery(Object query) { + public BuildQuery doNewQuery(Context context, Object query, boolean onlyCount) { + BuildQuery buildQuery = new BuildQuery(query, onlyCount); Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); Assert.notNull(queryResolver, "No query resolver found!"); - return queryResolver.newQuery(query); + queryResolver.buildQuery(context, buildQuery); + return buildQuery; + } + + @Override + public void buildQuery(Context context, BuildQuery buildQuery) { + QueryBuilder queryBuilder = adaptiveQueryBuilder(context, buildQuery); + queryBuilder.buildQuery(context, buildQuery); } protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { @@ -91,7 +91,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public List selectByQuery(Context context, Object query) { - BuildQuery buildQuery = buildQuery(context, query); + BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { return Collections.emptyList(); @@ -106,7 +106,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { - BuildQuery buildQuery = buildQuery(context, query); + BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { return (Page) example.getPage(); @@ -124,7 +124,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public long selectCountByQuery(Context context, Object query) { - BuildQuery buildQuery = buildQuery(context, query, (ctx, q) -> q.setOnlyCount(true)); + BuildQuery buildQuery = newQuery(context, query, true); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { return 0L; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index 7cda15cf..cdbf8617 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -42,7 +42,7 @@ public class CountQuerier { private SqlHelper sqlHelper; public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { - BuildQuery buildQuery = repository.newQuery(query); + BuildQuery buildQuery = repository.doNewQuery(context, query, false); SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); TableSegment tableSegment = selectSegment.getTableSegment(); -- Gitee From 8768d27fc9d89e579b771c6e5dab5fc83785ad65 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 30 Nov 2023 10:37:03 +0800 Subject: [PATCH 038/146] =?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 --- .../main/java/com/gitee/dorive/query/entity/BuildQuery.java | 2 +- .../dorive/query/impl/{ => builder}/DefaultQueryBuilder.java | 3 +-- .../query/impl/{resolver => builder}/QueryResolver.java | 2 +- .../gitee/dorive/query/impl/resolver/QueryTypeResolver.java | 1 + .../dorive/query/repository/AbstractQueryRepository.java | 4 ++-- .../main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/{ => builder}/DefaultQueryBuilder.java (98%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/{resolver => builder}/QueryResolver.java (98%) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index 00d6920a..d54a8519 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -18,7 +18,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.builder.QueryResolver; import lombok.Data; import java.util.Map; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java similarity index 98% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java index 547f18e6..100a915a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl; +package com.gitee.dorive.query.impl.builder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; @@ -27,7 +27,6 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.BuildQuery; -import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; 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/builder/QueryResolver.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/builder/QueryResolver.java index e5e90f2b..1394f33e 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/builder/QueryResolver.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl.resolver; +package com.gitee.dorive.query.impl.builder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.*; 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..f3e8ee5d 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 @@ -24,6 +24,7 @@ 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.impl.builder.QueryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.query.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; 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 f0f463c2..86fef643 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 @@ -27,9 +27,9 @@ import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.def.QueryScanDef; -import com.gitee.dorive.query.impl.DefaultQueryBuilder; +import com.gitee.dorive.query.impl.builder.DefaultQueryBuilder; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.builder.QueryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 0d9ceedd..d53ad915 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -29,7 +29,7 @@ import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +import com.gitee.dorive.query.impl.builder.QueryResolver; import com.gitee.dorive.sql.entity.*; import com.gitee.dorive.sql.util.CriterionUtils; import lombok.AllArgsConstructor; -- Gitee From 9eb4f87b0cb23c6d5f9f10b7f5297861d08b51dd Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 6 Dec 2023 18:04:13 +0800 Subject: [PATCH 039/146] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/sql/impl/CountQuerier.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index cdbf8617..28a0d0a7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -19,14 +19,15 @@ package com.gitee.dorive.sql.impl; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.context.BoundedContext; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlHelper; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -41,43 +42,43 @@ public class CountQuerier { private SegmentBuilder segmentBuilder; private SqlHelper sqlHelper; - public Map selectCount(Context context, String groupField, boolean distinct, String countField, Object query) { - BuildQuery buildQuery = repository.doNewQuery(context, query, false); + public Map selectCount(Context context, CountQuery countQuery) { + BuildQuery buildQuery = repository.doNewQuery(context, countQuery.getQuery(), false); SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); + String tableAlias = tableSegment.getTableAlias(); EntityEle entityEle = repository.getEntityEle(); - String groupByColumn = entityEle.toAlias(groupField); - String countColumn = entityEle.toAlias(countField); - - String tableAlias = tableSegment.getTableAlias(); - groupByColumn = tableAlias + "." + groupByColumn; - countColumn = tableAlias + "." + countColumn; + String countByColumn = tableAlias + "." + entityEle.toAlias(countQuery.getCountBy()); + String groupByColumn = tableAlias + "." + entityEle.toAlias(countQuery.getGroupBy()); List columns = new ArrayList<>(2); - columns.add(groupByColumn + " AS recordId"); - if (distinct) { - columns.add("count(DISTINCT " + countColumn + ") AS totalCount"); - } else { - columns.add("count(" + countColumn + ") AS totalCount"); - } + columns.add(groupByColumn + " AS groupId"); + + String format = "COUNT(%s) AS total"; + String countByColumnStr = String.format(format, countQuery.isDistinct() ? "DISTINCT " + countByColumn : countByColumn); + columns.add(countByColumnStr); + selectSegment.setSelectColumns(columns); selectSegment.setGroupBy("GROUP BY " + groupByColumn); List> resultMaps = sqlHelper.selectList(selectSegment.toString(), args.toArray()); Map countMap = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); - resultMaps.forEach(resultMap -> countMap.put(resultMap.get("recordId").toString(), (Long) resultMap.get("totalCount"))); + resultMaps.forEach(resultMap -> countMap.put(resultMap.get("groupId").toString(), (Long) resultMap.get("total"))); return countMap; } - public Map selectCount(Context context, String groupField, String countField, Object query) { - return selectCount(context, groupField, true, countField, query); - } - - public Map selectCount(String groupField, String countField, Object query) { - return selectCount(new BoundedContext(), groupField, true, countField, query); + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class CountQuery { + private Object query; + private boolean distinct = true; + private String countBy; + private String groupBy; } } -- Gitee From 4d549caedfd5f32cee2ffa3af1302f879a97c3f5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 6 Dec 2023 18:06:31 +0800 Subject: [PATCH 040/146] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BC=A0=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index 28a0d0a7..fdfea6e1 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -42,7 +42,7 @@ public class CountQuerier { private SegmentBuilder segmentBuilder; private SqlHelper sqlHelper; - public Map selectCount(Context context, CountQuery countQuery) { + public Map selectCountMap(Context context, CountQuery countQuery) { BuildQuery buildQuery = repository.doNewQuery(context, countQuery.getQuery(), false); SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); -- Gitee From 095782059d9b3ceadae2eba679d7e1b343a52c74 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 8 Dec 2023 17:51:38 +0800 Subject: [PATCH 041/146] =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/sql/impl/SegmentBuilder.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index d53ad915..139bfd47 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -50,8 +50,6 @@ public class SegmentBuilder { List joinSegments = selectSegment.getJoinSegments(); for (MergedRepository mergedRepository : mergedRepositories) { - String tableAlias = selectSegment.generateTableAlias(); - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); String relativeAccessPath = mergedRepository.getRelativeAccessPath(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); @@ -60,6 +58,7 @@ public class SegmentBuilder { String tableName = (String) attachments.get(Keys.TABLE_NAME); FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); + String tableAlias = selectSegment.generateTableAlias(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); fieldExecutor.convert(context, example); @@ -71,7 +70,7 @@ public class SegmentBuilder { selectSegment.setTableSegment(tableSegment); } else { - List onSegments = newOnSegments(nodeMap, mergedRepository, tableAlias, node); + List onSegments = newOnSegments(nodeMap, mergedRepository, node); if (onSegments.isEmpty()) { nodeMap.remove(relativeAccessPath); continue; @@ -80,7 +79,7 @@ public class SegmentBuilder { joinSegments.add(joinSegment); } - addTableSegmentArgs(selectSegment, tableAlias, example, tableSegment); + addTableSegmentArgs(selectSegment, example, tableSegment); } markTableSegmentJoin(nodeMap.get("/")); @@ -88,32 +87,34 @@ public class SegmentBuilder { return selectSegment; } - private List newOnSegments(Map nodeMap, MergedRepository mergedRepository, String tableAlias, Node node) { + private List newOnSegments(Map nodeMap, MergedRepository mergedRepository, Node node) { String lastAccessPath = mergedRepository.getLastAccessPath(); CommonRepository definedRepository = mergedRepository.getDefinedRepository(); BinderResolver binderResolver = definedRepository.getBinderResolver(); List propertyBinders = binderResolver.getPropertyBinders(); + TableSegment tableSegment = node.getTableSegment(); List onSegments = new ArrayList<>(propertyBinders.size()); for (PropertyBinder propertyBinder : propertyBinders) { String relativeAccessPath = lastAccessPath + propertyBinder.getBelongAccessPath(); Node targetNode = nodeMap.get(relativeAccessPath); if (targetNode != null) { - TableSegment tableSegment = targetNode.getTableSegment(); + TableSegment targetTableSegment = targetNode.getTableSegment(); List children = targetNode.getChildren(); if (!children.contains(node)) { children.add(node); } - OnSegment onSegment = new OnSegment(tableAlias, propertyBinder.getAlias(), - tableSegment.getTableAlias(), propertyBinder.getBindAlias()); + OnSegment onSegment = new OnSegment(tableSegment.getTableAlias(), propertyBinder.getAlias(), + targetTableSegment.getTableAlias(), propertyBinder.getBindAlias()); onSegments.add(onSegment); } } return onSegments; } - private void addTableSegmentArgs(SelectSegment selectSegment, String tableAlias, Example example, TableSegment tableSegment) { + 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(); -- Gitee From 70fba9563a089bb20de94d1c8ce41103f1eebcf3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 13 Dec 2023 18:58:06 +0800 Subject: [PATCH 042/146] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=98=A0=E5=B0=84=E5=88=B0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=97=B6=EF=BC=8C=E4=B8=8E=E6=9C=9F=E6=9C=9B?= =?UTF-8?q?=E4=B8=8D=E7=AC=A6=E5=90=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/factory/DefaultEntityFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 680e6856..80e0153f 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 @@ -48,7 +48,7 @@ public class DefaultEntityFactory implements EntityFactory { public void setReCopyOptions(Map aliasFieldMapping, Map fieldConverterMap) { this.aliasFieldMapping = aliasFieldMapping; this.fieldConverterMap = fieldConverterMap; - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(aliasFieldMapping); + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(aliasFieldMapping::get); if (fieldConverterMap != null && !fieldConverterMap.isEmpty()) { this.reCopyOptions.setFieldValueEditor((name, value) -> { FieldConverter fieldConverter = fieldConverterMap.get(name); @@ -60,7 +60,7 @@ public class DefaultEntityFactory implements EntityFactory { public void setDeCopyOptions(Map fieldPropMapping, Map propConverterMap) { this.fieldPropMapping = fieldPropMapping; this.propConverterMap = propConverterMap; - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(fieldPropMapping); + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldPropMapping::get); if (propConverterMap != null && !propConverterMap.isEmpty()) { this.deCopyOptions.setFieldValueEditor((name, value) -> { FieldConverter fieldConverter = propConverterMap.get(name); -- Gitee From 45f1ca95c28f3f5c08e3099bf36da44af343bc45 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 13 Dec 2023 19:15:30 +0800 Subject: [PATCH 043/146] =?UTF-8?q?=E4=BC=98=E5=8C=96like=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=97=B6=EF=BC=8C=E6=8B=BC=E6=8E=A5sql=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/spring/boot/starter/impl/AppenderContext.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index dd83daa5..38cfae6d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -22,7 +22,6 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.sql.util.SqlUtils; import java.util.Collection; import java.util.List; @@ -55,8 +54,8 @@ public class AppenderContext { OPERATOR_CRITERION_APPENDER_MAP.put(Operator.LE, Compare::le); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IN, (abstractWrapper, property, value) -> abstractWrapper.in(property, (Collection) value)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NOT_IN, (abstractWrapper, property, value) -> abstractWrapper.notIn(property, (Collection) value)); - OPERATOR_CRITERION_APPENDER_MAP.put(Operator.LIKE, (abstractWrapper, property, value) -> abstractWrapper.like(property, SqlUtils.toLike(value))); - OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NOT_LIKE, (abstractWrapper, property, value) -> abstractWrapper.notLike(property, SqlUtils.toLike(value))); + OPERATOR_CRITERION_APPENDER_MAP.put(Operator.LIKE, Compare::like); + OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NOT_LIKE, Compare::notLike); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNull(property)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NOT_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNotNull(property)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NULL_SWITCH, (abstractWrapper, property, value) -> { -- Gitee From d04ab0cfcc44212bf7d1c97e00d2f75c52f9ff0b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 15 Dec 2023 17:22:00 +0800 Subject: [PATCH 044/146] =?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 --- .../boot/starter/impl/DefaultSqlHelper.java | 13 ++++++++ .../com/gitee/dorive/sql/api/SqlHelper.java | 2 ++ .../gitee/dorive/sql/util/CriterionUtils.java | 2 +- .../com/gitee/dorive/sql/util/SqlUtils.java | 32 ------------------- 4 files changed, 16 insertions(+), 33 deletions(-) delete mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java index 4a14451b..5207b5d5 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java @@ -17,6 +17,8 @@ package com.gitee.dorive.spring.boot.starter.impl; +import cn.hutool.db.sql.Condition; +import cn.hutool.db.sql.SqlUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.sql.api.SqlHelper; @@ -26,6 +28,17 @@ import java.util.Map; public class DefaultSqlHelper implements SqlHelper { + @Override + public Object concatLike(Object value) { + if (value instanceof String) { + String valueStr = (String) value; + if (!valueStr.startsWith("%") && !valueStr.endsWith("%")) { + return SqlUtil.buildLikeValue(valueStr, Condition.LikeType.Contains, false); + } + } + return value; + } + @Override public String sqlParam(Object obj) { return StringUtils.sqlParam(obj); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java index 55c625c2..cac5d692 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java @@ -22,6 +22,8 @@ import java.util.Map; public interface SqlHelper { + Object concatLike(Object value); + String sqlParam(Object obj); long selectCount(String sql, Object... args); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java index 4d394510..c2098814 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java @@ -74,7 +74,7 @@ public class CriterionUtils { value = DateUtil.formatDateTime((Date) value); } if (Operator.LIKE.equals(operator) || Operator.NOT_LIKE.equals(operator)) { - value = SqlUtils.toLike(value); + value = sqlHelper.concatLike(value); } return value; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java deleted file mode 100644 index eaeafd0d..00000000 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/SqlUtils.java +++ /dev/null @@ -1,32 +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.util; - -public class SqlUtils { - - public static Object toLike(Object value) { - if (value instanceof String) { - String valueStr = (String) value; - if (!valueStr.startsWith("%") && !valueStr.endsWith("%")) { - return "%" + valueStr + "%"; - } - } - return value; - } - -} -- Gitee From 3267f9fa79efe32cafa8434b30a9aa42f213baaa Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 18 Dec 2023 15:51:23 +0800 Subject: [PATCH 045/146] =?UTF-8?q?=E5=B0=86=E5=B7=A5=E5=85=B7=E7=B1=BB?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E8=87=B3core?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/format/SqlFormat.java | 26 +++++++++++++++++++ .../dorive/core}/util/CriterionUtils.java | 14 +++++----- .../boot/starter/impl/DefaultImplFactory.java | 8 ++++-- .../boot/starter/impl/DefaultSqlHelper.java | 10 +++---- .../starter/impl/MybatisPlusExecutor.java | 2 +- .../repository/MybatisPlusRepository.java | 8 +++--- .../api/{SqlHelper.java => SqlRunner.java} | 6 +---- .../gitee/dorive/sql/impl/CountQuerier.java | 6 ++--- .../gitee/dorive/sql/impl/SegmentBuilder.java | 2 +- .../dorive/sql/impl/SqlQueryBuilder.java | 10 +++---- 10 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/api/format/SqlFormat.java rename {dorive-sql/src/main/java/com/gitee/dorive/sql => dorive-core/src/main/java/com/gitee/dorive/core}/util/CriterionUtils.java (90%) rename dorive-sql/src/main/java/com/gitee/dorive/sql/api/{SqlHelper.java => SqlRunner.java} (90%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/format/SqlFormat.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/format/SqlFormat.java new file mode 100644 index 00000000..f4deffa8 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/format/SqlFormat.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.api.format; + +public interface SqlFormat { + + Object concatLike(Object value); + + String sqlParam(Object obj); + +} diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java similarity index 90% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java rename to dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java index c2098814..dbd51157 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/util/CriterionUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/CriterionUtils.java @@ -15,25 +15,25 @@ * limitations under the License. */ -package com.gitee.dorive.sql.util; +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.api.constant.Operator; +import com.gitee.dorive.core.api.format.SqlFormat; import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.api.api.ImplFactory; -import com.gitee.dorive.sql.api.SqlHelper; import java.util.Collection; import java.util.Date; public class CriterionUtils { - private static final SqlHelper sqlHelper; + private static final SqlFormat sqlFormat; static { ImplFactory implFactory = SpringUtil.getBean(ImplFactory.class); - sqlHelper = implFactory.getInstance(SqlHelper.class); + sqlFormat = implFactory.getInstance(SqlFormat.class); } public static String getOperator(Criterion criterion) { @@ -63,7 +63,7 @@ public class CriterionUtils { public static Object getValue(Criterion criterion) { String operator = criterion.getOperator(); Object value = criterion.getValue(); - return sqlHelper.sqlParam(format(operator, value)); + return sqlFormat.sqlParam(format(operator, value)); } public static Object format(String operator, Object value) { @@ -74,7 +74,7 @@ public class CriterionUtils { value = DateUtil.formatDateTime((Date) value); } if (Operator.LIKE.equals(operator) || Operator.NOT_LIKE.equals(operator)) { - value = sqlHelper.concatLike(value); + value = sqlFormat.concatLike(value); } return value; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java index abbf73b7..c2976abe 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java @@ -18,14 +18,18 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.gitee.dorive.api.api.ImplFactory; -import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.core.api.format.SqlFormat; +import com.gitee.dorive.sql.api.SqlRunner; public class DefaultImplFactory implements ImplFactory { @Override @SuppressWarnings("unchecked") public T getInstance(Class clazz, Object... args) { - if (clazz == SqlHelper.class) { + if (clazz == SqlFormat.class) { + return (T) new DefaultSqlHelper(); + + } else if (clazz == SqlRunner.class) { return (T) new DefaultSqlHelper(); } return null; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java index 5207b5d5..2af33c9b 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java @@ -20,13 +20,13 @@ package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.db.sql.Condition; import cn.hutool.db.sql.SqlUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; -import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.core.api.format.SqlFormat; +import com.gitee.dorive.sql.api.SqlRunner; import java.util.List; import java.util.Map; -public class DefaultSqlHelper implements SqlHelper { +public class DefaultSqlHelper implements SqlFormat, SqlRunner { @Override public Object concatLike(Object value) { @@ -46,12 +46,12 @@ public class DefaultSqlHelper implements SqlHelper { @Override public long selectCount(String sql, Object... args) { - return SqlRunner.db().selectCount(sql, args); + return com.baomidou.mybatisplus.extension.toolkit.SqlRunner.db().selectCount(sql, args); } @Override public List> selectList(String sql, Object... args) { - return SqlRunner.db().selectList(sql, args); + return com.baomidou.mybatisplus.extension.toolkit.SqlRunner.db().selectList(sql, args); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index a76b7998..e4543aaf 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -36,7 +36,7 @@ import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.core.entity.operation.*; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.sql.util.CriterionUtils; +import com.gitee.dorive.core.util.CriterionUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 7f02514d..2e6a7a18 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -37,7 +37,7 @@ import com.gitee.dorive.ref.repository.AbstractRefRepository; import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.spring.boot.starter.impl.MybatisPlusExecutor; import com.gitee.dorive.api.api.ImplFactory; -import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.impl.SegmentBuilder; import com.gitee.dorive.sql.impl.SqlQueryBuilder; import lombok.Data; @@ -63,9 +63,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { super.afterPropertiesSet(); SegmentBuilder segmentBuilder = new SegmentBuilder(); ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); - SqlHelper sqlHelper = implFactory.getInstance(SqlHelper.class); - this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlHelper); - this.countQuerier = new CountQuerier(this, segmentBuilder, sqlHelper); + SqlRunner sqlRunner = implFactory.getInstance(SqlRunner.class); + this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlRunner); + this.countQuerier = new CountQuerier(this, segmentBuilder, sqlRunner); } @Override diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java similarity index 90% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java index cac5d692..e825b819 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlHelper.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/api/SqlRunner.java @@ -20,11 +20,7 @@ package com.gitee.dorive.sql.api; import java.util.List; import java.util.Map; -public interface SqlHelper { - - Object concatLike(Object value); - - String sqlParam(Object obj); +public interface SqlRunner { long selectCount(String sql, Object... args); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index fdfea6e1..b9266185 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -21,7 +21,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; @@ -40,7 +40,7 @@ public class CountQuerier { private AbstractQueryRepository repository; private SegmentBuilder segmentBuilder; - private SqlHelper sqlHelper; + private SqlRunner sqlRunner; public Map selectCountMap(Context context, CountQuery countQuery) { BuildQuery buildQuery = repository.doNewQuery(context, countQuery.getQuery(), false); @@ -64,7 +64,7 @@ public class CountQuerier { selectSegment.setSelectColumns(columns); selectSegment.setGroupBy("GROUP BY " + groupByColumn); - List> resultMaps = sqlHelper.selectList(selectSegment.toString(), args.toArray()); + List> resultMaps = sqlRunner.selectList(selectSegment.toString(), args.toArray()); Map countMap = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); resultMaps.forEach(resultMap -> countMap.put(resultMap.get("groupId").toString(), (Long) resultMap.get("total"))); return countMap; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 139bfd47..45fa5b24 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -31,7 +31,7 @@ import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.builder.QueryResolver; import com.gitee.dorive.sql.entity.*; -import com.gitee.dorive.sql.util.CriterionUtils; +import com.gitee.dorive.core.util.CriterionUtils; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index 9eb19f1b..b7f49b0c 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -25,7 +25,7 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; -import com.gitee.dorive.sql.api.SqlHelper; +import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.ArgSegment; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; @@ -41,7 +41,7 @@ import java.util.Map; public class SqlQueryBuilder implements QueryBuilder { private SegmentBuilder segmentBuilder; - private SqlHelper sqlHelper; + private SqlRunner sqlRunner; @Override public void buildQuery(Context context, BuildQuery buildQuery) { @@ -75,7 +75,7 @@ public class SqlQueryBuilder implements QueryBuilder { if (onlyCount) { String countSql = selectSql + fromWhereSql; - long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); + long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); if (page == null) { page = new Page<>(); example.setPage(page); @@ -87,7 +87,7 @@ public class SqlQueryBuilder implements QueryBuilder { if (page != null) { String countSql = selectSql + fromWhereSql; - long count = sqlHelper.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); + long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); buildQuery.setCountQueried(true); if (count == 0L) { @@ -115,7 +115,7 @@ public class SqlQueryBuilder implements QueryBuilder { } String sql = selectSql + fromWhereSql + selectSegment.lastSql(); - List> resultMaps = sqlHelper.selectList(sql, args.toArray()); + List> resultMaps = sqlRunner.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.in("id", primaryKeys); -- Gitee From 61412a4988c2b96f70ed52a4f6aa0e22460d8b31 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 18 Dec 2023 16:28:19 +0800 Subject: [PATCH 046/146] =?UTF-8?q?Criterion.java=E6=94=AF=E6=8C=81toStrin?= =?UTF-8?q?g=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/entity/executor/Criterion.java | 6 ++++++ .../boot/starter/impl/MybatisPlusExecutor.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java index d856c8b9..58e78184 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.executor; +import com.gitee.dorive.core.util.CriterionUtils; import lombok.AllArgsConstructor; import lombok.Data; @@ -37,4 +38,9 @@ public class Criterion { return new Criterion(property, operator, value); } + @Override + public String toString() { + return CriterionUtils.toString(this); + } + } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index e4543aaf..14542fd3 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -32,11 +32,20 @@ import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.*; -import com.gitee.dorive.core.entity.operation.*; +import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.MultiResult; +import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.operation.Delete; +import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.NullableUpdate; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.core.util.CriterionUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -172,7 +181,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { String sqlSelect = nextQueryWrapper.getSqlSelect(); String tableName = TableInfoHelper.getTableInfo(pojoClass).getTableName(); - String criteria = CollUtil.join(nextExample.getCriteria(), " AND ", CriterionUtils::toString); + String criteria = CollUtil.join(nextExample.getCriteria(), " AND ", Criterion::toString); String sql = ""; if (nextExample.getOrderBy() == null && nextExample.getPage() == null) { -- Gitee From 9169f67c86d746b24cbb3e1f098a355da4ae8fd3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 18 Dec 2023 17:21:11 +0800 Subject: [PATCH 047/146] =?UTF-8?q?=E5=B0=86NULL=5FSWITCH=E4=BB=8E?= =?UTF-8?q?=E6=A0=87=E5=87=86=E6=93=8D=E4=BD=9C=E4=B8=AD=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E4=BD=BF=E7=94=A8OperatorV2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/constant/Operator.java | 1 - .../dorive/core/util/CriterionUtils.java | 3 --- .../dorive/query/constant/OperatorV2.java | 22 +++++++++++++++++++ .../query/impl/builder/QueryResolver.java | 6 +++++ .../boot/starter/impl/AppenderContext.java | 9 -------- 5 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/constant/OperatorV2.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java index 797b7f1d..b5a9f509 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java @@ -30,6 +30,5 @@ public interface Operator { String NOT_LIKE = "NOT LIKE"; String IS_NULL = "IS NULL"; String IS_NOT_NULL = "IS NOT NULL"; - String NULL_SWITCH = "NULL_SWITCH"; String MULTI_IN = "MULTI_IN"; } 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 dbd51157..00c045f9 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 @@ -52,9 +52,6 @@ public class CriterionUtils { } else if (Operator.NOT_IN.equals(operator)) { operator = Operator.NE; - - } else if (Operator.NULL_SWITCH.equals(operator) && value instanceof Boolean) { - return (Boolean) value ? Operator.IS_NULL : Operator.IS_NOT_NULL; } } return operator; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/constant/OperatorV2.java b/dorive-query/src/main/java/com/gitee/dorive/query/constant/OperatorV2.java new file mode 100644 index 00000000..fafe4bdf --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/constant/OperatorV2.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.query.constant; + +public interface OperatorV2 { + String NULL_SWITCH = "NULL_SWITCH"; +} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java index 1394f33e..f8b918d3 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java @@ -17,9 +17,11 @@ package com.gitee.dorive.query.impl.builder; +import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.constant.OperatorV2; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.QueryField; @@ -62,6 +64,10 @@ public class QueryResolver implements QueryBuilder { String belongTo = criterionDef.getBelongTo(); String fieldName = criterionDef.getField(); String operator = criterionDef.getOperator(); + if (OperatorV2.NULL_SWITCH.equals(operator) && fieldValue instanceof Boolean) { + operator = (Boolean) fieldValue ? Operator.IS_NULL : Operator.IS_NOT_NULL; + fieldValue = null; + } Example example = exampleMap.computeIfAbsent(belongTo, key -> new InnerExample()); example.getCriteria().add(new Criterion(fieldName, operator, fieldValue)); } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index 38cfae6d..5b15d86a 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -58,15 +58,6 @@ public class AppenderContext { OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NOT_LIKE, Compare::notLike); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNull(property)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NOT_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNotNull(property)); - OPERATOR_CRITERION_APPENDER_MAP.put(Operator.NULL_SWITCH, (abstractWrapper, property, value) -> { - if (value instanceof Boolean) { - if ((Boolean) value) { - abstractWrapper.isNull(property); - } else { - abstractWrapper.isNotNull(property); - } - } - }); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.MULTI_IN, (abstractWrapper, property, value) -> { if (value instanceof MultiInBuilder) { MultiInBuilder builder = (MultiInBuilder) value; -- Gitee From 7a3b9bbb6eda7103f8061ed0babdcd87e18e06d2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 18 Dec 2023 18:23:14 +0800 Subject: [PATCH 048/146] =?UTF-8?q?=E5=B0=86NULL=5FSWITCH=E4=BB=8E?= =?UTF-8?q?=E6=A0=87=E5=87=86=E6=93=8D=E4=BD=9C=E4=B8=AD=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E4=BD=BF=E7=94=A8OperatorV2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/MultiInBuilder.java | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java index 1bf01dbe..dbc0b8ac 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java @@ -19,6 +19,7 @@ package com.gitee.dorive.core.entity.executor; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Operator; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,43 +30,45 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) public class MultiInBuilder { - private int size; private List aliases; - private int step; - private List values; - private int cursor; + private int recordSize; + private List multiValues; + private int valueSize; - public MultiInBuilder(int size, List aliases) { - this.size = size; + public MultiInBuilder(int recordSize, List aliases) { this.aliases = aliases; - this.step = aliases.size(); - this.values = new ArrayList<>(size * step); - this.cursor = 0; + this.recordSize = recordSize; + this.multiValues = new ArrayList<>(recordSize); + this.valueSize = aliases.size(); } - public void append(Object value) { - if (values.size() - cursor >= step) { - cursor += step; - } - values.add(value); - } - - public void clear() { - values.subList(cursor, values.size()).clear(); + public boolean isEmpty() { + return multiValues.isEmpty(); } - public boolean isEmpty() { - return values.isEmpty(); + public void append(Object value) { + if (multiValues.isEmpty()) { + multiValues.add(new MultiValue(0, new Object[valueSize])); + } + MultiValue lastMultiValue = multiValues.get(multiValues.size() - 1); + int index = lastMultiValue.getIndex(); + Object[] values = lastMultiValue.getValues(); + if (index >= values.length) { + multiValues.add(new MultiValue(0, new Object[valueSize])); + lastMultiValue = multiValues.get(multiValues.size() - 1); + } + doAppend(lastMultiValue, value); } - public int page() { - return values.size() / step; + private void doAppend(MultiValue lastMultiValue, Object value) { + int index = lastMultiValue.getIndex(); + Object[] values = lastMultiValue.getValues(); + values[index] = value; + lastMultiValue.setIndex(index + 1); } - public List get(int page) { - int fromIndex = (page - 1) * step; - int toIndex = fromIndex + step; - return values.subList(fromIndex, toIndex); + public void clear() { + multiValues.remove(multiValues.size() - 1); } public Criterion build() { @@ -73,4 +76,11 @@ public class MultiInBuilder { return new Criterion(aliasesStr, Operator.MULTI_IN, this); } + @Data + @AllArgsConstructor + public static class MultiValue { + private int index; + private Object[] values; + } + } -- Gitee From 0f8d2e03249fa01305a806f3e19e0257b1e08512 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Mon, 18 Dec 2023 23:23:37 +0800 Subject: [PATCH 049/146] =?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/entity/executor/MultiInBuilder.java | 62 ++++++++----------- .../core/impl/handler/MultiEntityHandler.java | 4 +- .../dorive/core/util/CriterionUtils.java | 7 ++- .../impl/builder/DefaultQueryBuilder.java | 4 +- .../boot/starter/impl/AppenderContext.java | 26 +------- 5 files changed, 38 insertions(+), 65 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java index dbc0b8ac..13f66e81 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java @@ -19,68 +19,58 @@ package com.gitee.dorive.core.entity.executor; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Operator; -import lombok.AllArgsConstructor; +import com.gitee.dorive.core.util.CriterionUtils; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Data @EqualsAndHashCode(callSuper = false) public class MultiInBuilder { private List aliases; - private int recordSize; - private List multiValues; - private int valueSize; + private int number; + private int size; + private List values; - public MultiInBuilder(int recordSize, List aliases) { + public MultiInBuilder(List aliases, int number) { this.aliases = aliases; - this.recordSize = recordSize; - this.multiValues = new ArrayList<>(recordSize); - this.valueSize = aliases.size(); + this.number = number; + this.size = aliases.size(); + this.values = new ArrayList<>(number * size); } public boolean isEmpty() { - return multiValues.isEmpty(); + return values.isEmpty(); } public void append(Object value) { - if (multiValues.isEmpty()) { - multiValues.add(new MultiValue(0, new Object[valueSize])); - } - MultiValue lastMultiValue = multiValues.get(multiValues.size() - 1); - int index = lastMultiValue.getIndex(); - Object[] values = lastMultiValue.getValues(); - if (index >= values.length) { - multiValues.add(new MultiValue(0, new Object[valueSize])); - lastMultiValue = multiValues.get(multiValues.size() - 1); - } - doAppend(lastMultiValue, value); - } - - private void doAppend(MultiValue lastMultiValue, Object value) { - int index = lastMultiValue.getIndex(); - Object[] values = lastMultiValue.getValues(); - values[index] = value; - lastMultiValue.setIndex(index + 1); + values.add(value); } public void clear() { - multiValues.remove(multiValues.size() - 1); + int size = values.size(); + int remainder = size % this.size; + values.subList(size - remainder, size).clear(); } - public Criterion build() { - String aliasesStr = StrUtil.join(",", aliases); - return new Criterion(aliasesStr, Operator.MULTI_IN, this); + public Criterion toCriterion() { + String property = StrUtil.join(",", aliases); + StringBuilder builder = new StringBuilder(); + int page = values.size() / size; + for (int current = 1; current <= page; current++) { + List subValues = values.subList((current - 1) * size, current * size); + builder.append(buildValuesStr(subValues)); + } + String valuesStr = StrUtil.removeSuffix(builder, ","); + return new Criterion(property, Operator.MULTI_IN, valuesStr); } - @Data - @AllArgsConstructor - public static class MultiValue { - private int index; - private Object[] values; + public String buildValuesStr(List values) { + return values.stream().map(CriterionUtils::sqlParam).collect(Collectors.joining(",", "(", "),")); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index 41b78610..dc69f257 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -86,10 +86,10 @@ public class MultiEntityHandler implements EntityHandler { } else { List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(entities.size(), aliases); + MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); collectBoundValues(context, entities, entityIndex, binders, builder); if (!builder.isEmpty()) { - example.getCriteria().add(builder.build()); + example.getCriteria().add(builder.toCriterion()); } } 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 00c045f9..6c42be42 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 @@ -60,7 +60,8 @@ public class CriterionUtils { public static Object getValue(Criterion criterion) { String operator = criterion.getOperator(); Object value = criterion.getValue(); - return sqlFormat.sqlParam(format(operator, value)); + value = format(operator, value); + return sqlParam(value); } public static Object format(String operator, Object value) { @@ -76,6 +77,10 @@ public class CriterionUtils { return value; } + public static String sqlParam(Object obj) { + return sqlFormat.sqlParam(obj); + } + public static String toString(Criterion criterion) { String property = criterion.getProperty(); String operator = getOperator(criterion); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java index 100a915a..84b52102 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java @@ -122,10 +122,10 @@ public class DefaultQueryBuilder implements QueryBuilder { } else { List aliases = binders.stream().map(PropertyBinder::getBindAlias).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(entities.size(), aliases); + MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); collectFieldValues(context, entities, binders, builder); if (!builder.isEmpty()) { - targetExample.getCriteria().add(builder.build()); + targetExample.getCriteria().add(builder.toCriterion()); } else { targetExampleWrapper.setAbandoned(true); } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index 5b15d86a..6ab30e46 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -18,16 +18,12 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.core.entity.executor.MultiInBuilder; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; public class AppenderContext { @@ -59,27 +55,9 @@ public class AppenderContext { OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNull(property)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.IS_NOT_NULL, (abstractWrapper, property, value) -> abstractWrapper.isNotNull(property)); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.MULTI_IN, (abstractWrapper, property, value) -> { - if (value instanceof MultiInBuilder) { - MultiInBuilder builder = (MultiInBuilder) value; - StringBuilder valuesStr = new StringBuilder(); - for (int page = 1; page <= builder.page(); page++) { - List values = builder.get(page); - valuesStr.append(buildValuesStr(values)); - } - if (valuesStr.length() > 0) { - valuesStr.deleteCharAt(valuesStr.length() - 1); - } - if (abstractWrapper.isEmptyOfWhere()) { - abstractWrapper.last(" WHERE (" + property + ") IN (" + valuesStr + ")"); - } else { - abstractWrapper.last(" AND (" + property + ") IN (" + valuesStr + ")"); - } - } + String prefix = abstractWrapper.isEmptyOfWhere() ? " WHERE " : " AND "; + abstractWrapper.last(prefix + "(" + property + ") IN (" + value + ")"); }); } - public static String buildValuesStr(List values) { - return values.stream().map(StringUtils::sqlParam).collect(Collectors.joining(",", "(", "),")); - } - } -- Gitee From 020fec0f33a3b74922720f5b048e3dee3819a214 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 19 Dec 2023 10:17:44 +0800 Subject: [PATCH 050/146] =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=B0=86value=E8=BF=9B=E8=A1=8C=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/entity/executor/MultiInBuilder.java | 6 ++++-- .../gitee/dorive/core/impl/handler/MultiEntityHandler.java | 4 ++-- .../java/com/gitee/dorive/core/util/CriterionUtils.java | 6 +++++- .../dorive/query/impl/builder/DefaultQueryBuilder.java | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java index 13f66e81..3521f352 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java @@ -51,7 +51,7 @@ public class MultiInBuilder { values.add(value); } - public void clear() { + public void clearLast() { int size = values.size(); int remainder = size % this.size; values.subList(size - remainder, size).clear(); @@ -70,7 +70,9 @@ public class MultiInBuilder { } public String buildValuesStr(List values) { - return values.stream().map(CriterionUtils::sqlParam).collect(Collectors.joining(",", "(", "),")); + return values.stream() + .map(value -> CriterionUtils.doGetValue(null, value)) + .collect(Collectors.joining(",", "(", "),")); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index dc69f257..4ca5929b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -135,7 +135,7 @@ public class MultiEntityHandler implements EntityHandler { strBuilder.append("(").append(boundValueStr.length()).append(")").append(boundValueStr).append(","); } else { - multiInBuilder.clear(); + multiInBuilder.clearLast(); strBuilder = null; break; } @@ -146,7 +146,7 @@ public class MultiEntityHandler implements EntityHandler { } String key = strBuilder.toString(); if (entityIndex.containsKey(key)) { - multiInBuilder.clear(); + multiInBuilder.clearLast(); } addToIndex(entityIndex, key, entity); } 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 6c42be42..6b6b2350 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 @@ -57,9 +57,13 @@ public class CriterionUtils { return operator; } - public static Object getValue(Criterion criterion) { + public static String getValue(Criterion criterion) { String operator = criterion.getOperator(); Object value = criterion.getValue(); + return doGetValue(operator, value); + } + + public static String doGetValue(String operator, Object value) { value = format(operator, value); return sqlParam(value); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java index 84b52102..89f34481 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java @@ -143,7 +143,7 @@ public class DefaultQueryBuilder implements QueryBuilder { fieldValue = binder.output(context, fieldValue); builder.append(fieldValue); } else { - builder.clear(); + builder.clearLast(); break; } } -- Gitee From 481bb912eac52423945e5513807b558027c863f1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 19 Dec 2023 10:23:55 +0800 Subject: [PATCH 051/146] =?UTF-8?q?MULTI=5FIN=E4=BD=9C=E4=B8=BA=E6=A0=87?= =?UTF-8?q?=E5=87=86=E6=9F=A5=E8=AF=A2=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/api/constant/Operator.java | 1 + .../dorive/spring/boot/starter/impl/AppenderContext.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java index b5a9f509..007197bb 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java @@ -31,4 +31,5 @@ public interface Operator { String IS_NULL = "IS NULL"; String IS_NOT_NULL = "IS NOT NULL"; String MULTI_IN = "MULTI_IN"; + String MULTI_NOT_IN = "MULTI_NOT_IN"; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index 6ab30e46..76469784 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -58,6 +58,10 @@ public class AppenderContext { String prefix = abstractWrapper.isEmptyOfWhere() ? " WHERE " : " AND "; abstractWrapper.last(prefix + "(" + property + ") IN (" + value + ")"); }); + OPERATOR_CRITERION_APPENDER_MAP.put(Operator.MULTI_NOT_IN, (abstractWrapper, property, value) -> { + String prefix = abstractWrapper.isEmptyOfWhere() ? " WHERE " : " AND "; + abstractWrapper.last(prefix + "(" + property + ") NOT IN (" + value + ")"); + }); } } -- Gitee From 194a6435bfe233c0ba78423cd2fd6b4ffdc1770f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 19 Dec 2023 10:28:45 +0800 Subject: [PATCH 052/146] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=88=B0=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/handler/MultiEntityHandler.java | 2 +- .../dorive/core/{entity/executor => util}/MultiInBuilder.java | 4 ++-- .../gitee/dorive/query/impl/builder/DefaultQueryBuilder.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/{entity/executor => util}/MultiInBuilder.java (96%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index 4ca5929b..40276822 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -22,7 +22,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.MultiInBuilder; +import com.gitee.dorive.core.util.MultiInBuilder; import com.gitee.dorive.core.entity.executor.MultiResult; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java rename to dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java index 3521f352..9ff20c5b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.executor; +package com.gitee.dorive.core.util; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.core.util.CriterionUtils; +import com.gitee.dorive.core.entity.executor.Criterion; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java index 89f34481..26c32b17 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java @@ -20,7 +20,7 @@ package com.gitee.dorive.query.impl.builder; 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.MultiInBuilder; +import com.gitee.dorive.core.util.MultiInBuilder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -- Gitee From 2f811ff7ebb0eb92514057562dc04900fb4bbf92 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 19 Dec 2023 16:10:23 +0800 Subject: [PATCH 053/146] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AD=90=E5=B5=8C?= =?UTF-8?q?=E5=A5=97=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/constant/Operator.java | 2 ++ .../dorive/core/entity/executor/Example.java | 15 ++++++++ .../core/impl/executor/FieldExecutor.java | 33 +++++++++++------ .../boot/starter/impl/AppenderContext.java | 12 +++++++ .../starter/impl/MybatisPlusExecutor.java | 21 +++-------- .../boot/starter/util/WrapperUtils.java | 36 +++++++++++++++++++ 6 files changed, 93 insertions(+), 26 deletions(-) create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java index 007197bb..d1debe82 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Operator.java @@ -32,4 +32,6 @@ public interface Operator { String IS_NOT_NULL = "IS NOT NULL"; String MULTI_IN = "MULTI_IN"; String MULTI_NOT_IN = "MULTI_NOT_IN"; + String AND = "AND"; + String OR = "OR"; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java index 8b9d547b..f6b2aac0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java @@ -26,6 +26,7 @@ import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.Consumer; @Data @NoArgsConstructor @@ -129,6 +130,20 @@ public class Example { return this; } + public Example and(Consumer consumer) { + Example example = new InnerExample(); + consumer.accept(example); + criteria.add(new Criterion("@Lambda", Operator.AND, example)); + return this; + } + + public Example or(Consumer consumer) { + Example example = new InnerExample(); + consumer.accept(example); + criteria.add(new Criterion("@Lambda", Operator.OR, example)); + return this; + } + public Example orderByAsc(String... properties) { orderBy = new OrderBy(Arrays.asList(properties), Order.ASC); return this; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java index c9680021..9e22fe64 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.impl.executor; +import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; @@ -61,22 +62,34 @@ public class FieldExecutor extends AbstractExampleExecutor { private void convertCriteria(Context context, List criteria) { if (criteria != null && !criteria.isEmpty()) { for (Criterion criterion : criteria) { - String property = criterion.getProperty(); - String alias = entityEle.toAlias(property); - criterion.setProperty(alias); - - Object value = criterion.getValue(); - if (converterMap != null && !converterMap.isEmpty()) { - FieldConverter fieldConverter = converterMap.get(property); - if (fieldConverter != null) { - Object mappedValue = fieldConverter.convert(context, criterion, value); - criterion.setValue(mappedValue); + String operator = criterion.getOperator(); + if (Operator.AND.equals(operator) || Operator.OR.equals(operator)) { + Object value = criterion.getValue(); + if (value instanceof Example) { + convert(context, (Example) value); } + } else { + doConvertCriteria(context, criterion); } } } } + private void doConvertCriteria(Context context, Criterion criterion) { + String property = criterion.getProperty(); + String alias = entityEle.toAlias(property); + criterion.setProperty(alias); + + Object value = criterion.getValue(); + if (converterMap != null && !converterMap.isEmpty()) { + FieldConverter fieldConverter = converterMap.get(property); + if (fieldConverter != null) { + Object mappedValue = fieldConverter.convert(context, criterion, value); + criterion.setValue(mappedValue); + } + } + } + private void convertOrderBy(OrderBy orderBy) { if (orderBy != null) { List properties = orderBy.getProperties(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java index 76469784..e3f4e656 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java @@ -19,7 +19,9 @@ package com.gitee.dorive.spring.boot.starter.impl; import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; +import com.gitee.dorive.spring.boot.starter.util.WrapperUtils; import java.util.Collection; import java.util.Map; @@ -62,6 +64,16 @@ public class AppenderContext { String prefix = abstractWrapper.isEmptyOfWhere() ? " WHERE " : " AND "; abstractWrapper.last(prefix + "(" + property + ") NOT IN (" + value + ")"); }); + OPERATOR_CRITERION_APPENDER_MAP.put(Operator.AND, (abstractWrapper, property, value) -> { + if (value instanceof Example) { + abstractWrapper.and(q -> WrapperUtils.appendCriterion(q, (Example) value)); + } + }); + OPERATOR_CRITERION_APPENDER_MAP.put(Operator.OR, (abstractWrapper, property, value) -> { + if (value instanceof Example) { + abstractWrapper.or(q -> WrapperUtils.appendCriterion(q, (Example) value)); + } + }); } } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index 14542fd3..fd7cd8ab 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -46,6 +46,7 @@ import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; +import com.gitee.dorive.spring.boot.starter.util.WrapperUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -69,10 +70,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { private BaseMapper baseMapper; private Class pojoClass; - public MybatisPlusExecutor(EntityDef entityDef, - EntityEle entityEle, - BaseMapper baseMapper, - Class pojoClass) { + public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, BaseMapper baseMapper, Class pojoClass) { this.entityDef = entityDef; this.entityEle = entityEle; this.baseMapper = baseMapper; @@ -144,10 +142,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { queryWrapper.select(sqlSelect); } - for (Criterion criterion : example.getCriteria()) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); - criterionAppender.appendCriterion(queryWrapper, criterion.getProperty(), criterion.getValue()); - } + WrapperUtils.appendCriterion(queryWrapper, example); OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { @@ -250,10 +245,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { private UpdateWrapper buildUpdateWrapper(Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - for (Criterion criterion : example.getCriteria()) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); - criterionAppender.appendCriterion(updateWrapper, criterion.getProperty(), criterion.getValue()); - } + WrapperUtils.appendCriterion(updateWrapper, example); return updateWrapper; } @@ -272,10 +264,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { criterionAppender.appendCriterion(updateWrapper, "id", primaryKey); } if (example != null) { - for (Criterion criterion : example.getCriteria()) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); - criterionAppender.appendCriterion(updateWrapper, criterion.getProperty(), criterion.getValue()); - } + WrapperUtils.appendCriterion(updateWrapper, example); } return updateWrapper; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java new file mode 100644 index 00000000..7b50daa9 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.spring.boot.starter.util; + +import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; +import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; + +import static com.gitee.dorive.spring.boot.starter.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; + +public class WrapperUtils { + + public static void appendCriterion(AbstractWrapper abstractWrapper, Example example) { + for (Criterion criterion : example.getCriteria()) { + CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); + criterionAppender.appendCriterion(abstractWrapper, criterion.getProperty(), criterion.getValue()); + } + } + +} -- Gitee From 26608d3cf31200c7c1a5e374073afc4ef0e45444 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 19 Dec 2023 16:49:35 +0800 Subject: [PATCH 054/146] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8C=BF=E5=90=8D?= =?UTF-8?q?=E5=AD=90=E5=B5=8C=E5=A5=97=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/starter/entity/LambdaExample.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java index c48d9448..db7e9715 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java @@ -18,6 +18,8 @@ package com.gitee.dorive.spring.boot.starter.entity; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.spring.boot.starter.util.LambdaUtils; import lombok.Data; @@ -27,6 +29,7 @@ import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; @Data @NoArgsConstructor @@ -113,6 +116,20 @@ public class LambdaExample extends Example { return this; } + public LambdaExample lambdaAnd(Consumer> consumer) { + LambdaExample example = new LambdaExample<>(); + consumer.accept(example); + getCriteria().add(new Criterion("@Lambda", Operator.AND, example)); + return this; + } + + public LambdaExample lambdaOr(Consumer> consumer) { + LambdaExample example = new LambdaExample<>(); + consumer.accept(example); + getCriteria().add(new Criterion("@Lambda", Operator.OR, example)); + return this; + } + @SafeVarargs public final LambdaExample orderByAsc(SFunction... functions) { List properties = toProperties(functions); -- Gitee From 998b168ff746d2d15cd78a892487971a9e9769ec Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 21 Dec 2023 16:40:28 +0800 Subject: [PATCH 055/146] =?UTF-8?q?SelectorRepository=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/ref/api/SelectorRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java index d7137b08..882b7690 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java @@ -95,4 +95,8 @@ public interface SelectorRepository extends QueryRepository { return selectPageByQuery(new InnerContext(selector), query); } + default long selectCountByQuery(Selector selector, Object query) { + return selectCountByQuery(new InnerContext(selector), query); + } + } -- Gitee From 406601bb16f99f856a41d9913cec9ce6be357763 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 21 Dec 2023 17:58:28 +0800 Subject: [PATCH 056/146] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=EF=BC=8C=E6=8F=90=E5=8D=87=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/MultiResult.java | 41 ------------------- .../dorive/core/entity/executor/Result.java | 8 ++++ .../core/impl/executor/FactoryExecutor.java | 19 ++++----- .../core/impl/handler/MultiEntityHandler.java | 11 ++--- .../core/impl/handler/UnionEntityHandler.java | 13 +++--- .../starter/impl/MybatisPlusExecutor.java | 11 +++-- 6 files changed, 31 insertions(+), 72 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java deleted file mode 100644 index ca49bdec..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/MultiResult.java +++ /dev/null @@ -1,41 +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.entity.executor; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; -import java.util.Map; - -@Data -@EqualsAndHashCode(callSuper = false) -public class MultiResult extends Result { - - private List> resultMaps; - - public MultiResult(Page page, List> resultMaps) { - setPage(page); - this.resultMaps = resultMaps; - } - - public MultiResult(List> resultMaps) { - this.resultMaps = resultMaps; - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java index 62afcb67..c92bbb2d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java @@ -22,16 +22,24 @@ import lombok.NoArgsConstructor; import java.util.Collections; import java.util.List; +import java.util.Map; @Data @NoArgsConstructor public class Result { private Page page; + private List> recordMaps = Collections.emptyList(); private List records = Collections.emptyList(); private E record; private long count = 0L; + public Result(Page page, List> recordMaps) { + this.page = page; + this.recordMaps = recordMaps; + this.count = this.recordMaps.size(); + } + public Result(Page page) { this.page = page; this.records = page.getRecords(); 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 804dee38..36d87193 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 @@ -47,27 +47,26 @@ public class FactoryExecutor extends AbstractProxyExecutor { @Override public Result executeQuery(Context context, Query query) { Result result = super.executeQuery(context, query); - MultiResult multiResult = (MultiResult) result; - Page page = multiResult.getPage(); - List> resultMaps = multiResult.getResultMaps(); + Page page = result.getPage(); + List> recordMaps = result.getRecordMaps(); List entities = Collections.emptyList(); - if (resultMaps != null && !resultMaps.isEmpty()) { + if (recordMaps != null && !recordMaps.isEmpty()) { Example example = query.getExample(); if (example instanceof UnionExample) { - entities = reconstituteWithoutDuplicate(context, resultMaps); + entities = reconstituteWithoutDuplicate(context, recordMaps); } else { - entities = reconstitute(context, resultMaps); + entities = reconstitute(context, recordMaps); } } if (page != null) { page.setRecords(entities); } - multiResult.setRecords(entities); - multiResult.setRecord(!entities.isEmpty() ? entities.get(0) : null); - multiResult.setCount(entities.size()); - return multiResult; + result.setRecords(entities); + result.setRecord(!entities.isEmpty() ? entities.get(0) : null); + result.setCount(entities.size()); + return result; } private List reconstituteWithoutDuplicate(Context context, List> resultMaps) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index 40276822..9acdcbdf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -22,8 +22,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.util.MultiInBuilder; -import com.gitee.dorive.core.entity.executor.MultiResult; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; @@ -33,6 +31,7 @@ import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.util.MultiInBuilder; import lombok.AllArgsConstructor; import lombok.Data; @@ -58,9 +57,7 @@ public class MultiEntityHandler implements EntityHandler { Query query = operationFactory.buildQueryByExample(example); query.setRootType(Operation.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); - if (result instanceof MultiResult) { - setValueForRootEntities(context, entities, entityIndex, (MultiResult) result); - } + setValueForRootEntities(context, entities, entityIndex, result); return result.getCount(); } return 0L; @@ -171,7 +168,7 @@ public class MultiEntityHandler implements EntityHandler { } @SuppressWarnings("unchecked") - private void setValueForRootEntities(Context context, List rootEntities, Map entityIndex, MultiResult multiResult) { + private void setValueForRootEntities(Context context, List rootEntities, Map entityIndex, Result result) { boolean isCollection = repository.getEntityEle().isCollection(); PropChain anchorPoint = repository.getAnchorPoint(); @@ -179,7 +176,7 @@ public class MultiEntityHandler implements EntityHandler { Map> mergedBindersMap = binderResolver.getMergedBindersMap(); List binders = mergedBindersMap.get("/"); - List entities = multiResult.getRecords(); + List entities = result.getRecords(); int averageSize = entities.size() / rootEntities.size() + 1; for (Object entity : entities) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java index 9de37af0..9a83ed56 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java @@ -22,7 +22,6 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.MultiResult; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Operation; @@ -55,9 +54,7 @@ public class UnionEntityHandler implements EntityHandler { Query query = operationFactory.buildQueryByExample(example); query.setRootType(Operation.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); - if (result instanceof MultiResult) { - setValueForRootEntities(entities, (MultiResult) result); - } + setValueForRootEntities(entities, result); return result.getCount(); } return 0L; @@ -110,16 +107,16 @@ public class UnionEntityHandler implements EntityHandler { return example; } - private void setValueForRootEntities(List rootEntities, MultiResult multiResult) { + private void setValueForRootEntities(List rootEntities, Result result) { boolean isCollection = repository.getEntityEle().isCollection(); PropChain anchorPoint = repository.getAnchorPoint(); - List> resultMaps = multiResult.getResultMaps(); - int averageSize = resultMaps.size() / rootEntities.size() + 1; + List> recordMaps = result.getRecordMaps(); + int averageSize = recordMaps.size() / rootEntities.size() + 1; int lastRowNum = -1; Collection lastCollection = null; - for (Map resultMap : resultMaps) { + for (Map resultMap : recordMaps) { Integer rowNum = NumberUtils.intValue(resultMap.get("$row")); Object entity = resultMap.get("$entity"); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index fd7cd8ab..e5299c3b 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -34,7 +34,6 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.MultiResult; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; @@ -83,7 +82,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", query.getPrimaryKey()); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new MultiResult(resultMaps); + return new Result<>(null, resultMaps); } else if (query.getExample() != null) { Example example = query.getExample(); @@ -95,23 +94,23 @@ public class MybatisPlusExecutor extends AbstractExecutor { queryPage = baseMapper.selectMapsPage(queryPage, queryWrapper); page.setTotal(queryPage.getTotal()); - return new MultiResult(page, queryPage.getRecords()); + return new Result<>(page, queryPage.getRecords()); } else { if (example instanceof UnionExample) { UnionExample unionExample = (UnionExample) example; QueryWrapper queryWrapper = buildQueryWrapper(unionExample); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new MultiResult(resultMaps); + return new Result<>(null, resultMaps); } else { QueryWrapper queryWrapper = buildQueryWrapper(example); List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new MultiResult(resultMaps); + return new Result<>(null, resultMaps); } } } - return new MultiResult(Collections.emptyList()); + return new Result<>(null, Collections.emptyList()); } @Override -- Gitee From f452ecdd8a7890490b09e314d5e1685b4291db8e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 22 Dec 2023 13:15:22 +0800 Subject: [PATCH 057/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityFactoryBuilder?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E5=B7=A5=E5=8E=82=E6=9E=84=E5=BB=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=BD=92=E5=85=A5=E6=A0=B8=E5=BF=83=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/entity/ExecutorResult.java | 30 ------- .../impl/factory/DefaultEntityFactory.java | 4 +- .../impl/factory/EntityFactoryBuilder.java | 89 +++++++++++++++++++ .../repository/AbstractContextRepository.java | 27 ++++-- .../repository/MybatisPlusRepository.java | 87 +++++------------- 5 files changed, 132 insertions(+), 105 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java deleted file mode 100644 index 2e9e41b5..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/ExecutorResult.java +++ /dev/null @@ -1,30 +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.entity; - -import com.gitee.dorive.core.api.executor.EntityFactory; -import com.gitee.dorive.core.api.executor.Executor; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class ExecutorResult { - private EntityFactory entityFactory; - private Executor executor; -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index 80e0153f..b0506f4a 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 @@ -45,7 +45,7 @@ public class DefaultEntityFactory implements EntityFactory { private Map propConverterMap; private CopyOptions deCopyOptions; - public void setReCopyOptions(Map aliasFieldMapping, Map fieldConverterMap) { + public void newReCopyOptions(Map aliasFieldMapping, Map fieldConverterMap) { this.aliasFieldMapping = aliasFieldMapping; this.fieldConverterMap = fieldConverterMap; this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(aliasFieldMapping::get); @@ -57,7 +57,7 @@ public class DefaultEntityFactory implements EntityFactory { } } - public void setDeCopyOptions(Map fieldPropMapping, Map propConverterMap) { + public void newDeCopyOptions(Map fieldPropMapping, Map propConverterMap) { this.fieldPropMapping = fieldPropMapping; this.propConverterMap = propConverterMap; this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldPropMapping::get); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java new file mode 100644 index 00000000..2a78da77 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.factory; + +import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.repository.AbstractContextRepository; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.context.ApplicationContext; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +public class EntityFactoryBuilder { + + private ApplicationContext applicationContext; + private AbstractContextRepository.EntityInfo entityInfo; + private Map fieldConverterMap; + + public EntityFactory build(EntityDef entityDef, EntityEle entityEle) { + Class factoryClass = entityDef.getFactory(); + EntityFactory entityFactory; + if (factoryClass == Object.class) { + entityFactory = new DefaultEntityFactory(); + } else { + entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); + } + if (entityFactory instanceof DefaultEntityFactory) { + DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; + defaultEntityFactory.setEntityEle(entityEle); + defaultEntityFactory.setPojoClass(entityInfo.getPojoClass()); + + Map aliasFieldMapping = newAliasFieldMapping(entityEle); + defaultEntityFactory.newReCopyOptions(aliasFieldMapping, fieldConverterMap); + + Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); + defaultEntityFactory.newDeCopyOptions(fieldPropMapping, newPropConverterMap(fieldPropMapping, fieldConverterMap)); + } + return entityFactory; + } + + private Map newAliasFieldMapping(EntityEle entityEle) { + Map fieldAliasMap = entityEle.getFieldAliasMap(); + return fieldAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + } + + private Map newFieldPropMapping(Map aliasFieldMapping) { + Map fieldPropMapping = new LinkedHashMap<>(); + Map propAliasMapping = entityInfo.getPropAliasMapping(); + propAliasMapping.forEach((prop, alias) -> { + String field = aliasFieldMapping.get(alias); + if (field != null) { + fieldPropMapping.put(field, prop); + } + }); + return fieldPropMapping; + } + + private Map newPropConverterMap(Map fieldPropMapping, Map converterMap) { + Map propConverterMap = new LinkedHashMap<>(converterMap.size()); + converterMap.forEach((field, fieldConverter) -> { + String prop = fieldPropMapping.get(field); + propConverterMap.put(prop, fieldConverter); + }); + return propConverterMap; + } + +} 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 63cd0367..fbdfc112 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 @@ -36,17 +36,18 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.config.RepositoryContext; -import com.gitee.dorive.core.entity.ExecutorResult; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; import com.gitee.dorive.core.impl.executor.DefaultExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.executor.FieldExecutor; +import com.gitee.dorive.core.impl.factory.EntityFactoryBuilder; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; @@ -176,15 +177,16 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityEle(entityEle); defaultRepository.setOperationFactory(operationFactory); - Map converterMap = newConverterMap(entityEle); Map attachments = new ConcurrentHashMap<>(8); + EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle, attachments); + Map fieldConverterMap = newFieldConverterMap(entityEle); - ExecutorResult executorResult = newExecutor(entityDef, entityEle, converterMap, attachments); - EntityFactory entityFactory = executorResult.getEntityFactory(); - Executor executor = executorResult.getExecutor(); + Executor executor = newExecutor(entityDef, entityEle); + EntityFactoryBuilder entityFactoryBuilder = new EntityFactoryBuilder(applicationContext, entityInfo, fieldConverterMap); + EntityFactory entityFactory = entityFactoryBuilder.build(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); - executor = new FieldExecutor(executor, entityEle, converterMap); + executor = new FieldExecutor(executor, entityEle, fieldConverterMap); attachments.put(Keys.FIELD_EXECUTOR, executor); defaultRepository.setExecutor(executor); @@ -193,7 +195,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor return (AbstractRepository) repository; } - private Map newConverterMap(EntityEle entityEle) { + private Map newFieldConverterMap(EntityEle entityEle) { Map converterMap = new LinkedHashMap<>(8); Map entityFieldMap = entityEle.getEntityFieldMap(); if (entityFieldMap != null) { @@ -237,10 +239,19 @@ public abstract class AbstractContextRepository extends AbstractRepositor return new DefaultExecutor(this, entityHandler); } - protected abstract ExecutorResult newExecutor(EntityDef entityDef, EntityEle entityEle, Map converterMap, Map attachments); + protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle, Map attachments); + + protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle); protected abstract AbstractRepository processRepository(AbstractRepository repository); protected abstract EntityHandler processEntityHandler(EntityHandler entityHandler); + @Data + @AllArgsConstructor + public static class EntityInfo { + private Class pojoClass; + Map propAliasMapping; + } + } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index 2e6a7a18..cfbd7746 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -22,22 +22,18 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.gitee.dorive.api.api.ImplFactory; import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.executor.FieldConverter; -import com.gitee.dorive.core.entity.ExecutorResult; -import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.spring.boot.starter.impl.MybatisPlusExecutor; -import com.gitee.dorive.api.api.ImplFactory; import com.gitee.dorive.sql.api.SqlRunner; +import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.sql.impl.SegmentBuilder; import com.gitee.dorive.sql.impl.SqlQueryBuilder; import lombok.Data; @@ -49,12 +45,14 @@ import java.lang.reflect.Type; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; @Data @EqualsAndHashCode(callSuper = false) public class MybatisPlusRepository extends AbstractRefRepository { + private BaseMapper mapper; + private Class pojoClass; + private TableInfo tableInfo; private QueryBuilder sqlQueryBuilder; private CountQuerier countQuerier; @@ -70,12 +68,11 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override @SuppressWarnings("unchecked") - protected ExecutorResult newExecutor(EntityDef entityDef, EntityEle entityEle, Map converterMap, Map attachments) { + protected EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle, Map attachments) { Class mapperClass = entityDef.getSource(); - Object mapper = null; - Class pojoClass = null; if (mapperClass != Object.class) { - mapper = getApplicationContext().getBean(mapperClass); + mapper = (BaseMapper) getApplicationContext().getBean(mapperClass); + Assert.notNull(mapper, "The mapper cannot be null! source: {}", mapperClass); Type[] genericInterfaces = mapperClass.getGenericInterfaces(); if (genericInterfaces.length > 0) { Type genericInterface = mapperClass.getGenericInterfaces()[0]; @@ -86,74 +83,34 @@ public class MybatisPlusRepository extends AbstractRefRepository { } } } - Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); - TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); + tableInfo = TableInfoHelper.getTableInfo(pojoClass); + Assert.notNull(tableInfo, "The table info cannot be null! source: {}", mapperClass); if (tableInfo != null) { attachments.put(Keys.TABLE_NAME, tableInfo.getTableName()); } - - EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, pojoClass, tableInfo, converterMap); - Executor executor = new MybatisPlusExecutor(entityDef, entityEle, (BaseMapper) mapper, (Class) pojoClass); - return new ExecutorResult(entityFactory, executor); - } - - private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, Class pojoClass, TableInfo tableInfo, - Map converterMap) { - Class factoryClass = entityDef.getFactory(); - EntityFactory entityFactory; - if (factoryClass == Object.class) { - entityFactory = new DefaultEntityFactory(); - } else { - entityFactory = (EntityFactory) getApplicationContext().getBean(factoryClass); - } - if (entityFactory instanceof DefaultEntityFactory) { - DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; - defaultEntityFactory.setEntityEle(entityEle); - defaultEntityFactory.setPojoClass(pojoClass); - - Map aliasFieldMapping = newAliasFieldMapping(entityEle); - defaultEntityFactory.setReCopyOptions(aliasFieldMapping, converterMap); - - Map fieldPropMapping = newFieldPropMapping(tableInfo, aliasFieldMapping); - defaultEntityFactory.setDeCopyOptions(fieldPropMapping, newPropConverterMap(fieldPropMapping, converterMap)); - } - return entityFactory; + return new EntityInfo(pojoClass, getPropAliasMapping()); } - private Map newAliasFieldMapping(EntityEle entityEle) { - Map fieldAliasMap = entityEle.getFieldAliasMap(); - return fieldAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); - } - - private Map newFieldPropMapping(TableInfo tableInfo, Map aliasFieldMapping) { - String keyColumn = tableInfo.getKeyColumn(); + private Map getPropAliasMapping() { String keyProperty = tableInfo.getKeyProperty(); + String keyColumn = tableInfo.getKeyColumn(); List tableFieldInfos = tableInfo.getFieldList(); - Map fieldPropMapping = new LinkedHashMap<>(); - if (StringUtils.isNotBlank(keyColumn) && StringUtils.isNotBlank(keyProperty)) { - String field = aliasFieldMapping.get(keyColumn); - if (field != null) { - fieldPropMapping.put(field, keyProperty); - } + Map propAliasMapping = new LinkedHashMap<>(); + if (StringUtils.isNotBlank(keyProperty) && StringUtils.isNotBlank(keyColumn)) { + propAliasMapping.put(keyProperty, keyColumn); } for (TableFieldInfo tableFieldInfo : tableFieldInfos) { - String field = aliasFieldMapping.get(tableFieldInfo.getColumn()); - if (field != null) { - fieldPropMapping.put(field, tableFieldInfo.getProperty()); - } + propAliasMapping.put(tableFieldInfo.getProperty(), tableFieldInfo.getColumn()); } - return fieldPropMapping; + return propAliasMapping; } - private Map newPropConverterMap(Map fieldPropMapping, Map converterMap) { - Map propConverterMap = new LinkedHashMap<>(converterMap.size()); - converterMap.forEach((field, fieldConverter) -> { - String prop = fieldPropMapping.get(field); - propConverterMap.put(prop, fieldConverter); - }); - return propConverterMap; + @Override + @SuppressWarnings("unchecked") + protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle) { + return new MybatisPlusExecutor(entityDef, entityEle, mapper, (Class) pojoClass); } @Override -- Gitee From c7791d8365c2217c27c20a63330fb7b4b354bbf3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 22 Dec 2023 13:46:52 +0800 Subject: [PATCH 058/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityFactoryBuilder?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E5=B7=A5=E5=8E=82=E6=9E=84=E5=BB=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=BD=92=E5=85=A5=E6=A0=B8=E5=BF=83=E9=80=BB=E8=BE=91?= 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 fbdfc112..5ae6b0d7 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 @@ -251,7 +251,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor @AllArgsConstructor public static class EntityInfo { private Class pojoClass; - Map propAliasMapping; + private Map propAliasMapping; } } -- Gitee From 2c88c58808cf4842813b35d26f913e58c1e96e7e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 22 Dec 2023 16:07:48 +0800 Subject: [PATCH 059/146] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/query/entity/MergedRepository.java | 4 ++-- .../dorive/query/impl/resolver/MergedRepositoryResolver.java | 4 ++-- 2 files changed, 4 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 03eaeb72..a4c107f8 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 @@ -31,10 +31,10 @@ public class MergedRepository { private String lastAccessPath; private String absoluteAccessPath; + private String relativeAccessPath; + private boolean merged; private CommonRepository definedRepository; private Map> mergedBindersMap; - private boolean merged; - private String relativeAccessPath; private CommonRepository executedRepository; private Integer order; 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 0f380f1f..bcbef8da 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 @@ -73,10 +73,10 @@ public class MergedRepositoryResolver { MergedRepository mergedRepository = new MergedRepository( lastAccessPath, absoluteAccessPath, + relativeAccessPath, + abstractContextRepository != null, repository, getMergedBindersMap(lastAccessPath, repository), - abstractContextRepository != null, - relativeAccessPath, executedRepository, mergedRepositoryMap.size() + 1); addMergedRepository(mergedRepository); -- Gitee From 799e3344b6c4d92d2f2f18aa6173f3b5ecc660b1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 22 Dec 2023 16:42:29 +0800 Subject: [PATCH 060/146] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BB=93=E5=82=A8?= =?UTF-8?q?=E5=9F=BA=E7=B1=BB=E7=9A=84=E9=99=84=E5=8A=A0=E5=8F=82=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=85=A8=E5=B1=80=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/constant/Keys.java | 2 -- .../repository/AbstractContextRepository.java | 26 ++++++++++++------- .../core/repository/AbstractRepository.java | 2 -- .../gitee/dorive/ref/impl/RefInjector.java | 1 - .../repository/MybatisPlusRepository.java | 9 +++---- .../gitee/dorive/sql/impl/SegmentBuilder.java | 24 ++++++++++++----- 6 files changed, 37 insertions(+), 27 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java index c9f13a32..e102a247 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java @@ -18,7 +18,5 @@ package com.gitee.dorive.api.constant; public interface Keys { - String FIELD_EXECUTOR = "FIELD_EXECUTOR"; String QUERIER = "QUERIER"; - String TABLE_NAME = "TABLE_NAME"; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 5ae6b0d7..0a055e86 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 @@ -21,7 +21,6 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.def.FieldDef; @@ -67,6 +66,9 @@ import java.util.concurrent.ConcurrentHashMap; @EqualsAndHashCode(callSuper = false) public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { + private static final Map ENTITY_INFO_MAP = new ConcurrentHashMap<>(); + private static final Map FIELD_EXECUTOR_MAP = new ConcurrentHashMap<>(); + private ApplicationContext applicationContext; private PropChainResolver propChainResolver; @@ -77,6 +79,14 @@ public abstract class AbstractContextRepository extends AbstractRepositor private List subRepositories = new ArrayList<>(); private List orderedRepositories = new ArrayList<>(); + public static EntityInfo getEntityInfo(EntityEle entityEle) { + return ENTITY_INFO_MAP.get(entityEle); + } + + public static FieldExecutor getFieldExecutor(EntityEle entityEle) { + return FIELD_EXECUTOR_MAP.get(entityEle); + } + @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; @@ -111,7 +121,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor setEntityEle(rootRepository.getEntityEle()); setOperationFactory(rootRepository.getOperationFactory()); setExecutor(newDefaultExecutor()); - setAttachments(new ConcurrentHashMap<>(rootRepository.getAttachments())); } private CommonRepository newRepository(String accessPath, EntityEle entityEle) { @@ -136,7 +145,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setEntityEle(entityEle); repository.setOperationFactory(operationFactory); repository.setProxyRepository(proxyRepository); - repository.setAttachments(new ConcurrentHashMap<>(actualRepository.getAttachments())); repository.setAccessPath(accessPath); repository.setRoot(isRoot); @@ -146,7 +154,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setAnchorPoint(anchorPoint); repository.setBinderResolver(binderResolver); repository.setBoundEntity(false); - return repository; } @@ -177,8 +184,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityEle(entityEle); defaultRepository.setOperationFactory(operationFactory); - Map attachments = new ConcurrentHashMap<>(8); - EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle, attachments); + EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle); + ENTITY_INFO_MAP.put(entityEle, entityInfo); Map fieldConverterMap = newFieldConverterMap(entityEle); Executor executor = newExecutor(entityDef, entityEle); @@ -187,10 +194,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor executor = new FactoryExecutor(executor, entityEle, entityFactory); executor = new FieldExecutor(executor, entityEle, fieldConverterMap); - attachments.put(Keys.FIELD_EXECUTOR, executor); - + FIELD_EXECUTOR_MAP.put(entityEle, (FieldExecutor) executor); defaultRepository.setExecutor(executor); - defaultRepository.setAttachments(attachments); } return (AbstractRepository) repository; } @@ -239,7 +244,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor return new DefaultExecutor(this, entityHandler); } - protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle, Map attachments); + protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle); protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle); @@ -251,6 +256,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor @AllArgsConstructor public static class EntityInfo { private Class pojoClass; + private String tableName; private Map propAliasMapping; } 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 42f85d7c..53ac050c 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 @@ -35,7 +35,6 @@ import com.gitee.dorive.core.impl.factory.OperationFactory; import lombok.Data; import java.util.List; -import java.util.Map; @Data public abstract class AbstractRepository implements Repository, Executor { @@ -44,7 +43,6 @@ public abstract class AbstractRepository implements Repository, Ex private EntityEle entityEle; private OperationFactory operationFactory; private Executor executor; - private Map attachments; public Class getEntityClass() { return entityEle.getGenericType(); 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 f2bc4ae0..aedd37cd 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 @@ -65,7 +65,6 @@ public class RefInjector { refImpl.setEntityEle(repository.getEntityEle()); refImpl.setOperationFactory(repository.getOperationFactory()); refImpl.setExecutor(repository.getExecutor()); - refImpl.setAttachments(repository.getAttachments()); return refImpl; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index cfbd7746..d34313bd 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -68,7 +68,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override @SuppressWarnings("unchecked") - protected EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle, Map attachments) { + protected EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle) { Class mapperClass = entityDef.getSource(); if (mapperClass != Object.class) { mapper = (BaseMapper) getApplicationContext().getBean(mapperClass); @@ -86,10 +86,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); tableInfo = TableInfoHelper.getTableInfo(pojoClass); Assert.notNull(tableInfo, "The table info cannot be null! source: {}", mapperClass); - if (tableInfo != null) { - attachments.put(Keys.TABLE_NAME, tableInfo.getTableName()); - } - return new EntityInfo(pojoClass, getPropAliasMapping()); + String tableName = tableInfo != null ? tableInfo.getTableName() : null; + Map propAliasMapping = getPropAliasMapping(); + return new EntityInfo(pojoClass, tableName, propAliasMapping); } private Map getPropAliasMapping() { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 45fa5b24..6c432a90 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -17,8 +17,8 @@ package com.gitee.dorive.sql.impl; -import com.gitee.dorive.api.constant.Keys; import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; @@ -26,16 +26,25 @@ import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.executor.FieldExecutor; 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.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.impl.builder.QueryResolver; -import com.gitee.dorive.sql.entity.*; -import com.gitee.dorive.core.util.CriterionUtils; +import com.gitee.dorive.sql.entity.ArgSegment; +import com.gitee.dorive.sql.entity.JoinSegment; +import com.gitee.dorive.sql.entity.OnSegment; +import com.gitee.dorive.sql.entity.SelectSegment; +import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data public class SegmentBuilder { @@ -54,10 +63,11 @@ public class SegmentBuilder { String relativeAccessPath = mergedRepository.getRelativeAccessPath(); CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - Map attachments = executedRepository.getAttachments(); - String tableName = (String) attachments.get(Keys.TABLE_NAME); - FieldExecutor fieldExecutor = (FieldExecutor) attachments.get(Keys.FIELD_EXECUTOR); + EntityEle entityEle = executedRepository.getEntityEle(); + AbstractContextRepository.EntityInfo entityInfo = AbstractContextRepository.getEntityInfo(entityEle); + FieldExecutor fieldExecutor = AbstractContextRepository.getFieldExecutor(entityEle); + String tableName = entityInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); fieldExecutor.convert(context, example); -- Gitee From d934a00e862b741ed719931c490e4c10af69799f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 22 Dec 2023 16:46:12 +0800 Subject: [PATCH 061/146] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/factory/EntityFactoryBuilder.java | 3 ++- .../dorive/core/repository/AbstractContextRepository.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java index 2a78da77..50b44c9e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java @@ -34,7 +34,7 @@ import java.util.stream.Collectors; @AllArgsConstructor public class EntityFactoryBuilder { - private ApplicationContext applicationContext; + private AbstractContextRepository repository; private AbstractContextRepository.EntityInfo entityInfo; private Map fieldConverterMap; @@ -44,6 +44,7 @@ public class EntityFactoryBuilder { if (factoryClass == Object.class) { entityFactory = new DefaultEntityFactory(); } else { + ApplicationContext applicationContext = repository.getApplicationContext(); entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); } if (entityFactory instanceof DefaultEntityFactory) { 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 0a055e86..bc19e744 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 @@ -189,7 +189,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor Map fieldConverterMap = newFieldConverterMap(entityEle); Executor executor = newExecutor(entityDef, entityEle); - EntityFactoryBuilder entityFactoryBuilder = new EntityFactoryBuilder(applicationContext, entityInfo, fieldConverterMap); + EntityFactoryBuilder entityFactoryBuilder = new EntityFactoryBuilder(this, entityInfo, fieldConverterMap); EntityFactory entityFactory = entityFactoryBuilder.build(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); -- Gitee From 0d21e1cc5cfac7bd01d492ccbaeeddd5cec2b7c8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 25 Dec 2023 14:43:31 +0800 Subject: [PATCH 062/146] =?UTF-8?q?=E5=B0=86=E6=9F=A5=E8=AF=A2=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=BD=9C=E4=B8=BA=E4=B8=8A=E4=B8=8B=E6=96=87=E7=9A=84?= =?UTF-8?q?=E6=A0=87=E5=87=86=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/api/context/Context.java | 4 ++++ .../core/entity/context/AbstractContext.java | 1 + .../dorive/core/entity/context/Strategy.java | 17 ++++++++++++++--- .../repository/MybatisPlusRepository.java | 8 ++++---- 4 files changed, 23 insertions(+), 7 deletions(-) rename dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java => dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java (74%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index 8957713a..e5029ae9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -17,6 +17,8 @@ package com.gitee.dorive.core.api.context; +import com.gitee.dorive.core.entity.context.Strategy; + import java.util.Map; public interface Context { @@ -25,4 +27,6 @@ public interface Context { Map getAttachments(); + Strategy getStrategy(); + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 4db5f397..6119d6a5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -31,6 +31,7 @@ public abstract class AbstractContext implements Context { private Selector selector = Selector.EMPTY; private Map attachments = new LinkedHashMap<>(8); + private Strategy strategy = new Strategy(); public AbstractContext(Selector selector) { this.selector = selector; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java similarity index 74% rename from dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java index e102a247..07bd8cf1 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/Keys.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java @@ -15,8 +15,19 @@ * limitations under the License. */ -package com.gitee.dorive.api.constant; +package com.gitee.dorive.core.entity.context; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Strategy { + + private Query query; + + public enum Query {DEFAULT, SQL,} -public interface Keys { - String QUERIER = "QUERIER"; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java index d34313bd..6ae6b9b7 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java @@ -23,11 +23,11 @@ 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.constant.Keys; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.context.Strategy; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; @@ -114,9 +114,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { - Map attachments = context.getAttachments(); - String querier = (String) attachments.get(Keys.QUERIER); - if (querier == null || "SQL".equals(querier)) { + Strategy strategy = context.getStrategy(); + Strategy.Query query = strategy.getQuery(); + if (query == null || Strategy.Query.SQL.equals(query)) { return sqlQueryBuilder; } return super.adaptiveQueryBuilder(context, buildQuery); -- Gitee From 10660ff357a01eb8b09c46ef995e26072650ec58 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 27 Dec 2023 11:34:21 +0800 Subject: [PATCH 063/146] =?UTF-8?q?=E4=B8=BAget=E8=AF=B7=E6=B1=82String?= =?UTF-8?q?=E8=BD=ACDate=E6=8F=90=E4=BE=9B=E9=BB=98=E8=AE=A4=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-web/pom.xml | 6 +-- .../web/advice/ParameterControllerAdvice.java | 38 +++++++++++++++++++ .../web/config/DoriveWebConfiguration.java | 34 +++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../main/resources/META-INF/spring.factories | 2 + pom.xml | 6 +-- 6 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java create mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java create mode 100644 dorive-web/src/main/resources/META-INF.spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 dorive-web/src/main/resources/META-INF/spring.factories diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 76b7c3fc..d0151dc1 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -12,11 +12,7 @@ org.springframework.boot - spring-boot-starter - - - com.fasterxml.jackson.core - jackson-annotations + spring-boot-starter-web org.projectlombok diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java b/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java new file mode 100644 index 00000000..b93eb056 --- /dev/null +++ b/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java @@ -0,0 +1,38 @@ +package com.gitee.dorive.web.advice; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.beans.PropertyEditorSupport; +import java.util.Date; + +@RestControllerAdvice +public class ParameterControllerAdvice { + + @InitBinder + public void initBinder(WebDataBinder webDataBinder) { + webDataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + if (StringUtils.isBlank(text)) { + return; + } + text = text.trim(); + Object value; + boolean isNumber = NumberUtil.isNumber(text); + if (isNumber) { + int multi = NumberUtil.pow(10, 13 - text.length()).intValue(); + value = DateUtil.date(NumberUtil.parseLong(text) * multi); + } else { + value = DateUtil.parseDateTime(text); + } + setValue(value); + } + }); + } + +} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java new file mode 100644 index 00000000..5ec57b8a --- /dev/null +++ b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.web.config; + +import com.gitee.dorive.web.advice.ParameterControllerAdvice; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +@Order(-100) +@Configuration +public class DoriveWebConfiguration { + + @Bean("parameterControllerAdvice") + public static ParameterControllerAdvice parameterControllerAdvice() { + return new ParameterControllerAdvice(); + } + +} diff --git a/dorive-web/src/main/resources/META-INF.spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-web/src/main/resources/META-INF.spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..9cee1bae --- /dev/null +++ b/dorive-web/src/main/resources/META-INF.spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.gitee.dorive.web.config.DoriveWebConfiguration \ No newline at end of file diff --git a/dorive-web/src/main/resources/META-INF/spring.factories b/dorive-web/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..388ace25 --- /dev/null +++ b/dorive-web/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.gitee.dorive.web.config.DoriveWebConfiguration \ No newline at end of file diff --git a/pom.xml b/pom.xml index 91c57ed0..08b2249a 100644 --- a/pom.xml +++ b/pom.xml @@ -57,9 +57,9 @@ 2.7.8 - com.fasterxml.jackson.core - jackson-annotations - 2.13.4 + org.springframework.boot + spring-boot-starter-web + 2.7.8 org.projectlombok -- Gitee From 76656b2abf25fdf3f8339b2a9da2df5b33d85437 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 27 Dec 2023 12:55:40 +0800 Subject: [PATCH 064/146] =?UTF-8?q?=E4=B8=BAget=E8=AF=B7=E6=B1=82String?= =?UTF-8?q?=E8=BD=ACDate=E6=8F=90=E4=BE=9B=E9=BB=98=E8=AE=A4=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/web/advice/ParameterControllerAdvice.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java b/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java index b93eb056..db8e69e9 100644 --- a/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java +++ b/dorive-web/src/main/java/com/gitee/dorive/web/advice/ParameterControllerAdvice.java @@ -25,8 +25,9 @@ public class ParameterControllerAdvice { Object value; boolean isNumber = NumberUtil.isNumber(text); if (isNumber) { - int multi = NumberUtil.pow(10, 13 - text.length()).intValue(); - value = DateUtil.date(NumberUtil.parseLong(text) * multi); + long number = NumberUtil.parseLong(text); + int multi = NumberUtil.pow(10, 13 - String.valueOf(number).length()).intValue(); + value = DateUtil.date(number * multi); } else { value = DateUtil.parseDateTime(text); } -- Gitee From 10bc61c93810e069040649d04ba8c2ff07008f0a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 27 Dec 2023 13:52:48 +0800 Subject: [PATCH 065/146] =?UTF-8?q?=E5=B0=86OperationType=E4=BB=8E?= =?UTF-8?q?=E6=A0=87=E5=87=86=E4=B8=AD=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/constant/OperationType.java | 30 --------------- .../dorive/core/entity/operation/Delete.java | 3 +- .../dorive/core/entity/operation/Insert.java | 3 +- .../core/entity/operation/NullableUpdate.java | 3 +- .../core/entity/operation/Operation.java | 38 +++++++++++++------ .../dorive/core/entity/operation/Query.java | 3 +- .../dorive/core/entity/operation/Update.java | 3 +- .../core/impl/executor/DefaultExecutor.java | 23 ++++++----- .../core/impl/factory/OperationFactory.java | 15 ++++---- .../core/impl/handler/MultiEntityHandler.java | 3 +- .../core/impl/handler/UnionEntityHandler.java | 3 +- .../repository/AbstractGenericRepository.java | 3 +- 12 files changed, 55 insertions(+), 75 deletions(-) delete mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java deleted file mode 100644 index a0a03fbb..00000000 --- a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java +++ /dev/null @@ -1,30 +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.constant; - -public interface OperationType { - int NONE = 0x00000000; - int SELECT = 0x00000001; - int INSERT = 0x00000002; - int UPDATE = 0x00000004; - int INSERT_OR_UPDATE = INSERT | UPDATE; - int DELETE = 0x00000008; - int UPDATE_OR_DELETE = UPDATE | DELETE; - int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; - int FORCE_INSERT = 0x00000010 | INSERT; -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java index c9f7f3e9..f48708d4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -30,7 +29,7 @@ public class Delete extends Condition { } public Delete(Object entity) { - super(OperationType.DELETE, entity); + super(Type.DELETE, entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java index 1a0ad3fa..daa71309 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -30,7 +29,7 @@ public class Insert extends Operation { } public Insert(Object entity) { - super(OperationType.INSERT, entity); + super(Type.INSERT, entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java index 3d1061ed..03a58f9e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -34,7 +33,7 @@ public class NullableUpdate extends Update { } public NullableUpdate(Object entity) { - super(OperationType.UPDATE, entity); + super(Type.UPDATE, entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index d4960553..e233dc8e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -17,40 +17,56 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Data; @Data public class Operation { - public static final int UNKNOWN = 0; - public static final int INCLUDE_ROOT = 1; - public static final int IGNORE_ROOT = 2; - private int type; private Object entity; - private int rootType; + private RootControl rootControl = RootControl.NONE; public Operation(int type, Object entity) { this.type = type; this.entity = entity; - this.rootType = UNKNOWN; } public boolean isInsertContext() { - return (type & OperationType.INSERT) != 0; + return (type & Type.INSERT) != 0; } public boolean isForceInsert() { - return type == OperationType.FORCE_INSERT; + return type == Type.FORCE_INSERT; + } + + public void includeRoot() { + rootControl = RootControl.INCLUDE_ROOT; } public boolean isIncludeRoot() { - return rootType == 1; + return rootControl == RootControl.INCLUDE_ROOT; + } + + public void ignoreRoot() { + rootControl = RootControl.IGNORE_ROOT; } public boolean isIgnoreRoot() { - return rootType == 2; + return rootControl == RootControl.IGNORE_ROOT; + } + + public interface Type { + int NONE = 0x00000000; + int SELECT = 0x00000001; + int INSERT = 0x00000002; + int UPDATE = 0x00000004; + int INSERT_OR_UPDATE = INSERT | UPDATE; + int DELETE = 0x00000008; + int UPDATE_OR_DELETE = UPDATE | DELETE; + int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; + int FORCE_INSERT = 0x00000010 | INSERT; } + public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT,} + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java index 84c40cdb..80b5b176 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -30,7 +29,7 @@ public class Query extends Condition { } public Query(Object entity) { - super(OperationType.SELECT, entity); + super(Type.SELECT, entity); } public boolean isEmpty() { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java index da5dc6a9..712061b0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java @@ -17,7 +17,6 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -30,7 +29,7 @@ public class Update extends Condition { } public Update(Object entity) { - super(OperationType.UPDATE, entity); + super(Type.UPDATE, entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java index 40696f8e..3d5eefc5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java @@ -18,7 +18,6 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; @@ -114,12 +113,12 @@ public class DefaultExecutor extends AbstractExecutor implements EntityHandler { collection = Collections.singletonList(targetEntity); } for (Object entity : collection) { - int operationType = OperationType.NONE; + int operationType = Operation.Type.NONE; boolean operable = false; if (isMatch) { operationType = determineType(operation, repository, entity); - operable = (operationType & OperationType.INSERT_OR_UPDATE_OR_DELETE) != 0; - if ((operationType & OperationType.INSERT) != 0) { + operable = (operationType & Operation.Type.INSERT_OR_UPDATE_OR_DELETE) != 0; + if ((operationType & Operation.Type.INSERT) != 0) { getBoundValue(context, rootEntity, repository, entity); } } @@ -127,7 +126,11 @@ public class DefaultExecutor extends AbstractExecutor implements EntityHandler { OperationFactory operationFactory = repository.getOperationFactory(); Operation newOperation = operationFactory.renewOperation(operation, entity); if (newOperation != null) { - newOperation.setRootType(operable ? Operation.INCLUDE_ROOT : Operation.IGNORE_ROOT); + if (operable) { + newOperation.includeRoot(); + } else { + newOperation.ignoreRoot(); + } totalCount += repository.execute(context, newOperation); } @@ -149,11 +152,11 @@ public class DefaultExecutor extends AbstractExecutor implements EntityHandler { private int determineType(Operation operation, CommonRepository repository, Object entity) { if (operation.isForceInsert()) { - return OperationType.INSERT; + return Operation.Type.INSERT; } int type = operation.getType(); Object primaryKey = repository.getPrimaryKey(entity); - int operationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE_OR_DELETE; + int operationType = primaryKey == null ? Operation.Type.INSERT : Operation.Type.UPDATE_OR_DELETE; return type & operationType; } @@ -170,13 +173,13 @@ public class DefaultExecutor extends AbstractExecutor implements EntityHandler { } private int doExecute(Context context, CommonRepository repository, Object entity, int operationType) { - if (operationType == OperationType.INSERT) { + if (operationType == Operation.Type.INSERT) { return repository.insert(context, entity); - } else if (operationType == OperationType.UPDATE) { + } else if (operationType == Operation.Type.UPDATE) { return repository.update(context, entity); - } else if (operationType == OperationType.DELETE) { + } else if (operationType == Operation.Type.DELETE) { return repository.delete(context, entity); } return 0; 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 c2e7587c..76b76472 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,6 @@ package com.gitee.dorive.core.impl.factory; -import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.*; @@ -91,20 +90,20 @@ public class OperationFactory { public Operation renewOperation(Operation operation, Object entity) { int type = operation.getType(); - if (type == OperationType.INSERT) { + if (type == Operation.Type.INSERT) { return buildInsert(entity); - } else if (type == OperationType.UPDATE) { + } else if (type == Operation.Type.UPDATE) { return buildUpdate(entity); - } else if (type == OperationType.INSERT_OR_UPDATE) { - return new Operation(OperationType.INSERT_OR_UPDATE, entity); + } else if (type == Operation.Type.INSERT_OR_UPDATE) { + return new Operation(Operation.Type.INSERT_OR_UPDATE, entity); - } else if (type == OperationType.DELETE) { + } else if (type == Operation.Type.DELETE) { return buildDelete(entity); - } else if (type == OperationType.FORCE_INSERT) { - return new Insert(OperationType.FORCE_INSERT, entity); + } else if (type == Operation.Type.FORCE_INSERT) { + return new Insert(Operation.Type.FORCE_INSERT, entity); } return null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java index 9acdcbdf..6c74c6f6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java @@ -23,7 +23,6 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.binder.AbstractBinder; import com.gitee.dorive.core.impl.binder.ContextBinder; @@ -55,7 +54,7 @@ public class MultiEntityHandler implements EntityHandler { if (example.isNotEmpty()) { OperationFactory operationFactory = repository.getOperationFactory(); Query query = operationFactory.buildQueryByExample(example); - query.setRootType(Operation.INCLUDE_ROOT); + query.includeRoot(); Result result = repository.executeQuery(context, query); setValueForRootEntities(context, entities, entityIndex, result); return result.getCount(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java index 9a83ed56..6152f01b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java @@ -24,7 +24,6 @@ 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.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; @@ -52,7 +51,7 @@ public class UnionEntityHandler implements EntityHandler { if (example.isNotEmpty()) { OperationFactory operationFactory = repository.getOperationFactory(); Query query = operationFactory.buildQueryByExample(example); - query.setRootType(Operation.INCLUDE_ROOT); + query.includeRoot(); Result result = repository.executeQuery(context, query); setValueForRootEntities(entities, result); return result.getCount(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index 03699bfc..cc93b947 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -18,7 +18,6 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; -import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.repository.ListableRepository; @@ -58,7 +57,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertOrUpdate(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new Operation(OperationType.INSERT_OR_UPDATE, entity); + Operation operation = new Operation(Operation.Type.INSERT_OR_UPDATE, entity); return execute(context, operation); } -- Gitee From 28b88a1d5d35ce769108710c1409bd3844eb9083 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 27 Dec 2023 16:01:09 +0800 Subject: [PATCH 066/146] =?UTF-8?q?=E5=B0=86NullableUpdate=E5=BD=92?= =?UTF-8?q?=E5=85=A5=E6=A0=87=E5=87=86=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/operation/NullableUpdate.java | 39 ------------------- .../dorive/core/entity/operation/Update.java | 5 +++ .../starter/impl/MybatisPlusExecutor.java | 16 +++----- 3 files changed, 11 insertions(+), 49 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java deleted file mode 100644 index 03a58f9e..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java +++ /dev/null @@ -1,39 +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.entity.operation; - -import lombok.Getter; -import lombok.Setter; - -import java.util.Set; - -@Getter -@Setter -public class NullableUpdate extends Update { - - private Set nullableSet; - - public NullableUpdate(int type, Object entity) { - super(type, entity); - } - - public NullableUpdate(Object entity) { - super(Type.UPDATE, entity); - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java index 712061b0..dbc6546c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java @@ -20,10 +20,15 @@ package com.gitee.dorive.core.entity.operation; import lombok.Getter; import lombok.Setter; +import java.util.Collections; +import java.util.Set; + @Getter @Setter public class Update extends Condition { + private Set nullableFields = Collections.emptySet(); + public Update(int type, Object entity) { super(type, entity); } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java index e5299c3b..053b697d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java @@ -39,7 +39,6 @@ import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Delete; import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.NullableUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; @@ -211,13 +210,10 @@ public class MybatisPlusExecutor extends AbstractExecutor { Object primaryKey = update.getPrimaryKey(); Example example = update.getExample(); - if (update instanceof NullableUpdate) { - NullableUpdate nullableUpdate = (NullableUpdate) update; - Set nullableSet = nullableUpdate.getNullableSet(); - if (nullableSet != null && !nullableSet.isEmpty()) { - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableSet, primaryKey, example); - return baseMapper.update(null, updateWrapper); - } + Set nullableFields = update.getNullableFields(); + if (nullableFields != null && !nullableFields.isEmpty()) { + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableFields, primaryKey, example); + return baseMapper.update(null, updateWrapper); } if (primaryKey != null) { @@ -248,13 +244,13 @@ public class MybatisPlusExecutor extends AbstractExecutor { return updateWrapper; } - private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableSet, Object primaryKey, Example example) { + private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableFields, Object primaryKey, Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); List fieldList = TableInfoHelper.getTableInfo(pojoClass).getFieldList(); for (TableFieldInfo tableFieldInfo : fieldList) { String property = tableFieldInfo.getProperty(); Object value = BeanUtil.getFieldValue(persistent, property); - if (value != null || nullableSet.contains(property)) { + if (value != null || nullableFields.contains(property)) { updateWrapper.set(true, tableFieldInfo.getColumn(), value); } } -- Gitee From 8855801333cb3368fbc5b17501aa91dbfe8cfcd3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 27 Dec 2023 17:19:28 +0800 Subject: [PATCH 067/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9BindingProcessor?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=BAProcessor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{BindingProcessor.java => Processor.java} | 2 +- .../core/impl/binder/AbstractBinder.java | 10 ++--- .../core/impl/binder/ContextBinder.java | 6 +-- .../core/impl/binder/PropertyBinder.java | 6 +-- ...ngProcessor.java => DefaultProcessor.java} | 4 +- ...gProcessor.java => PropertyProcessor.java} | 2 +- .../core/impl/resolver/BinderResolver.java | 40 +++++++++---------- 7 files changed, 35 insertions(+), 35 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/api/binder/{BindingProcessor.java => Processor.java} (96%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/{DefaultBindingProcessor.java => DefaultProcessor.java} (91%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/{PropertyBindingProcessor.java => PropertyProcessor.java} (95%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java index 879ab489..c54ff816 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/BindingProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/binder/Processor.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.api.binder; import com.gitee.dorive.core.api.context.Context; -public interface BindingProcessor { +public interface Processor { Object input(Context context, Object value); 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 ee67e22c..38c1c43a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/AbstractBinder.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Binder; -import com.gitee.dorive.core.api.binder.BindingProcessor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.AllArgsConstructor; import lombok.Data; @@ -30,12 +30,12 @@ import java.util.List; @Data @AllArgsConstructor -public abstract class AbstractBinder implements Binder, BindingProcessor { +public abstract class AbstractBinder implements Binder, Processor { private BindingDef bindingDef; private String alias; private PropChain fieldPropChain; - private BindingProcessor bindingProcessor; + private Processor processor; public String getFieldName() { return fieldPropChain.getEntityField().getName(); @@ -53,12 +53,12 @@ public abstract class AbstractBinder implements Binder, BindingProcessor { @Override public Object input(Context context, Object value) { - return bindingProcessor.input(context, value); + return processor.input(context, value); } @Override public Object output(Context context, Object value) { - return bindingProcessor.output(context, value); + return processor.output(context, value); } public List collectFieldValues(Context context, List entities) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java index 950aea46..79da64a8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.core.api.binder.BindingProcessor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.element.PropChain; @@ -26,8 +26,8 @@ import java.util.Map; public class ContextBinder extends AbstractBinder { - public ContextBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, BindingProcessor bindingProcessor) { - super(bindingDef, alias, fieldPropChain, bindingProcessor); + public ContextBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, Processor processor) { + super(bindingDef, alias, fieldPropChain, processor); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java index 6faee09b..3bb6dce5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/PropertyBinder.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; import com.gitee.dorive.api.entity.element.PropChain; -import com.gitee.dorive.core.api.binder.BindingProcessor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; @@ -37,12 +37,12 @@ public class PropertyBinder extends AbstractBinder { public PropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, - BindingProcessor bindingProcessor, + Processor processor, String belongAccessPath, CommonRepository belongRepository, PropChain boundPropChain, String bindAlias) { - super(bindingDef, alias, fieldPropChain, bindingProcessor); + super(bindingDef, alias, fieldPropChain, processor); this.belongAccessPath = belongAccessPath; this.belongRepository = belongRepository; this.boundPropChain = boundPropChain; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java similarity index 91% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java index bc38046a..69d1381a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultBindingProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/DefaultProcessor.java @@ -18,14 +18,14 @@ package com.gitee.dorive.core.impl.processor; import com.gitee.dorive.api.entity.def.BindingDef; -import com.gitee.dorive.core.api.binder.BindingProcessor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor -public class DefaultBindingProcessor implements BindingProcessor { +public class DefaultProcessor implements Processor { private BindingDef bindingDef; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java index 139190f9..0bdb69e0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyBindingProcessor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/processor/PropertyProcessor.java @@ -27,7 +27,7 @@ import java.util.Collection; @Data @EqualsAndHashCode(callSuper = false) -public class PropertyBindingProcessor extends DefaultBindingProcessor { +public class PropertyProcessor extends DefaultProcessor { @Override public Object input(Context context, Object value) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java index 08d2fdbb..a9ab5aaa 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java @@ -27,11 +27,11 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.core.api.binder.Binder; -import com.gitee.dorive.core.api.binder.BindingProcessor; +import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; -import com.gitee.dorive.core.impl.processor.DefaultBindingProcessor; -import com.gitee.dorive.core.impl.processor.PropertyBindingProcessor; +import com.gitee.dorive.core.impl.processor.DefaultProcessor; +import com.gitee.dorive.core.impl.processor.PropertyProcessor; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.PathUtils; @@ -90,10 +90,10 @@ public class BinderResolver { entityEle.getGenericType().getName(), field); fieldPropChain.newPropProxy(); - BindingProcessor bindingProcessor = newBindingProcessor(bindingDef); + Processor processor = newProcessor(bindingDef); if (bindExp.startsWith("/")) { - PropertyBinder propertyBinder = newPropertyBinder(bindingDef, alias, fieldPropChain, bindingProcessor); + PropertyBinder propertyBinder = newPropertyBinder(bindingDef, alias, fieldPropChain, processor); allBinders.add(propertyBinder); propertyBinders.add(propertyBinder); @@ -115,7 +115,7 @@ public class BinderResolver { } } else { - ContextBinder contextBinder = new ContextBinder(bindingDef, alias, fieldPropChain, bindingProcessor); + ContextBinder contextBinder = new ContextBinder(bindingDef, alias, fieldPropChain, processor); allBinders.add(contextBinder); contextBinders.add(contextBinder); boundValueBinders.add(contextBinder); @@ -138,37 +138,37 @@ public class BinderResolver { return bindingDef; } - private BindingProcessor newBindingProcessor(BindingDef bindingDef) { + private Processor newProcessor(BindingDef bindingDef) { Assert.notNull(bindingDef, "The bindingDef cannot be null!"); Class processorClass = bindingDef.getProcessor(); - BindingProcessor bindingProcessor = null; + Processor processor = null; if (processorClass == Object.class) { if (StringUtils.isBlank(bindingDef.getProperty())) { - bindingProcessor = new DefaultBindingProcessor(); + processor = new DefaultProcessor(); } else { - bindingProcessor = new PropertyBindingProcessor(); + processor = new PropertyProcessor(); } } else { ApplicationContext applicationContext = repository.getApplicationContext(); String[] beanNamesForType = applicationContext.getBeanNamesForType(processorClass); if (beanNamesForType.length > 0) { - bindingProcessor = (BindingProcessor) applicationContext.getBean(beanNamesForType[0]); + processor = (Processor) applicationContext.getBean(beanNamesForType[0]); } - if (bindingProcessor == null) { - bindingProcessor = (BindingProcessor) ReflectUtil.newInstance(processorClass); + if (processor == null) { + processor = (Processor) ReflectUtil.newInstance(processorClass); } } - if (bindingProcessor instanceof DefaultBindingProcessor) { - DefaultBindingProcessor defaultProcessor = (DefaultBindingProcessor) bindingProcessor; + if (processor instanceof DefaultProcessor) { + DefaultProcessor defaultProcessor = (DefaultProcessor) processor; defaultProcessor.setBindingDef(bindingDef); } - if (bindingProcessor instanceof PropertyBindingProcessor) { - Assert.notBlank(bindingDef.getProperty(), "The property of PropertyBindingProcessor cannot be blank!"); + if (processor instanceof PropertyProcessor) { + Assert.notBlank(bindingDef.getProperty(), "The property of PropertyProcessor cannot be blank!"); } - return bindingProcessor; + return processor; } - private PropertyBinder newPropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, BindingProcessor bindingProcessor) { + private PropertyBinder newPropertyBinder(BindingDef bindingDef, String alias, PropChain fieldPropChain, Processor processor) { String bindExp = bindingDef.getBindExp(); String property = bindingDef.getProperty(); @@ -188,7 +188,7 @@ public class BinderResolver { String boundName = StringUtils.isBlank(property) ? PathUtils.getLastName(bindExp) : property; String bindAlias = entityEle.toAlias(boundName); - return new PropertyBinder(bindingDef, alias, fieldPropChain, bindingProcessor, + return new PropertyBinder(bindingDef, alias, fieldPropChain, processor, belongAccessPath, belongRepository, boundPropChain, bindAlias); } -- Gitee From cefb772af31aaabad3af375b548b598edd154e6e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 3 Jan 2024 14:54:28 +0800 Subject: [PATCH 068/146] =?UTF-8?q?=E5=B0=86clone=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=BD=AC=E7=A7=BB=E8=87=B3=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/Criterion.java | 4 ---- .../dorive/core/entity/executor/OrderBy.java | 5 ----- .../dorive/core/entity/executor/Page.java | 5 ----- .../repository/AbstractExampleRepository.java | 10 +++++----- .../repository/AbstractGenericRepository.java | 4 ++-- .../core/repository/CommonRepository.java | 3 ++- .../gitee/dorive/core/util/ExampleUtils.java | 20 +++++++++++++++---- .../dorive/sql/impl/SqlQueryBuilder.java | 2 +- 8 files changed, 26 insertions(+), 27 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java index 58e78184..ff13143d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Criterion.java @@ -34,10 +34,6 @@ public class Criterion { this.operator = operator; } - public Criterion tryClone() { - return new Criterion(property, operator, value); - } - @Override public String toString() { return CriterionUtils.toString(this); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java index 76cd1d6f..9c874e6d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/OrderBy.java @@ -21,7 +21,6 @@ import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.ArrayList; import java.util.List; @Data @@ -31,10 +30,6 @@ public class OrderBy { private List properties; private String order; - public OrderBy tryClone() { - return new OrderBy(new ArrayList<>(properties), order); - } - @Override public String toString() { return "ORDER BY " + StrUtil.join(",", properties) + " " + order.toUpperCase(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java index 41dba0e9..e368926c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Page.java @@ -21,7 +21,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -40,10 +39,6 @@ public class Page { this.size = size; } - public Page tryClone() { - return new Page<>(total, current, size, new ArrayList<>(records)); - } - @Override public String toString() { return "LIMIT " + (current - 1) * size + "," + size; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java index c26c1d03..e0c41aa2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java @@ -34,7 +34,7 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public List selectByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); } return super.selectByExample(context, example); } @@ -42,7 +42,7 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public Page selectPageByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); } return super.selectPageByExample(context, example); } @@ -50,7 +50,7 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public long selectCountByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); } return super.selectCountByExample(context, example); } @@ -58,7 +58,7 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public int updateByExample(Context context, Object entity, Example example) { if (!(example instanceof InnerExample)) { - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); } return super.updateByExample(context, entity, example); } @@ -66,7 +66,7 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public int deleteByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); } return super.deleteByExample(context, example); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index cc93b947..3587595a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -48,7 +48,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { if (selector.matches(context, repository)) { - totalCount += repository.updateByExample(context, entity, ExampleUtils.tryClone(example)); + totalCount += repository.updateByExample(context, entity, ExampleUtils.clone(example)); } } return totalCount; @@ -75,7 +75,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { if (selector.matches(context, repository)) { - totalCount += repository.deleteByExample(context, ExampleUtils.tryClone(example)); + totalCount += repository.deleteByExample(context, ExampleUtils.clone(example)); } } return totalCount; 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 fd51b1db..a3f4af17 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 @@ -27,6 +27,7 @@ import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.util.ExampleUtils; import lombok.Data; import lombok.EqualsAndHashCode; @@ -75,7 +76,7 @@ public class CommonRepository extends AbstractProxyRepository implements Node { Example example = query.getExample(); if (example != null) { if (example.getOrderBy() == null && defaultOrderBy != null) { - example.setOrderBy(defaultOrderBy.tryClone()); + example.setOrderBy(ExampleUtils.clone(defaultOrderBy)); } } return super.executeQuery(context, query); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java index bc6382f2..e51dfb03 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java @@ -28,7 +28,7 @@ import java.util.List; public class ExampleUtils { - public static Example tryClone(Example example) { + public static Example clone(Example example) { if (example == null) { return null; } @@ -48,21 +48,33 @@ public class ExampleUtils { if (criteria != null && !criteria.isEmpty()) { List newCriteria = newExample.getCriteria(); for (Criterion criterion : criteria) { - newCriteria.add(criterion.tryClone()); + newCriteria.add(clone(criterion)); } } OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { - newExample.setOrderBy(orderBy.tryClone()); + newExample.setOrderBy(clone(orderBy)); } Page page = example.getPage(); if (page != null) { - newExample.setPage(page.tryClone()); + newExample.setPage(clone(page)); } return newExample; } + public static Criterion clone(Criterion criterion) { + return new Criterion(criterion.getProperty(), criterion.getOperator(), criterion.getValue()); + } + + public static OrderBy clone(OrderBy orderBy) { + return new OrderBy(new ArrayList<>(orderBy.getProperties()), orderBy.getOrder()); + } + + public static Page clone(Page page) { + return new Page<>(page.getTotal(), page.getCurrent(), page.getSize(), new ArrayList<>(page.getRecords())); + } + } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index b7f49b0c..db268ae3 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -49,7 +49,7 @@ public class SqlQueryBuilder implements QueryBuilder { boolean onlyCount = buildQuery.isOnlyCount(); OrderBy orderBy = example.getOrderBy(); - example = ExampleUtils.tryClone(example); + example = ExampleUtils.clone(example); buildQuery.setExample(example); Page page = example.getPage(); -- Gitee From c8da68060a186671104ae4a2381d8b8f1adbdbe7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Jan 2024 14:09:49 +0800 Subject: [PATCH 069/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EselectOne=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/api/repository/Repository.java | 10 ++++++++++ .../core/repository/AbstractExampleRepository.java | 8 ++++++++ .../dorive/core/repository/AbstractRepository.java | 6 ++++++ .../com/gitee/dorive/ref/api/SelectorRepository.java | 4 ++++ 4 files changed, 28 insertions(+) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java index 5d553011..007fc498 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java @@ -49,6 +49,16 @@ public interface Repository { */ List selectByExample(Context context, Example example); + /** + * 根据条件,查询实体 + * 如果存在多条记录,取第一条 + * + * @param context 上下文 + * @param example 条件 + * @return 实体 + */ + E selectOneByExample(Context context, Example example); + /** * 根据条件,查询分页 * diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java index e0c41aa2..b04ebc34 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java @@ -39,6 +39,14 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe return super.selectByExample(context, example); } + @Override + public E selectOneByExample(Context context, Example example) { + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.selectOneByExample(context, example); + } + @Override public Page selectPageByExample(Context context, Example example) { if (!(example instanceof InnerExample)) { 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 53ac050c..eab1763c 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 @@ -66,6 +66,12 @@ public abstract class AbstractRepository implements Repository, Ex return (List) result.getRecords(); } + @Override + public E selectOneByExample(Context context, Example example) { + List list = selectByExample(context, example); + return list != null && !list.isEmpty() ? list.get(0) : null; + } + @Override @SuppressWarnings("unchecked") public Page selectPageByExample(Context context, Example example) { diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java index 882b7690..40468f38 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java @@ -35,6 +35,10 @@ public interface SelectorRepository extends QueryRepository { return selectByExample(new InnerContext(selector), example); } + default E selectOneByExample(Selector selector, Example example) { + return selectOneByExample(new InnerContext(selector), example); + } + default Page selectPageByExample(Selector selector, Example example) { return selectPageByExample(new InnerContext(selector), example); } -- Gitee From 23c732177e79e3828d292a02f25eb74f5cf0d3e9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Jan 2024 14:57:55 +0800 Subject: [PATCH 070/146] =?UTF-8?q?=E5=B0=86mybatis-plus=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-mybatis-plus/pom.xml | 28 +++++++++++++++++++ .../mybatis/plus}/api/CriterionAppender.java | 2 +- .../DoriveMybatisPlusConfiguration.java | 6 ++-- .../config/MybatisPlusConfiguration.java | 2 +- .../mybatis/plus}/entity/LambdaExample.java | 4 +-- .../mybatis/plus}/impl/AppenderContext.java | 6 ++-- .../plus}/impl/DefaultImplFactory.java | 2 +- .../mybatis/plus}/impl/DefaultSqlHelper.java | 2 +- .../plus}/impl/MybatisPlusExecutor.java | 8 +++--- .../repository/MybatisPlusRepository.java | 4 +-- .../mybatis/plus}/util/LambdaUtils.java | 2 +- .../mybatis/plus}/util/WrapperUtils.java | 6 ++-- .../main/resources/META-INF/spring.factories | 6 ++-- ...ot.autoconfigure.AutoConfiguration.imports | 2 ++ dorive-spring-boot-starter/pom.xml | 11 +------- ...ot.autoconfigure.AutoConfiguration.imports | 2 -- pom.xml | 1 + 17 files changed, 57 insertions(+), 37 deletions(-) create mode 100644 dorive-mybatis-plus/pom.xml rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/api/CriterionAppender.java (95%) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java (87%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/config/MybatisPlusConfiguration.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/entity/LambdaExample.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/impl/AppenderContext.java (95%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/impl/DefaultImplFactory.java (96%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/impl/DefaultSqlHelper.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/impl/MybatisPlusExecutor.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/repository/MybatisPlusRepository.java (97%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/util/LambdaUtils.java (96%) rename {dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter => dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus}/util/WrapperUtils.java (86%) rename {dorive-spring-boot-starter => dorive-mybatis-plus}/src/main/resources/META-INF/spring.factories (35%) create mode 100644 dorive-mybatis-plus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml new file mode 100644 index 00000000..03be0522 --- /dev/null +++ b/dorive-mybatis-plus/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + com.gitee.digital-engine + dorive + 3.4.3.3 + + dorive-mybatis-plus + + + com.gitee.digital-engine + dorive-env + ${project.version} + + + com.gitee.digital-engine + dorive-sql + ${project.version} + + + com.baomidou + mybatis-plus-boot-starter + + + \ No newline at end of file diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/CriterionAppender.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/CriterionAppender.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/CriterionAppender.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/CriterionAppender.java index e2691336..13e90e54 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/api/CriterionAppender.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/CriterionAppender.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.api; +package com.gitee.dorive.mybatis.plus.api; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java similarity index 87% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java index 80a8aaea..24e2649a 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/DoriveStarterConfiguration.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/DoriveMybatisPlusConfiguration.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.config; +package com.gitee.dorive.mybatis.plus.config; -import com.gitee.dorive.spring.boot.starter.impl.DefaultImplFactory; +import com.gitee.dorive.mybatis.plus.impl.DefaultImplFactory; import com.gitee.dorive.api.api.ImplFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -25,7 +25,7 @@ import org.springframework.core.annotation.Order; @Order(-100) @Configuration -public class DoriveStarterConfiguration { +public class DoriveMybatisPlusConfiguration { @Bean public static ImplFactory implFactory() { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java index 9d33ecf3..43f64b04 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/config/MybatisPlusConfiguration.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.config; +package com.gitee.dorive.mybatis.plus.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/entity/LambdaExample.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/entity/LambdaExample.java index db7e9715..5d365051 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/LambdaExample.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/entity/LambdaExample.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.entity; +package com.gitee.dorive.mybatis.plus.entity; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.spring.boot.starter.util.LambdaUtils; +import com.gitee.dorive.mybatis.plus.util.LambdaUtils; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java similarity index 95% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java index e3f4e656..19f29cb6 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/AppenderContext.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.mybatis.plus.impl; import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.spring.boot.starter.util.WrapperUtils; +import com.gitee.dorive.mybatis.plus.api.CriterionAppender; +import com.gitee.dorive.mybatis.plus.util.WrapperUtils; import java.util.Collection; import java.util.Map; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java similarity index 96% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java index c2976abe..a71e7be0 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultImplFactory.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultImplFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.mybatis.plus.impl; import com.gitee.dorive.api.api.ImplFactory; import com.gitee.dorive.core.api.format.SqlFormat; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java index 2af33c9b..0a2b2211 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/DefaultSqlHelper.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/DefaultSqlHelper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.mybatis.plus.impl; import cn.hutool.db.sql.Condition; import cn.hutool.db.sql.SqlUtil; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 053b697d..559c4dde 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.impl; +package com.gitee.dorive.mybatis.plus.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; @@ -43,8 +43,8 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; -import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; -import com.gitee.dorive.spring.boot.starter.util.WrapperUtils; +import com.gitee.dorive.mybatis.plus.api.CriterionAppender; +import com.gitee.dorive.mybatis.plus.util.WrapperUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -56,7 +56,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static com.gitee.dorive.spring.boot.starter.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; +import static com.gitee.dorive.mybatis.plus.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; @Getter @Setter diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java similarity index 97% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 6ae6b9b7..a3adbfb9 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.repository; +package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -31,7 +31,7 @@ import com.gitee.dorive.core.entity.context.Strategy; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import com.gitee.dorive.spring.boot.starter.impl.MybatisPlusExecutor; +import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.sql.impl.SegmentBuilder; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/LambdaUtils.java similarity index 96% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/LambdaUtils.java index dbfba832..e1fe8f1d 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/LambdaUtils.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/LambdaUtils.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.util; +package com.gitee.dorive.mybatis.plus.util; import com.baomidou.mybatisplus.core.toolkit.support.LambdaMeta; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java similarity index 86% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java index 7b50daa9..40b95402 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/util/WrapperUtils.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.util; +package com.gitee.dorive.mybatis.plus.util; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; +import com.gitee.dorive.mybatis.plus.api.CriterionAppender; -import static com.gitee.dorive.spring.boot.starter.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; +import static com.gitee.dorive.mybatis.plus.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; public class WrapperUtils { diff --git a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories b/dorive-mybatis-plus/src/main/resources/META-INF/spring.factories similarity index 35% rename from dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories rename to dorive-mybatis-plus/src/main/resources/META-INF/spring.factories index a004902c..4a1f7850 100644 --- a/dorive-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/dorive-mybatis-plus/src/main/resources/META-INF/spring.factories @@ -1,5 +1,5 @@ org.springframework.boot.env.EnvironmentPostProcessor=\ - com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration + com.gitee.dorive.mybatis.plus.config.MybatisPlusConfiguration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration,\ - com.gitee.dorive.spring.boot.starter.config.DoriveStarterConfiguration + com.gitee.dorive.mybatis.plus.config.MybatisPlusConfiguration,\ + com.gitee.dorive.mybatis.plus.config.DoriveMybatisPlusConfiguration diff --git a/dorive-mybatis-plus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-mybatis-plus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..b42b656d --- /dev/null +++ b/dorive-mybatis-plus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.gitee.dorive.mybatis.plus.config.MybatisPlusConfiguration +com.gitee.dorive.mybatis.plus.config.DoriveStarterConfiguration \ No newline at end of file diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 41cc71c8..d43c948a 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -15,11 +15,6 @@ dorive-inject ${project.version} - - com.gitee.digital-engine - dorive-env - ${project.version} - com.gitee.digital-engine dorive-web @@ -27,12 +22,8 @@ com.gitee.digital-engine - dorive-sql + dorive-mybatis-plus ${project.version} - - com.baomidou - mybatis-plus-boot-starter - \ No newline at end of file diff --git a/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports deleted file mode 100644 index 58f7d2cf..00000000 --- a/dorive-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ /dev/null @@ -1,2 +0,0 @@ -com.gitee.dorive.spring.boot.starter.config.MybatisPlusConfiguration -com.gitee.dorive.spring.boot.starter.config.DoriveStarterConfiguration \ No newline at end of file diff --git a/pom.xml b/pom.xml index 08b2249a..f0447f0a 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ dorive-query dorive-ref dorive-sql + dorive-mybatis-plus dorive-spring-boot-starter -- Gitee From 9780bb22ef87ac3697bd578fa7268a0d53b358fb Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Jan 2024 18:10:05 +0800 Subject: [PATCH 071/146] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E6=8E=A5=E5=8F=A3=E7=9A=84=E6=98=93?= =?UTF-8?q?=E7=94=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/entity/context/Strategy.java | 4 +-- .../core/entity/operation/Operation.java | 28 +++++++++---------- ...cutor.java => DefaultContextExecutor.java} | 4 +-- .../repository/AbstractContextRepository.java | 8 +++--- .../event/impl/DefaultEntityListener.java | 19 +++++++++++-- 5 files changed, 39 insertions(+), 24 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/{DefaultExecutor.java => DefaultContextExecutor.java} (97%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java index 07bd8cf1..9d326dbf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java @@ -26,8 +26,8 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class Strategy { - private Query query; - public enum Query {DEFAULT, SQL,} + private Query query; + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index e233dc8e..eee15720 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -22,6 +22,20 @@ import lombok.Data; @Data public class Operation { + public interface Type { + int NONE = 0x00000000; + int SELECT = 0x00000001; + int INSERT = 0x00000002; + int UPDATE = 0x00000004; + int INSERT_OR_UPDATE = INSERT | UPDATE; + int DELETE = 0x00000008; + int UPDATE_OR_DELETE = UPDATE | DELETE; + int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; + int FORCE_INSERT = 0x00000010 | INSERT; + } + + public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT,} + private int type; private Object entity; private RootControl rootControl = RootControl.NONE; @@ -55,18 +69,4 @@ public class Operation { return rootControl == RootControl.IGNORE_ROOT; } - public interface Type { - int NONE = 0x00000000; - int SELECT = 0x00000001; - int INSERT = 0x00000002; - int UPDATE = 0x00000004; - int INSERT_OR_UPDATE = INSERT | UPDATE; - int DELETE = 0x00000008; - int UPDATE_OR_DELETE = UPDATE | DELETE; - int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; - int FORCE_INSERT = 0x00000010 | INSERT; - } - - public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT,} - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java similarity index 97% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java index 3d5eefc5..90dc6aa3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java @@ -39,12 +39,12 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -public class DefaultExecutor extends AbstractExecutor implements EntityHandler { +public class DefaultContextExecutor extends AbstractExecutor implements EntityHandler { private final AbstractContextRepository repository; private final EntityHandler entityHandler; - public DefaultExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { + public DefaultContextExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { this.repository = repository; this.entityHandler = entityHandler; } 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 bc19e744..020b87cb 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 @@ -37,7 +37,7 @@ import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; -import com.gitee.dorive.core.impl.executor.DefaultExecutor; +import com.gitee.dorive.core.impl.executor.DefaultContextExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.factory.EntityFactoryBuilder; @@ -120,7 +120,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor setEntityDef(rootRepository.getEntityDef()); setEntityEle(rootRepository.getEntityEle()); setOperationFactory(rootRepository.getOperationFactory()); - setExecutor(newDefaultExecutor()); + setExecutor(newDefaultContextExecutor()); } private CommonRepository newRepository(String accessPath, EntityEle entityEle) { @@ -235,13 +235,13 @@ public abstract class AbstractContextRepository extends AbstractRepositor return null; } - private Executor newDefaultExecutor() { + private Executor newDefaultContextExecutor() { EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); derivedResolver = new DerivedResolver(this); if (derivedResolver.isDerived()) { entityHandler = new AdaptiveEntityHandler(this, entityHandler); } - return new DefaultExecutor(this, entityHandler); + return new DefaultContextExecutor(this, entityHandler); } protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle); diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java index 2799f34d..cf3e2786 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java @@ -19,12 +19,17 @@ package com.gitee.dorive.event.impl; import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.Delete; +import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.event.api.EntityListener; import com.gitee.dorive.event.entity.ExecutorEvent; public abstract class DefaultEntityListener implements EntityListener { + public enum OperationType {UNKNOWN, INSERT, UPDATE, DELETE,} + @Override public Class subscribe() { return ReflectUtils.getFirstArgumentType(this.getClass()); @@ -35,9 +40,19 @@ public abstract class DefaultEntityListener implements EntityListener { public void onApplicationEvent(ExecutorEvent executorEvent) { Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); - onExecution(context, operation.getType(), (E) operation.getEntity()); + OperationType operationType = OperationType.UNKNOWN; + if (operation instanceof Insert) { + operationType = OperationType.INSERT; + + } else if (operation instanceof Update) { + operationType = OperationType.UPDATE; + + } else if (operation instanceof Delete) { + operationType = OperationType.DELETE; + } + onExecution(context, operationType, (E) operation.getEntity()); } - protected abstract void onExecution(Context context, int type, E entity); + protected abstract void onExecution(Context context, OperationType operationType, E entity); } -- Gitee From 82a446cf523d3afd02c3e56a1ec959fa23821315 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Jan 2024 10:10:04 +0800 Subject: [PATCH 072/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E4=BB=A3=E7=A0=81=E6=98=93=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{DefaultContextExecutor.java => ContextExecutor.java} | 4 ++-- .../dorive/core/repository/AbstractContextRepository.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/{DefaultContextExecutor.java => ContextExecutor.java} (97%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java similarity index 97% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 90dc6aa3..b5187603 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/DefaultContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -39,12 +39,12 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -public class DefaultContextExecutor extends AbstractExecutor implements EntityHandler { +public class ContextExecutor extends AbstractExecutor implements EntityHandler { private final AbstractContextRepository repository; private final EntityHandler entityHandler; - public DefaultContextExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { + public ContextExecutor(AbstractContextRepository repository, EntityHandler entityHandler) { this.repository = repository; this.entityHandler = entityHandler; } 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 020b87cb..46e91a26 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 @@ -37,7 +37,7 @@ import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; -import com.gitee.dorive.core.impl.executor.DefaultContextExecutor; +import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.executor.FieldExecutor; import com.gitee.dorive.core.impl.factory.EntityFactoryBuilder; @@ -120,7 +120,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor setEntityDef(rootRepository.getEntityDef()); setEntityEle(rootRepository.getEntityEle()); setOperationFactory(rootRepository.getOperationFactory()); - setExecutor(newDefaultContextExecutor()); + setExecutor(newContextExecutor()); } private CommonRepository newRepository(String accessPath, EntityEle entityEle) { @@ -235,13 +235,13 @@ public abstract class AbstractContextRepository extends AbstractRepositor return null; } - private Executor newDefaultContextExecutor() { + private Executor newContextExecutor() { EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); derivedResolver = new DerivedResolver(this); if (derivedResolver.isDerived()) { entityHandler = new AdaptiveEntityHandler(this, entityHandler); } - return new DefaultContextExecutor(this, entityHandler); + return new ContextExecutor(this, entityHandler); } protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle); -- Gitee From eb1af7591d0e107597442d52c99a2e8b7daf6b05 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 15 Jan 2024 11:35:48 +0800 Subject: [PATCH 073/146] =?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 | 4 ++-- 1 file changed, 2 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 46e91a26..61ec2e6a 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 @@ -186,12 +186,12 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle); ENTITY_INFO_MAP.put(entityEle, entityInfo); - Map fieldConverterMap = newFieldConverterMap(entityEle); - Executor executor = newExecutor(entityDef, entityEle); + Map fieldConverterMap = newFieldConverterMap(entityEle); EntityFactoryBuilder entityFactoryBuilder = new EntityFactoryBuilder(this, entityInfo, fieldConverterMap); EntityFactory entityFactory = entityFactoryBuilder.build(entityDef, entityEle); + Executor executor = newExecutor(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); executor = new FieldExecutor(executor, entityEle, fieldConverterMap); FIELD_EXECUTOR_MAP.put(entityEle, (FieldExecutor) executor); -- Gitee From f1429b3d35a5ee9521371bd5659ef6970622053f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 15 Jan 2024 14:12:29 +0800 Subject: [PATCH 074/146] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/AbstractExampleExecutor.java | 86 ------------------- ...ieldExecutor.java => ExampleExecutor.java} | 49 ++++++++++- .../repository/AbstractContextRepository.java | 12 +-- .../gitee/dorive/sql/impl/SegmentBuilder.java | 6 +- 4 files changed, 56 insertions(+), 97 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/{FieldExecutor.java => ExampleExecutor.java} (67%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java deleted file mode 100644 index bde74464..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExampleExecutor.java +++ /dev/null @@ -1,86 +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.executor; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Condition; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = false) -public abstract class AbstractExampleExecutor extends AbstractProxyExecutor { - - public AbstractExampleExecutor(Executor executor) { - super(executor); - } - - @Override - public Result executeQuery(Context context, Query query) { - Example example = query.getExample(); - if (example != null) { - if (example instanceof UnionExample) { - convert(context, (UnionExample) example); - } else { - convert(context, example); - } - } - return super.executeQuery(context, query); - } - - @Override - public long executeCount(Context context, Query query) { - Example example = query.getExample(); - if (example != null) { - convert(context, example); - } - return super.executeCount(context, query); - } - - @Override - public int execute(Context context, Operation operation) { - if (operation instanceof Condition) { - Condition condition = (Condition) operation; - Example example = condition.getExample(); - if (example != null) { - convert(context, example); - } - } - return super.execute(context, operation); - } - - private void convert(Context context, UnionExample unionExample) { - List examples = unionExample.getExamples(); - for (Example example : examples) { - convert(context, example); - } - } - - public abstract void convert(Context context, Example example); - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java similarity index 67% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 9e22fe64..77b64036 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FieldExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -25,6 +25,11 @@ import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.operation.Condition; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Query; import lombok.Data; import lombok.EqualsAndHashCode; @@ -33,18 +38,58 @@ import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public class FieldExecutor extends AbstractExampleExecutor { +public class ExampleExecutor extends AbstractProxyExecutor { private EntityEle entityEle; private Map converterMap; - public FieldExecutor(Executor executor, EntityEle entityEle, Map converterMap) { + public ExampleExecutor(Executor executor, EntityEle entityEle, Map converterMap) { super(executor); this.entityEle = entityEle; this.converterMap = converterMap; } @Override + public Result executeQuery(Context context, Query query) { + Example example = query.getExample(); + if (example != null) { + if (example instanceof UnionExample) { + convert(context, (UnionExample) example); + } else { + convert(context, example); + } + } + return super.executeQuery(context, query); + } + + @Override + public long executeCount(Context context, Query query) { + Example example = query.getExample(); + if (example != null) { + convert(context, example); + } + return super.executeCount(context, query); + } + + @Override + public int execute(Context context, Operation operation) { + if (operation instanceof Condition) { + Condition condition = (Condition) operation; + Example example = condition.getExample(); + if (example != null) { + convert(context, example); + } + } + return super.execute(context, operation); + } + + private void convert(Context context, UnionExample unionExample) { + List examples = unionExample.getExamples(); + for (Example example : examples) { + convert(context, example); + } + } + public void convert(Context context, Example example) { convertSelectProps(example); convertCriteria(context, example.getCriteria()); 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 61ec2e6a..ba452194 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 @@ -39,7 +39,7 @@ import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; -import com.gitee.dorive.core.impl.executor.FieldExecutor; +import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.factory.EntityFactoryBuilder; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; @@ -67,7 +67,7 @@ import java.util.concurrent.ConcurrentHashMap; public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { private static final Map ENTITY_INFO_MAP = new ConcurrentHashMap<>(); - private static final Map FIELD_EXECUTOR_MAP = new ConcurrentHashMap<>(); + private static final Map EXAMPLE_EXECUTOR_MAP = new ConcurrentHashMap<>(); private ApplicationContext applicationContext; @@ -83,8 +83,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor return ENTITY_INFO_MAP.get(entityEle); } - public static FieldExecutor getFieldExecutor(EntityEle entityEle) { - return FIELD_EXECUTOR_MAP.get(entityEle); + public static ExampleExecutor getExampleExecutor(EntityEle entityEle) { + return EXAMPLE_EXECUTOR_MAP.get(entityEle); } @Override @@ -193,8 +193,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor Executor executor = newExecutor(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); - executor = new FieldExecutor(executor, entityEle, fieldConverterMap); - FIELD_EXECUTOR_MAP.put(entityEle, (FieldExecutor) executor); + executor = new ExampleExecutor(executor, entityEle, fieldConverterMap); + EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); defaultRepository.setExecutor(executor); } return (AbstractRepository) repository; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 6c432a90..8fdf0572 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -24,7 +24,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.core.impl.binder.PropertyBinder; -import com.gitee.dorive.core.impl.executor.FieldExecutor; +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; @@ -65,12 +65,12 @@ public class SegmentBuilder { EntityEle entityEle = executedRepository.getEntityEle(); AbstractContextRepository.EntityInfo entityInfo = AbstractContextRepository.getEntityInfo(entityEle); - FieldExecutor fieldExecutor = AbstractContextRepository.getFieldExecutor(entityEle); + ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityEle); String tableName = entityInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); - fieldExecutor.convert(context, example); + exampleExecutor.convert(context, example); TableSegment tableSegment = new TableSegment(tableName, tableAlias, example.isNotEmpty(), new ArrayList<>(example.getCriteria().size())); Node node = new Node(tableSegment, new ArrayList<>(4)); -- Gitee From 831bcc5d07c80d8732937a4be07f34547540f4e0 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 15 Jan 2024 18:23:46 +0800 Subject: [PATCH 075/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EFieldsMapper=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/executor/Converter.java | 28 +++++ ...{FieldConverter.java => FieldsMapper.java} | 11 +- ...ldConverter.java => DefaultConverter.java} | 47 +++---- .../impl/converter/DefaultFieldsMapper.java | 99 +++++++++++++++ .../core/impl/executor/ExampleExecutor.java | 31 +++-- .../impl/factory/DefaultEntityFactory.java | 43 +++---- .../EntityFactoryResolver.java} | 48 ++------ .../impl/resolver/FieldsMapperResolver.java | 116 ++++++++++++++++++ .../repository/AbstractContextRepository.java | 46 ++----- 9 files changed, 311 insertions(+), 158 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java rename dorive-core/src/main/java/com/gitee/dorive/core/api/executor/{FieldConverter.java => FieldsMapper.java} (73%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/{DefaultFieldConverter.java => DefaultConverter.java} (72%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{factory/EntityFactoryBuilder.java => resolver/EntityFactoryResolver.java} (50%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java new file mode 100644 index 00000000..5f36be41 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.api.executor; + +public interface Converter { + + Object fieldToAlias(String alias, Object value); + + Object aliasToField(String field, Object value); + + Object fieldToProp(String prop, Object value); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java similarity index 73% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java index 36925d52..83fbd458 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java @@ -17,15 +17,14 @@ package com.gitee.dorive.core.api.executor; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Criterion; +public interface FieldsMapper extends Converter { -public interface FieldConverter { + String fieldToAlias(String field); - Object convert(Context context, Criterion criterion, Object value); + String aliasToField(String alias); - Object reconstitute(String name, Object value); + String fieldToProp(String field); - Object deconstruct(String name, Object value); + boolean hasConverter(); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java similarity index 72% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java index 8f6eda21..6b02ec8b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java @@ -20,26 +20,23 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.element.EntityField; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.FieldConverter; -import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.api.executor.Converter; import lombok.Data; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Data -public class DefaultFieldConverter implements FieldConverter { +public class DefaultConverter implements Converter { private EntityField entityField; private Map reMapping = Collections.emptyMap(); private Map deMapping = Collections.emptyMap(); - public DefaultFieldConverter(EntityField entityField) { + public DefaultConverter(EntityField entityField) { this.entityField = entityField; FieldDef fieldDef = entityField.getFieldDef(); Class genericType = entityField.getGenericType(); @@ -67,32 +64,21 @@ public class DefaultFieldConverter implements FieldConverter { } @Override - public Object convert(Context context, Criterion criterion, Object value) { - if (value == null) { - return null; - } - if (value instanceof List) { - List list = (List) value; - List newList = new ArrayList<>(list.size()); - for (Object item : list) { - Object mapValue = deMapping.get(item); - if (mapValue != null) { - newList.add(mapValue); - } else { - newList.add(item); - } - } - return newList; - } - Object mapValue = deMapping.get(value); - if (mapValue != null) { - return mapValue; - } - return value; + public Object fieldToAlias(String alias, Object value) { + return deconstruct(value); + } + + @Override + public Object aliasToField(String field, Object value) { + return reconstitute(value); } @Override - public Object reconstitute(String name, Object value) { + public Object fieldToProp(String prop, Object value) { + return deconstruct(value); + } + + private Object reconstitute(Object value) { if (value == null) { return null; } @@ -103,8 +89,7 @@ public class DefaultFieldConverter implements FieldConverter { return value; } - @Override - public Object deconstruct(String name, Object value) { + private Object deconstruct(Object value) { if (value == null) { return null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java new file mode 100644 index 00000000..3b34ce80 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import com.gitee.dorive.core.api.executor.Converter; +import com.gitee.dorive.core.api.executor.FieldsMapper; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Data +@AllArgsConstructor +public class DefaultFieldsMapper implements FieldsMapper { + + private Map fieldAliasMapping; + private Map aliasFieldMapping; + private Map fieldPropMapping; + private Map fieldConverterMap; + private Map aliasConverterMap; + private Map propConverterMap; + + @Override + public String fieldToAlias(String field) { + return fieldAliasMapping.get(field); + } + + @Override + public String aliasToField(String alias) { + return aliasFieldMapping.get(alias); + } + + @Override + public String fieldToProp(String field) { + return fieldPropMapping.get(field); + } + + @Override + public boolean hasConverter() { + return fieldConverterMap != null && !fieldConverterMap.isEmpty(); + } + + @Override + public Object fieldToAlias(String alias, Object value) { + Converter converter = aliasConverterMap.get(alias); + if (converter != null) { + if (value instanceof List) { + List list = (List) value; + List newList = new ArrayList<>(list.size()); + for (Object item : list) { + Object mapValue = converter.fieldToAlias(alias, item); + if (mapValue != null) { + newList.add(mapValue); + } else { + newList.add(item); + } + } + return newList; + + } else { + Object mapValue = converter.fieldToAlias(alias, value); + if (mapValue != null) { + return mapValue; + } + } + } + return value; + } + + @Override + public Object aliasToField(String field, Object value) { + Converter converter = fieldConverterMap.get(field); + return converter != null ? converter.aliasToField(field, value) : value; + } + + @Override + public Object fieldToProp(String prop, Object value) { + Converter converter = propConverterMap.get(prop); + return converter != null ? converter.fieldToProp(prop, value) : value; + } + +} 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 77b64036..07588714 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 @@ -21,7 +21,7 @@ import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.api.executor.FieldsMapper; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -34,19 +34,18 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; -import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) public class ExampleExecutor extends AbstractProxyExecutor { private EntityEle entityEle; - private Map converterMap; + private FieldsMapper fieldsMapper; - public ExampleExecutor(Executor executor, EntityEle entityEle, Map converterMap) { + public ExampleExecutor(Executor executor, EntityEle entityEle, FieldsMapper fieldsMapper) { super(executor); this.entityEle = entityEle; - this.converterMap = converterMap; + this.fieldsMapper = fieldsMapper; } @Override @@ -114,24 +113,22 @@ public class ExampleExecutor extends AbstractProxyExecutor { convert(context, (Example) value); } } else { - doConvertCriteria(context, criterion); + doConvertCriteria(criterion); } } } } - private void doConvertCriteria(Context context, Criterion criterion) { + private void doConvertCriteria(Criterion criterion) { String property = criterion.getProperty(); - String alias = entityEle.toAlias(property); - criterion.setProperty(alias); - - Object value = criterion.getValue(); - if (converterMap != null && !converterMap.isEmpty()) { - FieldConverter fieldConverter = converterMap.get(property); - if (fieldConverter != null) { - Object mappedValue = fieldConverter.convert(context, criterion, value); - criterion.setValue(mappedValue); - } + String alias = fieldsMapper.fieldToAlias(property); + if (alias != null) { + criterion.setProperty(alias); + } + if (fieldsMapper.hasConverter()) { + Object value = criterion.getValue(); + value = fieldsMapper.fieldToAlias(alias, value); + criterion.setValue(value); } } 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 b0506f4a..fa9d96d3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -21,14 +21,12 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.FieldConverter; import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.executor.FieldsMapper; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Map; - @Data @NoArgsConstructor @AllArgsConstructor @@ -36,36 +34,27 @@ public class DefaultEntityFactory implements EntityFactory { private EntityEle entityEle; private Class pojoClass; - - private Map aliasFieldMapping; - private Map fieldConverterMap; + private FieldsMapper fieldsMapper; private CopyOptions reCopyOptions; - - private Map fieldPropMapping; - private Map propConverterMap; private CopyOptions deCopyOptions; - public void newReCopyOptions(Map aliasFieldMapping, Map fieldConverterMap) { - this.aliasFieldMapping = aliasFieldMapping; - this.fieldConverterMap = fieldConverterMap; - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(aliasFieldMapping::get); - if (fieldConverterMap != null && !fieldConverterMap.isEmpty()) { - this.reCopyOptions.setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = fieldConverterMap.get(name); - return fieldConverter != null ? fieldConverter.reconstitute(name, value) : value; - }); + public void setFieldsMapper(FieldsMapper fieldsMapper) { + this.fieldsMapper = fieldsMapper; + initReCopyOptions(); + initDeCopyOptions(); + } + + private void initReCopyOptions() { + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldsMapper::aliasToField); + if (fieldsMapper.hasConverter()) { + this.reCopyOptions.setFieldValueEditor((field, value) -> fieldsMapper.aliasToField(field, value)); } } - public void newDeCopyOptions(Map fieldPropMapping, Map propConverterMap) { - this.fieldPropMapping = fieldPropMapping; - this.propConverterMap = propConverterMap; - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldPropMapping::get); - if (propConverterMap != null && !propConverterMap.isEmpty()) { - this.deCopyOptions.setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = propConverterMap.get(name); - return fieldConverter != null ? fieldConverter.deconstruct(name, value) : value; - }); + private void initDeCopyOptions() { + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldsMapper::fieldToProp); + if (fieldsMapper.hasConverter()) { + this.deCopyOptions.setFieldValueEditor((prop, value) -> fieldsMapper.fieldToProp(prop, value)); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java similarity index 50% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java index 50b44c9e..ab9d97af 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/EntityFactoryBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java @@ -15,30 +15,27 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.resolver; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.executor.EntityFactory; -import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.context.ApplicationContext; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.stream.Collectors; - @Data @AllArgsConstructor -public class EntityFactoryBuilder { +public class EntityFactoryResolver { private AbstractContextRepository repository; private AbstractContextRepository.EntityInfo entityInfo; - private Map fieldConverterMap; + private FieldsMapper fieldsMapper; - public EntityFactory build(EntityDef entityDef, EntityEle entityEle) { + public EntityFactory resolve(EntityDef entityDef, EntityEle entityEle) { Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { @@ -51,40 +48,9 @@ public class EntityFactoryBuilder { DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; defaultEntityFactory.setEntityEle(entityEle); defaultEntityFactory.setPojoClass(entityInfo.getPojoClass()); - - Map aliasFieldMapping = newAliasFieldMapping(entityEle); - defaultEntityFactory.newReCopyOptions(aliasFieldMapping, fieldConverterMap); - - Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); - defaultEntityFactory.newDeCopyOptions(fieldPropMapping, newPropConverterMap(fieldPropMapping, fieldConverterMap)); + defaultEntityFactory.setFieldsMapper(fieldsMapper); } return entityFactory; } - private Map newAliasFieldMapping(EntityEle entityEle) { - Map fieldAliasMap = entityEle.getFieldAliasMap(); - return fieldAliasMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); - } - - private Map newFieldPropMapping(Map aliasFieldMapping) { - Map fieldPropMapping = new LinkedHashMap<>(); - Map propAliasMapping = entityInfo.getPropAliasMapping(); - propAliasMapping.forEach((prop, alias) -> { - String field = aliasFieldMapping.get(alias); - if (field != null) { - fieldPropMapping.put(field, prop); - } - }); - return fieldPropMapping; - } - - private Map newPropConverterMap(Map fieldPropMapping, Map converterMap) { - Map propConverterMap = new LinkedHashMap<>(converterMap.size()); - converterMap.forEach((field, fieldConverter) -> { - String prop = fieldPropMapping.get(field); - propConverterMap.put(prop, fieldConverter); - }); - return propConverterMap; - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java new file mode 100644 index 00000000..4c6f0a80 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java @@ -0,0 +1,116 @@ +/* + * 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.resolver; + +import cn.hutool.core.util.ReflectUtil; +import com.gitee.dorive.api.entity.def.FieldDef; +import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.api.entity.element.EntityField; +import com.gitee.dorive.core.api.executor.Converter; +import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.impl.converter.DefaultConverter; +import com.gitee.dorive.core.impl.converter.DefaultFieldsMapper; +import com.gitee.dorive.core.repository.AbstractContextRepository; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +public class FieldsMapperResolver { + + private EntityEle entityEle; + private AbstractContextRepository.EntityInfo entityInfo; + + public FieldsMapper resolve() { + Map fieldAliasMapping = entityEle.getFieldAliasMap(); + Map aliasFieldMapping = newAliasFieldMapping(fieldAliasMapping); + Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); + + Map fieldConverterMap = newFieldConverterMap(); + Map aliasConverterMap = newAliasConverterMap(fieldAliasMapping, fieldConverterMap); + Map propConverterMap = newPropConverterMap(fieldPropMapping, fieldConverterMap); + + return new DefaultFieldsMapper(fieldAliasMapping, aliasFieldMapping, fieldPropMapping, + fieldConverterMap, aliasConverterMap, propConverterMap); + } + + private Map newAliasFieldMapping(Map fieldAliasMapping) { + return fieldAliasMapping.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + } + + private Map newFieldPropMapping(Map aliasFieldMapping) { + Map fieldPropMapping = new LinkedHashMap<>(); + Map propAliasMapping = entityInfo.getPropAliasMapping(); + propAliasMapping.forEach((prop, alias) -> { + String field = aliasFieldMapping.get(alias); + if (field != null) { + fieldPropMapping.put(field, prop); + } + }); + return fieldPropMapping; + } + + private Map newFieldConverterMap() { + Map converterMap = new LinkedHashMap<>(8); + Map entityFieldMap = entityEle.getEntityFieldMap(); + if (entityFieldMap != null) { + entityFieldMap.forEach((name, entityField) -> { + FieldDef fieldDef = entityField.getFieldDef(); + if (fieldDef != null) { + Class converterClass = fieldDef.getConverter(); + String mapExp = fieldDef.getMapExp(); + Converter converter = null; + if (converterClass != Object.class) { + converter = (Converter) ReflectUtil.newInstance(converterClass); + + } else if (StringUtils.isNotBlank(mapExp)) { + converter = new DefaultConverter(entityField); + } + if (converter != null) { + converterMap.put(name, converter); + } + } + }); + } + return converterMap; + } + + private Map newAliasConverterMap(Map fieldAliasMapping, Map fieldConverterMap) { + Map aliasConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); + fieldConverterMap.forEach((field, converter) -> { + String alias = fieldAliasMapping.get(field); + aliasConverterMap.put(alias, converter); + }); + return aliasConverterMap; + } + + private Map newPropConverterMap(Map fieldPropMapping, Map fieldConverterMap) { + Map propConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); + fieldConverterMap.forEach((field, converter) -> { + String prop = fieldPropMapping.get(field); + propConverterMap.put(prop, converter); + }); + return propConverterMap; + } + +} 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 ba452194..b90d3c53 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -19,13 +19,10 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; -import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.api.entity.element.EntityField; import com.gitee.dorive.api.entity.element.EntityType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; @@ -33,19 +30,19 @@ import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.executor.EntityFactory; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.executor.FieldConverter; +import com.gitee.dorive.core.api.executor.FieldsMapper; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.impl.converter.DefaultFieldConverter; import com.gitee.dorive.core.impl.executor.ContextExecutor; -import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; -import com.gitee.dorive.core.impl.factory.EntityFactoryBuilder; +import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; +import com.gitee.dorive.core.impl.resolver.EntityFactoryResolver; +import com.gitee.dorive.core.impl.resolver.FieldsMapperResolver; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -187,44 +184,21 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle); ENTITY_INFO_MAP.put(entityEle, entityInfo); - Map fieldConverterMap = newFieldConverterMap(entityEle); - EntityFactoryBuilder entityFactoryBuilder = new EntityFactoryBuilder(this, entityInfo, fieldConverterMap); - EntityFactory entityFactory = entityFactoryBuilder.build(entityDef, entityEle); + FieldsMapperResolver fieldsMapperResolver = new FieldsMapperResolver(entityEle, entityInfo); + FieldsMapper fieldsMapper = fieldsMapperResolver.resolve(); + + EntityFactoryResolver entityFactoryResolver = new EntityFactoryResolver(this, entityInfo, fieldsMapper); + EntityFactory entityFactory = entityFactoryResolver.resolve(entityDef, entityEle); Executor executor = newExecutor(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); - executor = new ExampleExecutor(executor, entityEle, fieldConverterMap); + executor = new ExampleExecutor(executor, entityEle, fieldsMapper); EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); defaultRepository.setExecutor(executor); } return (AbstractRepository) repository; } - private Map newFieldConverterMap(EntityEle entityEle) { - Map converterMap = new LinkedHashMap<>(8); - Map entityFieldMap = entityEle.getEntityFieldMap(); - if (entityFieldMap != null) { - entityFieldMap.forEach((name, entityField) -> { - FieldDef fieldDef = entityField.getFieldDef(); - if (fieldDef != null) { - Class converterClass = fieldDef.getConverter(); - String mapExp = fieldDef.getMapExp(); - FieldConverter fieldConverter = null; - if (converterClass != Object.class) { - fieldConverter = (FieldConverter) ReflectUtil.newInstance(converterClass); - - } else if (StringUtils.isNotBlank(mapExp)) { - fieldConverter = new DefaultFieldConverter(entityField); - } - if (fieldConverter != null) { - converterMap.put(name, fieldConverter); - } - } - }); - } - return converterMap; - } - private OrderBy newDefaultOrderBy(EntityDef entityDef) { String sortBy = entityDef.getSortBy(); String order = entityDef.getOrder().toUpperCase(); -- Gitee From 5d5c4620e05ab8041bc48f32caa946851842d70b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 10:12:56 +0800 Subject: [PATCH 076/146] =?UTF-8?q?=E5=B0=86converter=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/entity/element/EntityEle.java | 6 +- .../api/entity/element/EntityField.java | 2 +- .../dorive/api/entity/element/EntityType.java | 2 +- .../{executor => converter}/Converter.java | 2 +- .../EntityFactory.java | 2 +- .../EntityMapper.java} | 4 +- .../core/impl/converter/DefaultConverter.java | 2 +- .../DefaultEntityFactory.java | 24 ++++---- ...dsMapper.java => DefaultEntityMapper.java} | 6 +- .../core/impl/executor/ExampleExecutor.java | 14 ++--- .../core/impl/executor/FactoryExecutor.java | 2 +- .../impl/resolver/EntityFactoryResolver.java | 56 ------------------- ...esolver.java => EntityMapperResolver.java} | 14 ++--- .../repository/AbstractContextRepository.java | 34 +++++++---- 14 files changed, 64 insertions(+), 106 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{executor => converter}/Converter.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{executor => converter}/EntityFactory.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{executor/FieldsMapper.java => converter/EntityMapper.java} (90%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{factory => converter}/DefaultEntityFactory.java (78%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/{DefaultFieldsMapper.java => DefaultEntityMapper.java} (94%) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/{FieldsMapperResolver.java => EntityMapperResolver.java} (93%) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java index 3a89c428..5767bcc1 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java @@ -38,7 +38,7 @@ public abstract class EntityEle { private boolean aggregated; private List bindingDefs; private PropProxy pkProxy; - private Map fieldAliasMap; + private Map fieldAliasMapping; public EntityEle(AnnotatedElement element) { this.element = element; @@ -62,11 +62,11 @@ public abstract class EntityEle { } public boolean hasField(String field) { - return fieldAliasMap.containsKey(field); + return fieldAliasMapping.containsKey(field); } public String toAlias(String field) { - return fieldAliasMap.getOrDefault(field, field); + return fieldAliasMapping.getOrDefault(field, field); } public List toAliases(List fields) { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java index 03eca7dc..338f9151 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java @@ -82,7 +82,7 @@ public class EntityField extends EntityEle { if (entityType != null) { entityType.initialize(); setPkProxy(entityType.getPkProxy()); - setFieldAliasMap(entityType.getFieldAliasMap()); + setFieldAliasMapping(entityType.getFieldAliasMapping()); } } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java index e1bdeebe..edd39dd5 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java @@ -105,7 +105,7 @@ public class EntityType extends EntityEle { Assert.notNull(pkProxy, "The primary key not found! type: {}", genericType.getName()); setPkProxy(pkProxy); - setFieldAliasMap(propAliasMap); + setFieldAliasMapping(propAliasMap); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java index 5f36be41..3e2c975f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Converter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.executor; +package com.gitee.dorive.core.api.converter; public interface Converter { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java index 789cc202..465ed494 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.executor; +package com.gitee.dorive.core.api.converter; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java similarity index 90% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java index 83fbd458..63642be5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/FieldsMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.executor; +package com.gitee.dorive.core.api.converter; -public interface FieldsMapper extends Converter { +public interface EntityMapper extends Converter { String fieldToAlias(String field); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java index 6b02ec8b..34a929f3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.element.EntityField; -import com.gitee.dorive.core.api.executor.Converter; +import com.gitee.dorive.core.api.converter.Converter; import lombok.Data; import org.apache.commons.lang3.StringUtils; 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/converter/DefaultEntityFactory.java similarity index 78% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java index fa9d96d3..4f7efc92 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/converter/DefaultEntityFactory.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.converter; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityFactory; -import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.api.converter.EntityFactory; +import com.gitee.dorive.core.api.converter.EntityMapper; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -34,27 +34,27 @@ public class DefaultEntityFactory implements EntityFactory { private EntityEle entityEle; private Class pojoClass; - private FieldsMapper fieldsMapper; + private EntityMapper entityMapper; private CopyOptions reCopyOptions; private CopyOptions deCopyOptions; - public void setFieldsMapper(FieldsMapper fieldsMapper) { - this.fieldsMapper = fieldsMapper; + public void setEntityMapper(EntityMapper entityMapper) { + this.entityMapper = entityMapper; initReCopyOptions(); initDeCopyOptions(); } private void initReCopyOptions() { - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldsMapper::aliasToField); - if (fieldsMapper.hasConverter()) { - this.reCopyOptions.setFieldValueEditor((field, value) -> fieldsMapper.aliasToField(field, value)); + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::aliasToField); + if (entityMapper.hasConverter()) { + this.reCopyOptions.setFieldValueEditor((field, value) -> entityMapper.aliasToField(field, value)); } } private void initDeCopyOptions() { - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(fieldsMapper::fieldToProp); - if (fieldsMapper.hasConverter()) { - this.deCopyOptions.setFieldValueEditor((prop, value) -> fieldsMapper.fieldToProp(prop, value)); + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::fieldToProp); + if (entityMapper.hasConverter()) { + this.deCopyOptions.setFieldValueEditor((prop, value) -> entityMapper.fieldToProp(prop, value)); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java similarity index 94% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java index 3b34ce80..997664b6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultFieldsMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java @@ -17,8 +17,8 @@ package com.gitee.dorive.core.impl.converter; -import com.gitee.dorive.core.api.executor.Converter; -import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.api.converter.Converter; +import com.gitee.dorive.core.api.converter.EntityMapper; import lombok.AllArgsConstructor; import lombok.Data; @@ -28,7 +28,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class DefaultFieldsMapper implements FieldsMapper { +public class DefaultEntityMapper implements EntityMapper { private Map fieldAliasMapping; private Map aliasFieldMapping; 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 07588714..b4d50089 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 @@ -21,7 +21,7 @@ import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -40,12 +40,12 @@ import java.util.List; public class ExampleExecutor extends AbstractProxyExecutor { private EntityEle entityEle; - private FieldsMapper fieldsMapper; + private EntityMapper entityMapper; - public ExampleExecutor(Executor executor, EntityEle entityEle, FieldsMapper fieldsMapper) { + public ExampleExecutor(Executor executor, EntityEle entityEle, EntityMapper entityMapper) { super(executor); this.entityEle = entityEle; - this.fieldsMapper = fieldsMapper; + this.entityMapper = entityMapper; } @Override @@ -121,13 +121,13 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void doConvertCriteria(Criterion criterion) { String property = criterion.getProperty(); - String alias = fieldsMapper.fieldToAlias(property); + String alias = entityMapper.fieldToAlias(property); if (alias != null) { criterion.setProperty(alias); } - if (fieldsMapper.hasConverter()) { + if (entityMapper.hasConverter()) { Object value = criterion.getValue(); - value = fieldsMapper.fieldToAlias(alias, value); + value = entityMapper.fieldToAlias(alias, value); criterion.setValue(value); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 36d87193..9bc68523 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.*; import com.gitee.dorive.core.entity.operation.Insert; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java deleted file mode 100644 index ab9d97af..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityFactoryResolver.java +++ /dev/null @@ -1,56 +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.resolver; - -import com.gitee.dorive.api.entity.def.EntityDef; -import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.core.api.executor.EntityFactory; -import com.gitee.dorive.core.api.executor.FieldsMapper; -import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; -import com.gitee.dorive.core.repository.AbstractContextRepository; -import lombok.AllArgsConstructor; -import lombok.Data; -import org.springframework.context.ApplicationContext; - -@Data -@AllArgsConstructor -public class EntityFactoryResolver { - - private AbstractContextRepository repository; - private AbstractContextRepository.EntityInfo entityInfo; - private FieldsMapper fieldsMapper; - - public EntityFactory resolve(EntityDef entityDef, EntityEle entityEle) { - Class factoryClass = entityDef.getFactory(); - EntityFactory entityFactory; - if (factoryClass == Object.class) { - entityFactory = new DefaultEntityFactory(); - } else { - ApplicationContext applicationContext = repository.getApplicationContext(); - entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); - } - if (entityFactory instanceof DefaultEntityFactory) { - DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; - defaultEntityFactory.setEntityEle(entityEle); - defaultEntityFactory.setPojoClass(entityInfo.getPojoClass()); - defaultEntityFactory.setFieldsMapper(fieldsMapper); - } - return entityFactory; - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java similarity index 93% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 4c6f0a80..392a5a95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/FieldsMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -21,10 +21,10 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.api.entity.element.EntityField; -import com.gitee.dorive.core.api.executor.Converter; -import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.api.converter.Converter; +import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.impl.converter.DefaultConverter; -import com.gitee.dorive.core.impl.converter.DefaultFieldsMapper; +import com.gitee.dorive.core.impl.converter.DefaultEntityMapper; import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.AllArgsConstructor; import lombok.Data; @@ -36,13 +36,13 @@ import java.util.stream.Collectors; @Data @AllArgsConstructor -public class FieldsMapperResolver { +public class EntityMapperResolver { private EntityEle entityEle; private AbstractContextRepository.EntityInfo entityInfo; - public FieldsMapper resolve() { - Map fieldAliasMapping = entityEle.getFieldAliasMap(); + public EntityMapper resolve() { + Map fieldAliasMapping = entityEle.getFieldAliasMapping(); Map aliasFieldMapping = newAliasFieldMapping(fieldAliasMapping); Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); @@ -50,7 +50,7 @@ public class FieldsMapperResolver { Map aliasConverterMap = newAliasConverterMap(fieldAliasMapping, fieldConverterMap); Map propConverterMap = newPropConverterMap(fieldPropMapping, fieldConverterMap); - return new DefaultFieldsMapper(fieldAliasMapping, aliasFieldMapping, fieldPropMapping, + return new DefaultEntityMapper(fieldAliasMapping, aliasFieldMapping, fieldPropMapping, fieldConverterMap, aliasConverterMap, propConverterMap); } 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 b90d3c53..71c5bf77 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 @@ -27,22 +27,22 @@ import com.gitee.dorive.api.entity.element.EntityType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; -import com.gitee.dorive.core.api.executor.EntityFactory; +import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.executor.FieldsMapper; +import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.executor.OrderBy; 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.converter.DefaultEntityFactory; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; -import com.gitee.dorive.core.impl.resolver.EntityFactoryResolver; -import com.gitee.dorive.core.impl.resolver.FieldsMapperResolver; +import com.gitee.dorive.core.impl.resolver.EntityMapperResolver; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -184,21 +184,35 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle); ENTITY_INFO_MAP.put(entityEle, entityInfo); - FieldsMapperResolver fieldsMapperResolver = new FieldsMapperResolver(entityEle, entityInfo); - FieldsMapper fieldsMapper = fieldsMapperResolver.resolve(); - - EntityFactoryResolver entityFactoryResolver = new EntityFactoryResolver(this, entityInfo, fieldsMapper); - EntityFactory entityFactory = entityFactoryResolver.resolve(entityDef, entityEle); + EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityInfo).resolve(); + EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); - executor = new ExampleExecutor(executor, entityEle, fieldsMapper); + executor = new ExampleExecutor(executor, entityEle, entityMapper); EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); defaultRepository.setExecutor(executor); } return (AbstractRepository) repository; } + private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, EntityInfo entityInfo, EntityMapper entityMapper) { + Class factoryClass = entityDef.getFactory(); + EntityFactory entityFactory; + if (factoryClass == Object.class) { + entityFactory = new DefaultEntityFactory(); + } else { + entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); + } + if (entityFactory instanceof DefaultEntityFactory) { + DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; + defaultEntityFactory.setEntityEle(entityEle); + defaultEntityFactory.setPojoClass(entityInfo.getPojoClass()); + defaultEntityFactory.setEntityMapper(entityMapper); + } + return entityFactory; + } + private OrderBy newDefaultOrderBy(EntityDef entityDef) { String sortBy = entityDef.getSortBy(); String order = entityDef.getOrder().toUpperCase(); -- Gitee From b3d17ab7eb004538c5e1839fcece5b454724f0d1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 11:42:08 +0800 Subject: [PATCH 077/146] =?UTF-8?q?=E4=BC=98=E5=8C=96=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/entity/element/EntityType.java | 12 ++++++------ .../dorive/core/impl/executor/ExampleExecutor.java | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java index edd39dd5..ee986729 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java @@ -91,21 +91,21 @@ public class EntityType extends EntityEle { Class genericType = getGenericType(); int initialCapacity = entityFieldMap.size() * 4 / 3 + 1; PropProxy pkProxy = null; - Map propAliasMap = new LinkedHashMap<>(initialCapacity); + Map fieldAliasMapping = new LinkedHashMap<>(initialCapacity); for (EntityField entityField : entityFieldMap.values()) { - String name = entityField.getName(); + String field = entityField.getName(); FieldDef fieldDef = entityField.getFieldDef(); - if ("id".equals(name)) { + if ("id".equals(field)) { pkProxy = PropProxyFactory.newPropProxy(genericType, "id"); } - String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(name); - propAliasMap.put(name, alias); + String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(field); + fieldAliasMapping.put(field, alias); } Assert.notNull(pkProxy, "The primary key not found! type: {}", genericType.getName()); setPkProxy(pkProxy); - setFieldAliasMapping(propAliasMap); + setFieldAliasMapping(fieldAliasMapping); } @Override 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 b4d50089..fde8aec9 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 @@ -124,6 +124,8 @@ public class ExampleExecutor extends AbstractProxyExecutor { String alias = entityMapper.fieldToAlias(property); if (alias != null) { criterion.setProperty(alias); + } else { + alias = property; } if (entityMapper.hasConverter()) { Object value = criterion.getValue(); -- Gitee From 62187b70f0e207f8066f2a2a20880d6eb909ea80 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 12:08:20 +0800 Subject: [PATCH 078/146] =?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/entity/common/EntityInfo.java | 31 +++++++++++++++++++ .../impl/resolver/EntityMapperResolver.java | 4 +-- .../repository/AbstractContextRepository.java | 10 +----- .../repository/MybatisPlusRepository.java | 1 + .../gitee/dorive/sql/impl/SegmentBuilder.java | 3 +- 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java new file mode 100644 index 00000000..8ac80d05 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.common; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Map; + +@Data +@AllArgsConstructor +public class EntityInfo { + private Class pojoClass; + private String tableName; + private Map propAliasMapping; +} 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 392a5a95..a85597ae 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 @@ -23,9 +23,9 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.api.entity.element.EntityField; import com.gitee.dorive.core.api.converter.Converter; import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.entity.common.EntityInfo; import com.gitee.dorive.core.impl.converter.DefaultConverter; import com.gitee.dorive.core.impl.converter.DefaultEntityMapper; -import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.commons.lang3.StringUtils; @@ -39,7 +39,7 @@ import java.util.stream.Collectors; public class EntityMapperResolver { private EntityEle entityEle; - private AbstractContextRepository.EntityInfo entityInfo; + private EntityInfo entityInfo; public EntityMapper resolve() { Map fieldAliasMapping = entityEle.getFieldAliasMapping(); 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 71c5bf77..3d19c9e2 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 @@ -32,6 +32,7 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; +import com.gitee.dorive.core.entity.common.EntityInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; @@ -43,7 +44,6 @@ import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.impl.resolver.EntityMapperResolver; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; @@ -240,12 +240,4 @@ public abstract class AbstractContextRepository extends AbstractRepositor protected abstract EntityHandler processEntityHandler(EntityHandler entityHandler); - @Data - @AllArgsConstructor - public static class EntityInfo { - private Class pojoClass; - private String tableName; - private Map propAliasMapping; - } - } 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 a3adbfb9..fd1f281c 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 @@ -27,6 +27,7 @@ import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.common.EntityInfo; import com.gitee.dorive.core.entity.context.Strategy; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 8fdf0572..99ce3413 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -20,6 +20,7 @@ package com.gitee.dorive.sql.impl; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.common.EntityInfo; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; @@ -64,7 +65,7 @@ public class SegmentBuilder { CommonRepository executedRepository = mergedRepository.getExecutedRepository(); EntityEle entityEle = executedRepository.getEntityEle(); - AbstractContextRepository.EntityInfo entityInfo = AbstractContextRepository.getEntityInfo(entityEle); + EntityInfo entityInfo = AbstractContextRepository.getEntityInfo(entityEle); ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityEle); String tableName = entityInfo.getTableName(); -- Gitee From 8128e2072c1706bd910502f4b2a73843878eb9ac Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 12:30:25 +0800 Subject: [PATCH 079/146] =?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 --- .../{EntityInfo.java => EntityStoreInfo.java} | 2 +- .../impl/resolver/EntityMapperResolver.java | 6 ++--- .../repository/AbstractContextRepository.java | 22 +++++++++---------- .../repository/MybatisPlusRepository.java | 6 ++--- .../gitee/dorive/sql/impl/SegmentBuilder.java | 6 ++--- 5 files changed, 21 insertions(+), 21 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/common/{EntityInfo.java => EntityStoreInfo.java} (97%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java similarity index 97% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 8ac80d05..5723de2f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -24,7 +24,7 @@ import java.util.Map; @Data @AllArgsConstructor -public class EntityInfo { +public class EntityStoreInfo { private Class pojoClass; private String tableName; private Map propAliasMapping; 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 a85597ae..fed01eac 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 @@ -23,7 +23,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.api.entity.element.EntityField; import com.gitee.dorive.core.api.converter.Converter; import com.gitee.dorive.core.api.converter.EntityMapper; -import com.gitee.dorive.core.entity.common.EntityInfo; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.impl.converter.DefaultConverter; import com.gitee.dorive.core.impl.converter.DefaultEntityMapper; import lombok.AllArgsConstructor; @@ -39,7 +39,7 @@ import java.util.stream.Collectors; public class EntityMapperResolver { private EntityEle entityEle; - private EntityInfo entityInfo; + private EntityStoreInfo entityStoreInfo; public EntityMapper resolve() { Map fieldAliasMapping = entityEle.getFieldAliasMapping(); @@ -60,7 +60,7 @@ public class EntityMapperResolver { private Map newFieldPropMapping(Map aliasFieldMapping) { Map fieldPropMapping = new LinkedHashMap<>(); - Map propAliasMapping = entityInfo.getPropAliasMapping(); + Map propAliasMapping = entityStoreInfo.getPropAliasMapping(); propAliasMapping.forEach((prop, alias) -> { String field = aliasFieldMapping.get(alias); if (field != 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 3d19c9e2..9f2eb65b 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 @@ -32,7 +32,7 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; -import com.gitee.dorive.core.entity.common.EntityInfo; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; @@ -63,7 +63,7 @@ import java.util.concurrent.ConcurrentHashMap; @EqualsAndHashCode(callSuper = false) public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { - private static final Map ENTITY_INFO_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; @@ -76,8 +76,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor private List subRepositories = new ArrayList<>(); private List orderedRepositories = new ArrayList<>(); - public static EntityInfo getEntityInfo(EntityEle entityEle) { - return ENTITY_INFO_MAP.get(entityEle); + public static EntityStoreInfo getEntityStoreInfo(EntityEle entityEle) { + return ENTITY_STORE_INFO_MAP.get(entityEle); } public static ExampleExecutor getExampleExecutor(EntityEle entityEle) { @@ -181,11 +181,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityEle(entityEle); defaultRepository.setOperationFactory(operationFactory); - EntityInfo entityInfo = resolveEntityInfo(entityDef, entityEle); - ENTITY_INFO_MAP.put(entityEle, entityInfo); + EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityEle); + ENTITY_STORE_INFO_MAP.put(entityEle, entityStoreInfo); - EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityInfo).resolve(); - EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityInfo, entityMapper); + EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).resolve(); + EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle); executor = new FactoryExecutor(executor, entityEle, entityFactory); @@ -196,7 +196,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor return (AbstractRepository) repository; } - private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, EntityInfo entityInfo, EntityMapper entityMapper) { + private EntityFactory newEntityFactory(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { @@ -207,7 +207,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor if (entityFactory instanceof DefaultEntityFactory) { DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; defaultEntityFactory.setEntityEle(entityEle); - defaultEntityFactory.setPojoClass(entityInfo.getPojoClass()); + defaultEntityFactory.setPojoClass(entityStoreInfo.getPojoClass()); defaultEntityFactory.setEntityMapper(entityMapper); } return entityFactory; @@ -232,7 +232,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor return new ContextExecutor(this, entityHandler); } - protected abstract EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle); + protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle); protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle); 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 fd1f281c..26a2ed87 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 @@ -27,7 +27,7 @@ import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.common.EntityInfo; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.context.Strategy; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; @@ -69,7 +69,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override @SuppressWarnings("unchecked") - protected EntityInfo resolveEntityInfo(EntityDef entityDef, EntityEle entityEle) { + protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle) { Class mapperClass = entityDef.getSource(); if (mapperClass != Object.class) { mapper = (BaseMapper) getApplicationContext().getBean(mapperClass); @@ -89,7 +89,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { Assert.notNull(tableInfo, "The table info cannot be null! source: {}", mapperClass); String tableName = tableInfo != null ? tableInfo.getTableName() : null; Map propAliasMapping = getPropAliasMapping(); - return new EntityInfo(pojoClass, tableName, propAliasMapping); + return new EntityStoreInfo(pojoClass, tableName, propAliasMapping); } private Map getPropAliasMapping() { diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 99ce3413..e68c9dab 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -20,7 +20,7 @@ package com.gitee.dorive.sql.impl; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.common.EntityInfo; +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; @@ -65,10 +65,10 @@ public class SegmentBuilder { CommonRepository executedRepository = mergedRepository.getExecutedRepository(); EntityEle entityEle = executedRepository.getEntityEle(); - EntityInfo entityInfo = AbstractContextRepository.getEntityInfo(entityEle); + EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); ExampleExecutor exampleExecutor = AbstractContextRepository.getExampleExecutor(entityEle); - String tableName = entityInfo.getTableName(); + String tableName = entityStoreInfo.getTableName(); String tableAlias = selectSegment.generateTableAlias(); Example example = exampleMap.computeIfAbsent(absoluteAccessPath, key -> new InnerExample(Collections.emptyList())); exampleExecutor.convert(context, example); -- Gitee From c19c98f0a137fdb3726cb235033eaab1092a6e62 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 12:44:33 +0800 Subject: [PATCH 080/146] =?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/impl/converter/DefaultEntityFactory.java | 5 +++-- .../dorive/core/repository/AbstractContextRepository.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java index 4f7efc92..fea4808f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java @@ -23,6 +23,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -33,7 +34,7 @@ import lombok.NoArgsConstructor; public class DefaultEntityFactory implements EntityFactory { private EntityEle entityEle; - private Class pojoClass; + private EntityStoreInfo entityStoreInfo; private EntityMapper entityMapper; private CopyOptions reCopyOptions; private CopyOptions deCopyOptions; @@ -65,7 +66,7 @@ public class DefaultEntityFactory implements EntityFactory { @Override public Object deconstruct(Context context, Object entity) { - return BeanUtil.toBean(entity, pojoClass, deCopyOptions); + return BeanUtil.toBean(entity, entityStoreInfo.getPojoClass(), deCopyOptions); } } 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 9f2eb65b..6f12a071 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 @@ -207,7 +207,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor if (entityFactory instanceof DefaultEntityFactory) { DefaultEntityFactory defaultEntityFactory = (DefaultEntityFactory) entityFactory; defaultEntityFactory.setEntityEle(entityEle); - defaultEntityFactory.setPojoClass(entityStoreInfo.getPojoClass()); + defaultEntityFactory.setEntityStoreInfo(entityStoreInfo); defaultEntityFactory.setEntityMapper(entityMapper); } return entityFactory; -- Gitee From 818a8cb7aa0923ac088ea4401f22ec357f850f0c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 12:52:23 +0800 Subject: [PATCH 081/146] =?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/core/repository/AbstractRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 eab1763c..c7daeb03 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 @@ -68,8 +68,8 @@ public abstract class AbstractRepository implements Repository, Ex @Override public E selectOneByExample(Context context, Example example) { - List list = selectByExample(context, example); - return list != null && !list.isEmpty() ? list.get(0) : null; + List entities = selectByExample(context, example); + return entities != null && !entities.isEmpty() ? entities.get(0) : null; } @Override -- Gitee From 8050c597efdd5ea508fbf63117c1a322734b24ab Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 13:29:39 +0800 Subject: [PATCH 082/146] =?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/impl/resolver/EntityMapperResolver.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 fed01eac..e84ecc97 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 @@ -32,7 +32,6 @@ import org.apache.commons.lang3.StringUtils; import java.util.LinkedHashMap; import java.util.Map; -import java.util.stream.Collectors; @Data @AllArgsConstructor @@ -55,7 +54,9 @@ public class EntityMapperResolver { } private Map newAliasFieldMapping(Map fieldAliasMapping) { - return fieldAliasMapping.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + Map aliasFieldMapping = new LinkedHashMap<>(); + fieldAliasMapping.forEach((field, alias) -> aliasFieldMapping.put(alias, field)); + return aliasFieldMapping; } private Map newFieldPropMapping(Map aliasFieldMapping) { -- Gitee From ecd46023a5503630df9aef8c183f13ee87c5d7f2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 13:37:37 +0800 Subject: [PATCH 083/146] =?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/impl/resolver/EntityMapperResolver.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 e84ecc97..056bbb33 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 @@ -72,10 +72,10 @@ public class EntityMapperResolver { } private Map newFieldConverterMap() { - Map converterMap = new LinkedHashMap<>(8); + Map fieldConverterMap = new LinkedHashMap<>(8); Map entityFieldMap = entityEle.getEntityFieldMap(); if (entityFieldMap != null) { - entityFieldMap.forEach((name, entityField) -> { + entityFieldMap.forEach((field, entityField) -> { FieldDef fieldDef = entityField.getFieldDef(); if (fieldDef != null) { Class converterClass = fieldDef.getConverter(); @@ -88,12 +88,12 @@ public class EntityMapperResolver { converter = new DefaultConverter(entityField); } if (converter != null) { - converterMap.put(name, converter); + fieldConverterMap.put(field, converter); } } }); } - return converterMap; + return fieldConverterMap; } private Map newAliasConverterMap(Map fieldAliasMapping, Map fieldConverterMap) { -- Gitee From c8d3004c1c0d7dff5a11cdb37349abb578189b0c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 13:58:39 +0800 Subject: [PATCH 084/146] =?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/api/converter/Converter.java | 6 ++---- .../core/api/converter/EntityMapper.java | 8 +++++++- .../core/impl/converter/DefaultConverter.java | 19 ++----------------- .../impl/converter/DefaultEntityMapper.java | 8 ++++---- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java index 3e2c975f..6f85ca0b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java @@ -19,10 +19,8 @@ package com.gitee.dorive.core.api.converter; public interface Converter { - Object fieldToAlias(String alias, Object value); + Object reconstitute(Object value); - Object aliasToField(String field, Object value); - - Object fieldToProp(String prop, Object value); + Object deconstruct(Object value); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java index 63642be5..79799913 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.api.converter; -public interface EntityMapper extends Converter { +public interface EntityMapper { String fieldToAlias(String field); @@ -27,4 +27,10 @@ public interface EntityMapper extends Converter { boolean hasConverter(); + Object fieldToAlias(String alias, Object value); + + Object aliasToField(String field, Object value); + + Object fieldToProp(String prop, Object value); + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java index 34a929f3..754dfd4c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java @@ -63,22 +63,7 @@ public class DefaultConverter implements Converter { } } - @Override - public Object fieldToAlias(String alias, Object value) { - return deconstruct(value); - } - - @Override - public Object aliasToField(String field, Object value) { - return reconstitute(value); - } - - @Override - public Object fieldToProp(String prop, Object value) { - return deconstruct(value); - } - - private Object reconstitute(Object value) { + public Object reconstitute(Object value) { if (value == null) { return null; } @@ -89,7 +74,7 @@ public class DefaultConverter implements Converter { return value; } - private Object deconstruct(Object value) { + public Object deconstruct(Object value) { if (value == null) { return null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java index 997664b6..a453e573 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java @@ -65,7 +65,7 @@ public class DefaultEntityMapper implements EntityMapper { List list = (List) value; List newList = new ArrayList<>(list.size()); for (Object item : list) { - Object mapValue = converter.fieldToAlias(alias, item); + Object mapValue = converter.deconstruct(item); if (mapValue != null) { newList.add(mapValue); } else { @@ -75,7 +75,7 @@ public class DefaultEntityMapper implements EntityMapper { return newList; } else { - Object mapValue = converter.fieldToAlias(alias, value); + Object mapValue = converter.deconstruct(value); if (mapValue != null) { return mapValue; } @@ -87,13 +87,13 @@ public class DefaultEntityMapper implements EntityMapper { @Override public Object aliasToField(String field, Object value) { Converter converter = fieldConverterMap.get(field); - return converter != null ? converter.aliasToField(field, value) : value; + return converter != null ? converter.reconstitute(value) : value; } @Override public Object fieldToProp(String prop, Object value) { Converter converter = propConverterMap.get(prop); - return converter != null ? converter.fieldToProp(prop, value) : value; + return converter != null ? converter.deconstruct(value) : value; } } -- Gitee From 0a04c1c92e947728c9e7ef429aa8cea2578257d4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 16 Jan 2024 16:21:04 +0800 Subject: [PATCH 085/146] =?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/entity/executor/Example.java | 74 +++++++++---------- .../core/entity/executor/UnionExample.java | 4 +- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java index f6b2aac0..47a64b08 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java @@ -42,24 +42,24 @@ public class Example { this.criteria = criteria; } - public void select(List properties) { - selectProps = properties; + public void select(List fields) { + selectProps = fields; } - public void select(String... properties) { - select(StringUtils.toList(properties)); + public void select(String... fields) { + select(StringUtils.toList(fields)); } - public void selectExtra(List properties) { + public void selectExtra(List fields) { if (extraProps == null) { - extraProps = properties; + extraProps = fields; } else { - extraProps.addAll(properties); + extraProps.addAll(fields); } } - public void selectExtra(String... properties) { - selectExtra(StringUtils.toList(properties)); + public void selectExtra(String... fields) { + selectExtra(StringUtils.toList(fields)); } public boolean isEmpty() { @@ -70,63 +70,63 @@ public class Example { return !criteria.isEmpty(); } - public Example eq(String property, Object value) { - criteria.add(new Criterion(property, Operator.EQ, value)); + public Example eq(String field, Object value) { + criteria.add(new Criterion(field, Operator.EQ, value)); return this; } - public Example ne(String property, Object value) { - criteria.add(new Criterion(property, Operator.NE, value)); + public Example ne(String field, Object value) { + criteria.add(new Criterion(field, Operator.NE, value)); return this; } - public Example gt(String property, Object value) { - criteria.add(new Criterion(property, Operator.GT, value)); + public Example gt(String field, Object value) { + criteria.add(new Criterion(field, Operator.GT, value)); return this; } - public Example ge(String property, Object value) { - criteria.add(new Criterion(property, Operator.GE, value)); + public Example ge(String field, Object value) { + criteria.add(new Criterion(field, Operator.GE, value)); return this; } - public Example lt(String property, Object value) { - criteria.add(new Criterion(property, Operator.LT, value)); + public Example lt(String field, Object value) { + criteria.add(new Criterion(field, Operator.LT, value)); return this; } - public Example le(String property, Object value) { - criteria.add(new Criterion(property, Operator.LE, value)); + public Example le(String field, Object value) { + criteria.add(new Criterion(field, Operator.LE, value)); return this; } - public Example in(String property, Object value) { - criteria.add(new Criterion(property, Operator.IN, value)); + public Example in(String field, Object value) { + criteria.add(new Criterion(field, Operator.IN, value)); return this; } - public Example notIn(String property, Object value) { - criteria.add(new Criterion(property, Operator.NOT_IN, value)); + public Example notIn(String field, Object value) { + criteria.add(new Criterion(field, Operator.NOT_IN, value)); return this; } - public Example like(String property, Object value) { - criteria.add(new Criterion(property, Operator.LIKE, value)); + public Example like(String field, Object value) { + criteria.add(new Criterion(field, Operator.LIKE, value)); return this; } - public Example notLike(String property, Object value) { - criteria.add(new Criterion(property, Operator.NOT_LIKE, value)); + public Example notLike(String field, Object value) { + criteria.add(new Criterion(field, Operator.NOT_LIKE, value)); return this; } - public Example isNull(String property) { - criteria.add(new Criterion(property, Operator.IS_NULL)); + public Example isNull(String field) { + criteria.add(new Criterion(field, Operator.IS_NULL)); return this; } - public Example isNotNull(String property) { - criteria.add(new Criterion(property, Operator.IS_NOT_NULL)); + public Example isNotNull(String field) { + criteria.add(new Criterion(field, Operator.IS_NOT_NULL)); return this; } @@ -144,13 +144,13 @@ public class Example { return this; } - public Example orderByAsc(String... properties) { - orderBy = new OrderBy(Arrays.asList(properties), Order.ASC); + public Example orderByAsc(String... fields) { + orderBy = new OrderBy(Arrays.asList(fields), Order.ASC); return this; } - public Example orderByDesc(String... properties) { - orderBy = new OrderBy(Arrays.asList(properties), Order.DESC); + public Example orderByDesc(String... fields) { + orderBy = new OrderBy(Arrays.asList(fields), Order.DESC); return this; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index 33487582..c0e004fd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -37,10 +37,10 @@ public class UnionExample extends Example { } @Override - public void select(List properties) { + public void select(List fields) { if (examples != null && !examples.isEmpty()) { for (Example example : examples) { - example.select(properties); + example.select(fields); } } } -- Gitee From 5df5a0b9195139df7385c663cbb87fc2d16aaec6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Jan 2024 17:33:53 +0800 Subject: [PATCH 086/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E6=94=AF=E6=8C=81=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BC=A0=E9=80=92=E5=92=8C=E4=BA=8B=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8E=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-event/pom.xml | 4 + .../{Listener.java => EntityListener.java} | 15 ++- ...Listener.java => EntityEventListener.java} | 13 +-- .../config/DoriveEventConfiguration.java | 8 +- .../EntityEvent.java} | 51 +++-------- .../event/entity/EntityListenerDef.java | 45 +++++++++ .../dorive/event/entity/OperationType.java | 25 +++++ .../impl/EntityEventListenerAdapter.java | 91 +++++++++++++++++++ ...stener.java => ExecutorEventListener.java} | 73 +++++++++++---- pom.xml | 5 + 10 files changed, 258 insertions(+), 72 deletions(-) rename dorive-event/src/main/java/com/gitee/dorive/event/annotation/{Listener.java => EntityListener.java} (73%) rename dorive-event/src/main/java/com/gitee/dorive/event/api/{EntityListener.java => EntityEventListener.java} (65%) rename dorive-event/src/main/java/com/gitee/dorive/event/{impl/DefaultEntityListener.java => entity/EntityEvent.java} (37%) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java rename dorive-event/src/main/java/com/gitee/dorive/event/impl/{ExecutorListener.java => ExecutorEventListener.java} (39%) diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 226ec501..42a09b4c 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -15,5 +15,9 @@ dorive-core ${project.version} + + org.springframework + spring-tx + \ No newline at end of file diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/Listener.java b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java similarity index 73% rename from dorive-event/src/main/java/com/gitee/dorive/event/annotation/Listener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java index 7f0e2a17..249fae23 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/Listener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java @@ -17,6 +17,7 @@ package com.gitee.dorive.event.annotation; +import com.gitee.dorive.event.entity.OperationType; import org.springframework.stereotype.Component; import java.lang.annotation.Documented; @@ -26,11 +27,23 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import static com.gitee.dorive.event.entity.OperationType.DELETE; +import static com.gitee.dorive.event.entity.OperationType.INSERT; +import static com.gitee.dorive.event.entity.OperationType.UPDATE; + @Component @Inherited @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -public @interface Listener { +public @interface EntityListener { + Class value(); + + OperationType[] subscribeTo() default {INSERT, UPDATE, DELETE}; + + boolean afterCommit() default false; + + Class[] rollbackFor() default {}; + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java similarity index 65% rename from dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java index 1b64270e..fb6116ce 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java @@ -17,17 +17,10 @@ package com.gitee.dorive.event.api; -import com.gitee.dorive.event.annotation.Listener; -import com.gitee.dorive.event.entity.ExecutorEvent; -import org.springframework.core.annotation.AnnotationUtils; +import com.gitee.dorive.event.entity.EntityEvent; -public interface EntityListener { +public interface EntityEventListener { - default Class subscribe() { - Listener listener = AnnotationUtils.getAnnotation(this.getClass(), Listener.class); - return listener != null ? listener.value() : null; - } - - void onApplicationEvent(ExecutorEvent executorEvent); + void onEntityEvent(EntityEvent entityEvent); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java index bf15d947..722cbf93 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.config; -import com.gitee.dorive.event.impl.ExecutorListener; +import com.gitee.dorive.event.impl.ExecutorEventListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -26,9 +26,9 @@ import org.springframework.core.annotation.Order; @Configuration public class DoriveEventConfiguration { - @Bean("executorListenerV3") - public ExecutorListener executorListener() { - return new ExecutorListener(); + @Bean("executorEventListenerV3") + public ExecutorEventListener executorEventListener() { + return new ExecutorEventListener(); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java similarity index 37% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java index cf3e2786..1c080e1b 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/DefaultEntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java @@ -15,44 +15,19 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.entity; -import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Update; -import com.gitee.dorive.event.api.EntityListener; -import com.gitee.dorive.event.entity.ExecutorEvent; - -public abstract class DefaultEntityListener implements EntityListener { - - public enum OperationType {UNKNOWN, INSERT, UPDATE, DELETE,} - - @Override - public Class subscribe() { - return ReflectUtils.getFirstArgumentType(this.getClass()); - } - - @Override - @SuppressWarnings("unchecked") - public void onApplicationEvent(ExecutorEvent executorEvent) { - Context context = executorEvent.getContext(); - Operation operation = executorEvent.getOperation(); - OperationType operationType = OperationType.UNKNOWN; - if (operation instanceof Insert) { - operationType = OperationType.INSERT; - - } else if (operation instanceof Update) { - operationType = OperationType.UPDATE; - - } else if (operation instanceof Delete) { - operationType = OperationType.DELETE; - } - onExecution(context, operationType, (E) operation.getEntity()); - } - - protected abstract void onExecution(Context context, OperationType operationType, E entity); - +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EntityEvent { + private ExecutorEvent executorEvent; + private Context context; + private OperationType operationType; + private Object entity; } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java new file mode 100644 index 00000000..c87d14ca --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.annotation.EntityListener; +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 EntityListenerDef { + + private Class value; + private OperationType[] subscribeTo; + private boolean afterCommit; + 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; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java new file mode 100644 index 00000000..a4f85947 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +public enum OperationType { + UNKNOWN, + INSERT, + UPDATE, + DELETE, +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java new file mode 100644 index 00000000..f93ad7ff --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.entity.EntityEvent; +import com.gitee.dorive.event.entity.EntityListenerDef; +import com.gitee.dorive.event.entity.OperationType; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +@Data +@Slf4j +@NoArgsConstructor +@AllArgsConstructor +public class EntityEventListenerAdapter implements EntityEventListener { + + private EntityListenerDef entityListenerDef; + private EntityEventListener entityEventListener; + private Integer order; + + @Override + public void onEntityEvent(EntityEvent entityEvent) { + OperationType[] subscribeTo = entityListenerDef.getSubscribeTo(); + boolean isSubscribe = ArrayUtil.contains(subscribeTo, entityEvent.getOperationType()); + if (isSubscribe) { + boolean afterCommit = entityListenerDef.isAfterCommit(); + if (afterCommit && TransactionSynchronizationManager.isActualTransactionActive()) { + onEntityEventWhenTxActive(entityEvent); + } else { + doOnEntityEvent(entityEvent, entityListenerDef.getRollbackFor()); + } + } + } + + private void onEntityEventWhenTxActive(EntityEvent entityEvent) { + try { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public int getOrder() { + return order; + } + + @Override + public void afterCommit() { + doOnEntityEvent(entityEvent, null); + } + }); + } catch (Exception e) { + log.error("Transaction registration failed: " + e.getMessage(), e); + } + } + + private void doOnEntityEvent(EntityEvent entityEvent, Class[] rollbackFor) { + try { + entityEventListener.onEntityEvent(entityEvent); + + } catch (Throwable t) { + if (rollbackFor != null && rollbackFor.length > 0) { + Class throwType = t.getClass(); + for (Class rollbackType : rollbackFor) { + if (rollbackType.isAssignableFrom(throwType)) { + throw t; + } + } + } + log.error("Exception occurred in entity event listening!", t); + } + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java similarity index 39% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index dd0408f1..46fb5735 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -18,8 +18,16 @@ package com.gitee.dorive.event.impl; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.event.api.EntityListener; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.Delete; +import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.entity.EntityEvent; +import com.gitee.dorive.event.entity.EntityListenerDef; import com.gitee.dorive.event.entity.ExecutorEvent; +import com.gitee.dorive.event.entity.OperationType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; @@ -27,17 +35,20 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.core.annotation.OrderUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import static org.springframework.core.Ordered.LOWEST_PRECEDENCE; + @Slf4j -public class ExecutorListener implements ApplicationListener, ApplicationContextAware, InitializingBean { +public class ExecutorEventListener implements ApplicationListener, ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; - private final Map, List> classEventListenersMap = new ConcurrentHashMap<>(); + private final Map, List> classEntityEventListenersMap = new ConcurrentHashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { @@ -46,15 +57,25 @@ public class ExecutorListener implements ApplicationListener, App @Override public void afterPropertiesSet() { - Map entityListenerMap = applicationContext.getBeansOfType(EntityListener.class); - List entityListeners = new ArrayList<>(entityListenerMap.values()); - entityListeners.sort(new AnnotationAwareOrderComparator()); - for (EntityListener entityListener : entityListeners) { - Class entityClass = entityListener.subscribe(); - if (entityClass != null) { - List existEntityListeners = classEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); - existEntityListeners.add(entityListener); + Map entityEventListenerMap = applicationContext.getBeansOfType(EntityEventListener.class); + List entityEventListeners = new ArrayList<>(entityEventListenerMap.values()); + entityEventListeners.sort(new AnnotationAwareOrderComparator()); + + for (EntityEventListener entityEventListener : entityEventListeners) { + EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(entityEventListener.getClass()); + if (entityListenerDef == null) { + continue; + } + Class entityClass = entityListenerDef.getValue(); + if (entityClass == null) { + continue; } + if (!(entityEventListener instanceof EntityEventListenerAdapter)) { + Integer order = OrderUtils.getOrder(entityEventListener.getClass(), LOWEST_PRECEDENCE); + entityEventListener = new EntityEventListenerAdapter(entityListenerDef, entityEventListener, order); + } + List existEntityEventListeners = classEntityEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); + existEntityEventListeners.add(entityEventListener); } } @@ -63,16 +84,30 @@ public class ExecutorListener implements ApplicationListener, App EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); EntityEle entityEle = eventExecutor.getEntityEle(); Class entityClass = entityEle.getGenericType(); - List entityListeners = classEventListenersMap.get(entityClass); - if (entityListeners != null && !entityListeners.isEmpty()) { - for (EntityListener entityListener : entityListeners) { - try { - entityListener.onApplicationEvent(executorEvent); - } catch (Exception e) { - log.error("Exception occurred in event listening!", e); - } + List entityEventListeners = classEntityEventListenersMap.get(entityClass); + if (entityEventListeners != null && !entityEventListeners.isEmpty()) { + EntityEvent entityEvent = newEntityEvent(executorEvent); + for (EntityEventListener entityEventListener : entityEventListeners) { + entityEventListener.onEntityEvent(entityEvent); } } } + private EntityEvent newEntityEvent(ExecutorEvent executorEvent) { + Context context = executorEvent.getContext(); + Operation operation = executorEvent.getOperation(); + OperationType operationType = OperationType.UNKNOWN; + if (operation instanceof Insert) { + operationType = OperationType.INSERT; + + } else if (operation instanceof Update) { + operationType = OperationType.UPDATE; + + } else if (operation instanceof Delete) { + operationType = OperationType.DELETE; + } + Object entity = operation.getEntity(); + return new EntityEvent(executorEvent, context, operationType, entity); + } + } diff --git a/pom.xml b/pom.xml index f0447f0a..c223ef9a 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,11 @@ spring-boot-starter-web 2.7.8 + + org.springframework + spring-tx + 5.3.9 + org.projectlombok lombok -- Gitee From e867c7d26e2dce089747f9a01b7383ebe4a5f3cd Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Jan 2024 17:39:07 +0800 Subject: [PATCH 087/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E6=94=AF=E6=8C=81=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BC=A0=E9=80=92=E5=92=8C=E4=BA=8B=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8E=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/event/impl/ExecutorEventListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 46fb5735..a4e9f0c9 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -59,7 +59,7 @@ public class ExecutorEventListener implements ApplicationListener public void afterPropertiesSet() { Map entityEventListenerMap = applicationContext.getBeansOfType(EntityEventListener.class); List entityEventListeners = new ArrayList<>(entityEventListenerMap.values()); - entityEventListeners.sort(new AnnotationAwareOrderComparator()); + AnnotationAwareOrderComparator.sort(entityEventListeners); for (EntityEventListener entityEventListener : entityEventListeners) { EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(entityEventListener.getClass()); -- Gitee From 8fe9836637507e0ca281c877a0ce7b47abc8d41e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Jan 2024 17:51:48 +0800 Subject: [PATCH 088/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E6=94=AF=E6=8C=81=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BC=A0=E9=80=92=E5=92=8C=E4=BA=8B=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8E=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/event/impl/EntityEventListenerAdapter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index f93ad7ff..2aab8e89 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -75,16 +75,16 @@ public class EntityEventListenerAdapter implements EntityEventListener { try { entityEventListener.onEntityEvent(entityEvent); - } catch (Throwable t) { + } catch (Throwable throwable) { if (rollbackFor != null && rollbackFor.length > 0) { - Class throwType = t.getClass(); + Class throwType = throwable.getClass(); for (Class rollbackType : rollbackFor) { if (rollbackType.isAssignableFrom(throwType)) { - throw t; + throw throwable; } } } - log.error("Exception occurred in entity event listening!", t); + log.error("Exception occurred in entity event listening!", throwable); } } -- Gitee From ce6c27e3c1f3d5948551eba2e3bf198984443a77 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Jan 2024 17:52:27 +0800 Subject: [PATCH 089/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E6=94=AF=E6=8C=81=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BC=A0=E9=80=92=E5=92=8C=E4=BA=8B=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=90=8E=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/impl/EntityEventListenerAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 2aab8e89..8a41d213 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -77,9 +77,9 @@ public class EntityEventListenerAdapter implements EntityEventListener { } catch (Throwable throwable) { if (rollbackFor != null && rollbackFor.length > 0) { - Class throwType = throwable.getClass(); + Class throwableType = throwable.getClass(); for (Class rollbackType : rollbackFor) { - if (rollbackType.isAssignableFrom(throwType)) { + if (rollbackType.isAssignableFrom(throwableType)) { throw throwable; } } -- Gitee From 0b72df487c152b6d194f39b4318a1f24349b8bce Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 09:47:59 +0800 Subject: [PATCH 090/146] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E5=99=A8=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/impl/ExecutorEventListener.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index a4e9f0c9..1509d684 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -70,8 +70,14 @@ public class ExecutorEventListener implements ApplicationListener if (entityClass == null) { continue; } - if (!(entityEventListener instanceof EntityEventListenerAdapter)) { - Integer order = OrderUtils.getOrder(entityEventListener.getClass(), LOWEST_PRECEDENCE); + Integer order = OrderUtils.getOrder(entityEventListener.getClass(), LOWEST_PRECEDENCE); + if (entityEventListener instanceof EntityEventListenerAdapter) { + EntityEventListenerAdapter entityEventListenerAdapter = (EntityEventListenerAdapter) entityEventListener; + entityEventListenerAdapter.setEntityListenerDef(entityListenerDef); +// entityEventListenerAdapter.setEntityEventListener(null); + entityEventListenerAdapter.setOrder(order); + + } else { entityEventListener = new EntityEventListenerAdapter(entityListenerDef, entityEventListener, order); } List existEntityEventListeners = classEntityEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); -- Gitee From c377972ff96510ddd2171bfc2f23ab702ba9199c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 09:54:10 +0800 Subject: [PATCH 091/146] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E5=99=A8=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/event/impl/EntityEventListenerAdapter.java | 2 +- .../gitee/dorive/event/impl/ExecutorEventListener.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 8a41d213..4e199ed2 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -35,9 +35,9 @@ import org.springframework.transaction.support.TransactionSynchronizationManager @AllArgsConstructor public class EntityEventListenerAdapter implements EntityEventListener { + private Integer order; private EntityListenerDef entityListenerDef; private EntityEventListener entityEventListener; - private Integer order; @Override public void onEntityEvent(EntityEvent entityEvent) { diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 1509d684..e31dd57f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -62,7 +62,9 @@ public class ExecutorEventListener implements ApplicationListener AnnotationAwareOrderComparator.sort(entityEventListeners); for (EntityEventListener entityEventListener : entityEventListeners) { - EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(entityEventListener.getClass()); + Class listenerType = entityEventListener.getClass(); + Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); + EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); if (entityListenerDef == null) { continue; } @@ -70,15 +72,13 @@ public class ExecutorEventListener implements ApplicationListener if (entityClass == null) { continue; } - Integer order = OrderUtils.getOrder(entityEventListener.getClass(), LOWEST_PRECEDENCE); if (entityEventListener instanceof EntityEventListenerAdapter) { EntityEventListenerAdapter entityEventListenerAdapter = (EntityEventListenerAdapter) entityEventListener; - entityEventListenerAdapter.setEntityListenerDef(entityListenerDef); -// entityEventListenerAdapter.setEntityEventListener(null); entityEventListenerAdapter.setOrder(order); + entityEventListenerAdapter.setEntityListenerDef(entityListenerDef); } else { - entityEventListener = new EntityEventListenerAdapter(entityListenerDef, entityEventListener, order); + entityEventListener = new EntityEventListenerAdapter(order, entityListenerDef, entityEventListener); } List existEntityEventListeners = classEntityEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); existEntityEventListeners.add(entityEventListener); -- Gitee From 3e93e870a027aae23cc3b1f1851ea1c91dc103ce Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 10:53:56 +0800 Subject: [PATCH 092/146] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E9=80=82=E9=85=8D=E5=99=A8=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/EntityEventListenerAdapter.java | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 4e199ed2..dae9ff03 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -26,6 +26,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.Ordered; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -44,48 +45,65 @@ public class EntityEventListenerAdapter implements EntityEventListener { OperationType[] subscribeTo = entityListenerDef.getSubscribeTo(); boolean isSubscribe = ArrayUtil.contains(subscribeTo, entityEvent.getOperationType()); if (isSubscribe) { - boolean afterCommit = entityListenerDef.isAfterCommit(); - if (afterCommit && TransactionSynchronizationManager.isActualTransactionActive()) { - onEntityEventWhenTxActive(entityEvent); - } else { + boolean isTxActive = entityListenerDef.isAfterCommit() && TransactionSynchronizationManager.isActualTransactionActive(); + if (!isTxActive) { doOnEntityEvent(entityEvent, entityListenerDef.getRollbackFor()); + } else { + onEntityEventWhenTxActive(entityEvent); } } } - private void onEntityEventWhenTxActive(EntityEvent entityEvent) { + private void doOnEntityEvent(EntityEvent entityEvent, Class[] rollbackFor) { try { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public int getOrder() { - return order; - } + entityEventListener.onEntityEvent(entityEvent); + } catch (Throwable throwable) { + if (determineThrowException(throwable, rollbackFor)) { + throw throwable; + } + log.error("Exception occurred in entity event listening!", throwable); + } + } - @Override - public void afterCommit() { - doOnEntityEvent(entityEvent, null); + private boolean determineThrowException(Throwable throwable, Class[] rollbackFor) { + if (rollbackFor != null && rollbackFor.length > 0) { + Class throwableType = throwable.getClass(); + for (Class rollbackType : rollbackFor) { + if (rollbackType.isAssignableFrom(throwableType)) { + return true; } - }); + } + } + return false; + } + + private void onEntityEventWhenTxActive(EntityEvent entityEvent) { + try { + TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); } catch (Exception e) { log.error("Transaction registration failed: " + e.getMessage(), e); } } - private void doOnEntityEvent(EntityEvent entityEvent, Class[] rollbackFor) { - try { - entityEventListener.onEntityEvent(entityEvent); + /** + * 实现Ordered接口,是为了兼容spring-boot的2.3.2版本与2.7.8版本 + */ + @Data + @AllArgsConstructor + private class TransactionInvoker implements TransactionSynchronization, Ordered { - } catch (Throwable throwable) { - if (rollbackFor != null && rollbackFor.length > 0) { - Class throwableType = throwable.getClass(); - for (Class rollbackType : rollbackFor) { - if (rollbackType.isAssignableFrom(throwableType)) { - throw throwable; - } - } - } - log.error("Exception occurred in entity event listening!", throwable); + private EntityEvent entityEvent; + + @Override + public int getOrder() { + return order; } + + @Override + public void afterCommit() { + doOnEntityEvent(entityEvent, null); + } + } } -- Gitee From f84bcc8d8ae07a44f76b5567665594eb72f8be20 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 11:24:23 +0800 Subject: [PATCH 093/146] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E4=BA=92=E7=9B=B8=E8=A2=AB=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/impl/EntityEventListenerAdapter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index dae9ff03..c0b5c83f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -79,7 +79,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { private void onEntityEventWhenTxActive(EntityEvent entityEvent) { try { - TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); + TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(this, entityEvent)); } catch (Exception e) { log.error("Transaction registration failed: " + e.getMessage(), e); } @@ -92,6 +92,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @AllArgsConstructor private class TransactionInvoker implements TransactionSynchronization, Ordered { + private EntityEventListenerAdapter adapter; private EntityEvent entityEvent; @Override -- Gitee From b2c5b670ca7021daf9dd914d640c160c7284faeb Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 12:19:23 +0800 Subject: [PATCH 094/146] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E4=BA=92=E7=9B=B8=E8=A2=AB=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/impl/EntityEventListenerAdapter.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index c0b5c83f..7b75e3aa 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -79,7 +79,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { private void onEntityEventWhenTxActive(EntityEvent entityEvent) { try { - TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(this, entityEvent)); + TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); } catch (Exception e) { log.error("Transaction registration failed: " + e.getMessage(), e); } @@ -88,12 +88,10 @@ public class EntityEventListenerAdapter implements EntityEventListener { /** * 实现Ordered接口,是为了兼容spring-boot的2.3.2版本与2.7.8版本 */ - @Data @AllArgsConstructor private class TransactionInvoker implements TransactionSynchronization, Ordered { - private EntityEventListenerAdapter adapter; - private EntityEvent entityEvent; + private final EntityEvent entityEvent; @Override public int getOrder() { -- Gitee From 133badf77d8375d3a72dcd06105339edc582002f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 12:46:47 +0800 Subject: [PATCH 095/146] =?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/event/impl/EntityEventListenerAdapter.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 7b75e3aa..9a1ec912 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -21,7 +21,6 @@ import cn.hutool.core.util.ArrayUtil; import com.gitee.dorive.event.api.EntityEventListener; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; -import com.gitee.dorive.event.entity.OperationType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -42,8 +41,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @Override public void onEntityEvent(EntityEvent entityEvent) { - OperationType[] subscribeTo = entityListenerDef.getSubscribeTo(); - boolean isSubscribe = ArrayUtil.contains(subscribeTo, entityEvent.getOperationType()); + boolean isSubscribe = ArrayUtil.contains(entityListenerDef.getSubscribeTo(), entityEvent.getOperationType()); if (isSubscribe) { boolean isTxActive = entityListenerDef.isAfterCommit() && TransactionSynchronizationManager.isActualTransactionActive(); if (!isTxActive) { -- Gitee From 65f6c67a7e45d132ea2e5caaf0913a53ce11f6d9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 13:01:26 +0800 Subject: [PATCH 096/146] =?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 --- .../event/impl/EntityEventListenerAdapter.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 9a1ec912..02d08d32 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -45,25 +45,26 @@ public class EntityEventListenerAdapter implements EntityEventListener { if (isSubscribe) { boolean isTxActive = entityListenerDef.isAfterCommit() && TransactionSynchronizationManager.isActualTransactionActive(); if (!isTxActive) { - doOnEntityEvent(entityEvent, entityListenerDef.getRollbackFor()); + handleEntityEvent(entityEvent, true); } else { - onEntityEventWhenTxActive(entityEvent); + handleEntityEventWhenTxActive(entityEvent); } } } - private void doOnEntityEvent(EntityEvent entityEvent, Class[] rollbackFor) { + private void handleEntityEvent(EntityEvent entityEvent, boolean canRollback) { try { entityEventListener.onEntityEvent(entityEvent); } catch (Throwable throwable) { - if (determineThrowException(throwable, rollbackFor)) { + if (canRollback && matchException(throwable)) { throw throwable; } log.error("Exception occurred in entity event listening!", throwable); } } - private boolean determineThrowException(Throwable throwable, Class[] rollbackFor) { + private boolean matchException(Throwable throwable) { + Class[] rollbackFor = entityListenerDef.getRollbackFor(); if (rollbackFor != null && rollbackFor.length > 0) { Class throwableType = throwable.getClass(); for (Class rollbackType : rollbackFor) { @@ -75,7 +76,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { return false; } - private void onEntityEventWhenTxActive(EntityEvent entityEvent) { + private void handleEntityEventWhenTxActive(EntityEvent entityEvent) { try { TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); } catch (Exception e) { @@ -98,7 +99,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @Override public void afterCommit() { - doOnEntityEvent(entityEvent, null); + handleEntityEvent(entityEvent, false); } } -- Gitee From 6e6e95d427ad45878aacd42c4d717ec82b67e597 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Jan 2024 13:05:50 +0800 Subject: [PATCH 097/146] =?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/event/impl/EntityEventListenerAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java index 02d08d32..a403fe55 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java @@ -56,14 +56,14 @@ public class EntityEventListenerAdapter implements EntityEventListener { try { entityEventListener.onEntityEvent(entityEvent); } catch (Throwable throwable) { - if (canRollback && matchException(throwable)) { + if (canRollback && matchRollbackFor(throwable)) { throw throwable; } log.error("Exception occurred in entity event listening!", throwable); } } - private boolean matchException(Throwable throwable) { + private boolean matchRollbackFor(Throwable throwable) { Class[] rollbackFor = entityListenerDef.getRollbackFor(); if (rollbackFor != null && rollbackFor.length > 0) { Class throwableType = throwable.getClass(); -- Gitee From f3dd207eba517f5a8805c6da31131a7e60f553ea Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Jan 2024 18:37:41 +0800 Subject: [PATCH 098/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/operation/Condition.java | 4 +- .../dorive/core/entity/operation/Delete.java | 6 +- .../dorive/core/entity/operation/Insert.java | 6 +- .../core/entity/operation/InsertOrUpdate.java | 31 +++ .../core/entity/operation/Operation.java | 42 ++-- .../dorive/core/entity/operation/Query.java | 6 +- .../dorive/core/entity/operation/Update.java | 6 +- .../core/impl/executor/ContextExecutor.java | 210 ++++++++++++------ .../core/impl/factory/OperationFactory.java | 20 -- .../repository/AbstractGenericRepository.java | 3 +- .../dorive/core/util/CollectionUtils.java | 35 +++ 11 files changed, 227 insertions(+), 142 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java index 5a3db03d..d16fd4b4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java @@ -28,8 +28,8 @@ public class Condition extends Operation { private Object primaryKey; private Example example; - public Condition(int type, Object entity) { - super(type, entity); + public Condition(Object entity) { + super(entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java index f48708d4..5731ab56 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java @@ -24,12 +24,8 @@ import lombok.Setter; @Setter public class Delete extends Condition { - public Delete(int type, Object entity) { - super(type, entity); - } - public Delete(Object entity) { - super(Type.DELETE, entity); + super(entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java index daa71309..60a5e0c1 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java @@ -24,12 +24,8 @@ import lombok.Setter; @Setter public class Insert extends Operation { - public Insert(int type, Object entity) { - super(type, entity); - } - public Insert(Object entity) { - super(Type.INSERT, entity); + super(entity); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java new file mode 100644 index 00000000..70d02527 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class InsertOrUpdate extends Operation { + + public InsertOrUpdate(Object entity) { + super(entity); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index eee15720..350d824c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -22,51 +22,37 @@ import lombok.Data; @Data public class Operation { - public interface Type { - int NONE = 0x00000000; - int SELECT = 0x00000001; - int INSERT = 0x00000002; - int UPDATE = 0x00000004; - int INSERT_OR_UPDATE = INSERT | UPDATE; - int DELETE = 0x00000008; - int UPDATE_OR_DELETE = UPDATE | DELETE; - int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; - int FORCE_INSERT = 0x00000010 | INSERT; - } - public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT,} - private int type; - private Object entity; private RootControl rootControl = RootControl.NONE; + private Object entity; - public Operation(int type, Object entity) { - this.type = type; + public Operation(Object entity) { this.entity = entity; } - public boolean isInsertContext() { - return (type & Type.INSERT) != 0; - } - - public boolean isForceInsert() { - return type == Type.FORCE_INSERT; - } - public void includeRoot() { rootControl = RootControl.INCLUDE_ROOT; } - public boolean isIncludeRoot() { - return rootControl == RootControl.INCLUDE_ROOT; - } - public void ignoreRoot() { rootControl = RootControl.IGNORE_ROOT; } + public boolean isIncludeRoot() { + return rootControl == RootControl.INCLUDE_ROOT; + } + public boolean isIgnoreRoot() { return rootControl == RootControl.IGNORE_ROOT; } + public void switchRoot(boolean flag) { + if (flag) { + includeRoot(); + } else { + ignoreRoot(); + } + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java index 80b5b176..3697b6d2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java @@ -24,12 +24,8 @@ import lombok.Setter; @Setter public class Query extends Condition { - public Query(int type, Object entity) { - super(type, entity); - } - public Query(Object entity) { - super(Type.SELECT, entity); + super(entity); } public boolean isEmpty() { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java index dbc6546c..c9240bb4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java @@ -29,12 +29,8 @@ public class Update extends Condition { private Set nullableFields = Collections.emptySet(); - public Update(int type, Object entity) { - super(type, entity); - } - public Update(Object entity) { - super(Type.UPDATE, entity); + super(entity); } } 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 b5187603..50c3a625 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 @@ -24,17 +24,21 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.Delete; +import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.util.CollectionUtils; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Collection; -import java.util.Collections; import java.util.List; @Data @@ -77,12 +81,6 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { @Override public int execute(Context context, Operation operation) { - Selector selector = context.getSelector(); - - boolean isInsertContext = operation.isInsertContext(); - boolean isIncludeRoot = operation.isIncludeRoot(); - boolean isIgnoreRoot = operation.isIgnoreRoot(); - Object rootEntity = operation.getEntity(); Assert.notNull(rootEntity, "The root entity cannot be null!"); @@ -90,76 +88,159 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { AbstractContextRepository delegateRepository = derivedResolver.deriveRepository(rootEntity); delegateRepository = delegateRepository == null ? repository : delegateRepository; + if (operation instanceof Insert) { + return executeInsert(context, operation, delegateRepository); + + } else if (operation instanceof Update || operation instanceof Delete) { + return executeUpdateOrDelete(context, operation, delegateRepository); + + } else if (operation instanceof InsertOrUpdate) { + return executeInsertOrUpdate(context, operation, delegateRepository); + } + return 0; + } + + private int executeInsert(Context context, Operation operation, AbstractContextRepository delegateRepository) { + Selector selector = context.getSelector(); + Object rootEntity = operation.getEntity(); int totalCount = 0; for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { - boolean isRoot = repository.isRoot(); - if (isIgnoreRoot && isRoot) { - continue; + if (repository.isRoot()) { + if (!operation.isIgnoreRoot()) { + if (selector.matches(context, repository) || operation.isIncludeRoot()) { + getBoundValue(context, rootEntity, repository, rootEntity); + totalCount += repository.execute(context, operation); + setBoundId(context, rootEntity, repository, rootEntity); + } + } + } else { + boolean isMatch = selector.matches(context, repository); + boolean isAggregated = repository.isAggregated(); + if (isMatch || isAggregated) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + OperationFactory operationFactory = repository.getOperationFactory(); + Collection collection = CollectionUtils.toCollection(targetEntity); + for (Object entity : collection) { + Operation newOperation = operationFactory.buildInsert(entity); + if (isMatch) { + getBoundValue(context, rootEntity, repository, entity); + newOperation.includeRoot(); + } else { + newOperation.ignoreRoot(); + } + totalCount += repository.execute(context, newOperation); + } + if (collection.size() == 1) { + setBoundId(context, rootEntity, repository, collection.iterator().next()); + } + } } + } + return totalCount; + } - boolean isMatch = selector.matches(context, repository) || (isIncludeRoot && isRoot); - boolean isAggregated = repository.isAggregated(); - if (!isMatch && !isAggregated) { - continue; + private int executeUpdateOrDelete(Context context, Operation operation, AbstractContextRepository delegateRepository) { + Selector selector = context.getSelector(); + Object rootEntity = operation.getEntity(); + int totalCount = 0; + if (!operation.isIgnoreRoot()) { + CommonRepository rootRepository = delegateRepository.getRootRepository(); + if (selector.matches(context, rootRepository) || operation.isIncludeRoot()) { + Object primaryKey = rootRepository.getPrimaryKey(rootEntity); + if (primaryKey != null) { + totalCount += rootRepository.execute(context, operation); + } } - - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = isRoot ? rootEntity : anchorPoint.getValue(rootEntity); - if (targetEntity != null) { - Collection collection; - if (targetEntity instanceof Collection) { - collection = (Collection) targetEntity; - } else { - collection = Collections.singletonList(targetEntity); + } + for (CommonRepository subRepository : delegateRepository.getSubRepositories()) { + boolean isMatch = selector.matches(context, subRepository); + boolean isAggregated = subRepository.isAggregated(); + if (isMatch || isAggregated) { + PropChain anchorPoint = subRepository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; } + OperationFactory operationFactory = subRepository.getOperationFactory(); + Collection collection = CollectionUtils.toCollection(targetEntity); for (Object entity : collection) { - int operationType = Operation.Type.NONE; - boolean operable = false; - if (isMatch) { - operationType = determineType(operation, repository, entity); - operable = (operationType & Operation.Type.INSERT_OR_UPDATE_OR_DELETE) != 0; - if ((operationType & Operation.Type.INSERT) != 0) { - getBoundValue(context, rootEntity, repository, entity); - } + Operation newOperation = null; + Object primaryKey = subRepository.getPrimaryKey(entity); + if (isMatch && primaryKey != null) { + newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); + newOperation.includeRoot(); + + } else if (isAggregated) { + newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); + newOperation.ignoreRoot(); } - if (isAggregated) { - OperationFactory operationFactory = repository.getOperationFactory(); - Operation newOperation = operationFactory.renewOperation(operation, entity); - if (newOperation != null) { - if (operable) { - newOperation.includeRoot(); - } else { - newOperation.ignoreRoot(); - } - totalCount += repository.execute(context, newOperation); - } + if (newOperation != null) { + totalCount += subRepository.execute(context, newOperation); + } + } + } + } + return totalCount; + } - } else if (operable) { - if (isRoot && operation.getType() == operationType) { - totalCount += repository.execute(context, operation); + private int executeInsertOrUpdate(Context context, Operation operation, AbstractContextRepository delegateRepository) { + Selector selector = context.getSelector(); + Object rootEntity = operation.getEntity(); + int totalCount = 0; + for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { + OperationFactory operationFactory = repository.getOperationFactory(); + if (repository.isRoot()) { + if (!operation.isIgnoreRoot()) { + if (selector.matches(context, repository) || operation.isIncludeRoot()) { + Operation newOperation = operationFactory.buildInsertOrUpdate(rootEntity); + if (newOperation instanceof Insert) { + getBoundValue(context, rootEntity, repository, rootEntity); + totalCount += repository.execute(context, newOperation); + setBoundId(context, rootEntity, repository, rootEntity); } else { - totalCount += doExecute(context, repository, entity, operationType); + totalCount += repository.execute(context, newOperation); } } } - if (isInsertContext && collection.size() == 1) { - setBoundId(context, rootEntity, repository, targetEntity); + } else { + boolean isMatch = selector.matches(context, repository); + boolean isAggregated = repository.isAggregated(); + if (isMatch || isAggregated) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + Collection collection = CollectionUtils.toCollection(targetEntity); + Object onlyOne = collection.size() == 1 ? collection.iterator().next() : null; + boolean isOnlyOneInsert = onlyOne != null && repository.getPrimaryKey(onlyOne) == null; + for (Object entity : collection) { + Operation newOperation; + Object primaryKey = repository.getPrimaryKey(entity); + if (isMatch && primaryKey == null) { + getBoundValue(context, rootEntity, repository, entity); + } + if (isAggregated) { + newOperation = new InsertOrUpdate(entity); + } else { + newOperation = primaryKey == null ? operationFactory.buildInsert(entity) : operationFactory.buildUpdate(entity); + } + newOperation.switchRoot(isMatch); + totalCount += repository.execute(context, newOperation); + } + if (isOnlyOneInsert) { + setBoundId(context, rootEntity, repository, onlyOne); + } } } } return totalCount; } - private int determineType(Operation operation, CommonRepository repository, Object entity) { - if (operation.isForceInsert()) { - return Operation.Type.INSERT; - } - int type = operation.getType(); - Object primaryKey = repository.getPrimaryKey(entity); - int operationType = primaryKey == null ? Operation.Type.INSERT : Operation.Type.UPDATE_OR_DELETE; - return type & operationType; - } - private void getBoundValue(Context context, Object rootEntity, CommonRepository repository, Object entity) { for (Binder binder : repository.getBinderResolver().getBoundValueBinders()) { Object fieldValue = binder.getFieldValue(context, entity); @@ -172,19 +253,6 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } } - private int doExecute(Context context, CommonRepository repository, Object entity, int operationType) { - if (operationType == Operation.Type.INSERT) { - return repository.insert(context, entity); - - } else if (operationType == Operation.Type.UPDATE) { - return repository.update(context, entity); - - } else if (operationType == Operation.Type.DELETE) { - return repository.delete(context, entity); - } - return 0; - } - private void setBoundId(Context context, Object rootEntity, CommonRepository repository, Object entity) { Binder binder = repository.getBinderResolver().getBoundIdBinder(); if (binder != null) { 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 76b76472..55c97123 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 @@ -88,24 +88,4 @@ public class OperationFactory { return delete; } - public Operation renewOperation(Operation operation, Object entity) { - int type = operation.getType(); - if (type == Operation.Type.INSERT) { - return buildInsert(entity); - - } else if (type == Operation.Type.UPDATE) { - return buildUpdate(entity); - - } else if (type == Operation.Type.INSERT_OR_UPDATE) { - return new Operation(Operation.Type.INSERT_OR_UPDATE, entity); - - } else if (type == Operation.Type.DELETE) { - return buildDelete(entity); - - } else if (type == Operation.Type.FORCE_INSERT) { - return new Insert(Operation.Type.FORCE_INSERT, entity); - } - return null; - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index 3587595a..5f36ad06 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,6 +22,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.util.ExampleUtils; import lombok.Data; @@ -57,7 +58,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertOrUpdate(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new Operation(Operation.Type.INSERT_OR_UPDATE, entity); + Operation operation = new InsertOrUpdate(entity); return execute(context, operation); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java new file mode 100644 index 00000000..7ae87692 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.util; + +import java.util.Collection; +import java.util.Collections; + +public class CollectionUtils { + + public static Collection toCollection(Object object) { + Collection collection; + if (object instanceof Collection) { + collection = (Collection) object; + } else { + collection = Collections.singletonList(object); + } + return collection; + } + +} -- Gitee From 03ed14abd96d7792fa2bb2e05b1415417eb020ea Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 22 Jan 2024 11:02:21 +0800 Subject: [PATCH 099/146] =?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 --- .../core/impl/executor/ContextExecutor.java | 129 +++++++++--------- 1 file changed, 64 insertions(+), 65 deletions(-) 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 50c3a625..6840b247 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 @@ -116,27 +116,26 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } else { boolean isMatch = selector.matches(context, repository); boolean isAggregated = repository.isAggregated(); - if (isMatch || isAggregated) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - OperationFactory operationFactory = repository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { - Operation newOperation = operationFactory.buildInsert(entity); - if (isMatch) { - getBoundValue(context, rootEntity, repository, entity); - newOperation.includeRoot(); - } else { - newOperation.ignoreRoot(); - } - totalCount += repository.execute(context, newOperation); - } - if (collection.size() == 1) { - setBoundId(context, rootEntity, repository, collection.iterator().next()); + if (!isMatch && !isAggregated) { + continue; + } + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + OperationFactory operationFactory = repository.getOperationFactory(); + Collection collection = CollectionUtils.toCollection(targetEntity); + for (Object entity : collection) { + if (isMatch) { + getBoundValue(context, rootEntity, repository, entity); } + Operation newOperation = operationFactory.buildInsert(entity); + newOperation.switchRoot(isMatch); + totalCount += repository.execute(context, newOperation); + } + if (collection.size() == 1) { + setBoundId(context, rootEntity, repository, collection.iterator().next()); } } } @@ -159,28 +158,25 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { for (CommonRepository subRepository : delegateRepository.getSubRepositories()) { boolean isMatch = selector.matches(context, subRepository); boolean isAggregated = subRepository.isAggregated(); - if (isMatch || isAggregated) { - PropChain anchorPoint = subRepository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; + if (!isMatch && !isAggregated) { + continue; + } + PropChain anchorPoint = subRepository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + OperationFactory operationFactory = subRepository.getOperationFactory(); + Collection collection = CollectionUtils.toCollection(targetEntity); + for (Object entity : collection) { + Object primaryKey = subRepository.getPrimaryKey(entity); + Operation newOperation = null; + if ((isMatch && primaryKey != null) || isAggregated) { + newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); } - OperationFactory operationFactory = subRepository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { - Operation newOperation = null; - Object primaryKey = subRepository.getPrimaryKey(entity); - if (isMatch && primaryKey != null) { - newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); - newOperation.includeRoot(); - - } else if (isAggregated) { - newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); - newOperation.ignoreRoot(); - } - if (newOperation != null) { - totalCount += subRepository.execute(context, newOperation); - } + if (newOperation != null) { + newOperation.switchRoot(isMatch); + totalCount += subRepository.execute(context, newOperation); } } } @@ -209,32 +205,35 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } else { boolean isMatch = selector.matches(context, repository); boolean isAggregated = repository.isAggregated(); - if (isMatch || isAggregated) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - Collection collection = CollectionUtils.toCollection(targetEntity); - Object onlyOne = collection.size() == 1 ? collection.iterator().next() : null; - boolean isOnlyOneInsert = onlyOne != null && repository.getPrimaryKey(onlyOne) == null; - for (Object entity : collection) { - Operation newOperation; - Object primaryKey = repository.getPrimaryKey(entity); - if (isMatch && primaryKey == null) { - getBoundValue(context, rootEntity, repository, entity); - } - if (isAggregated) { - newOperation = new InsertOrUpdate(entity); - } else { - newOperation = primaryKey == null ? operationFactory.buildInsert(entity) : operationFactory.buildUpdate(entity); - } - newOperation.switchRoot(isMatch); - totalCount += repository.execute(context, newOperation); + if (!isMatch && !isAggregated) { + continue; + } + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + Collection collection = CollectionUtils.toCollection(targetEntity); + Object onlyOne = collection.size() == 1 ? collection.iterator().next() : null; + boolean isOnlyOneInsert = onlyOne != null && repository.getPrimaryKey(onlyOne) == null; + for (Object entity : collection) { + Object primaryKey = repository.getPrimaryKey(entity); + if (isMatch && primaryKey == null) { + getBoundValue(context, rootEntity, repository, entity); } - if (isOnlyOneInsert) { - setBoundId(context, rootEntity, repository, onlyOne); + Operation newOperation; + if (isAggregated) { + newOperation = new InsertOrUpdate(entity); + } else if (primaryKey == null) { + newOperation = operationFactory.buildInsert(entity); + } else { + newOperation = operationFactory.buildUpdate(entity); } + newOperation.switchRoot(isMatch); + totalCount += repository.execute(context, newOperation); + } + if (isOnlyOneInsert) { + setBoundId(context, rootEntity, repository, onlyOne); } } } -- Gitee From c62883e0432b61ab68cc7cb1d44fc3fd4d0726b7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 22 Jan 2024 11:13:37 +0800 Subject: [PATCH 100/146] =?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/core/impl/executor/ContextExecutor.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 6840b247..b3541b53 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 @@ -224,10 +224,8 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { Operation newOperation; if (isAggregated) { newOperation = new InsertOrUpdate(entity); - } else if (primaryKey == null) { - newOperation = operationFactory.buildInsert(entity); } else { - newOperation = operationFactory.buildUpdate(entity); + newOperation = primaryKey == null ? operationFactory.buildInsert(entity) : operationFactory.buildUpdate(entity); } newOperation.switchRoot(isMatch); totalCount += repository.execute(context, newOperation); -- Gitee From 3321272484e5b9bc1ed60defa042fc36f0fe8db1 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 23 Jan 2024 17:12:09 +0800 Subject: [PATCH 101/146] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=B8=8D=E5=86=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81Selector=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/context/Context.java | 11 +- .../api/context/{Node.java => Matcher.java} | 6 +- .../dorive/core/api/context/Selector.java | 13 +-- .../core/entity/context/AbstractContext.java | 13 +-- .../core/entity/context/BoundedContext.java | 8 +- .../core/entity/context/InnerContext.java | 7 +- .../{Strategy.java => NameContext.java} | 16 +-- .../context/StaticContext.java} | 37 ++++-- .../option/QueryStrategy.java} | 19 +--- .../dorive/core/entity/option/Selection.java | 25 +++++ .../{selector => context}/NameSelector.java | 30 ++--- .../SelectionMatcher.java} | 55 ++++++++- .../core/impl/executor/ContextExecutor.java | 19 ++-- .../core/impl/handler/BatchEntityHandler.java | 4 +- .../repository/AbstractContextRepository.java | 2 + .../repository/AbstractGenericRepository.java | 7 +- ....java => AbstractTransformRepository.java} | 102 ++++++++++++++++- .../core/repository/CommonRepository.java | 39 ++++--- .../ContextUtils.java} | 14 +-- .../repository/AbstractEventRepository.java | 4 +- .../repository/MybatisPlusRepository.java | 8 +- .../repository/AbstractQueryRepository.java | 11 ++ .../java/com/gitee/dorive/ref/api/Ref.java | 3 +- .../java/com/gitee/dorive/ref/api/RefObj.java | 7 -- .../dorive/ref/api/SelectorRepository.java | 106 ------------------ .../com/gitee/dorive/ref/impl/RefObjImpl.java | 26 ++--- .../ref/repository/AbstractRefRepository.java | 5 +- 27 files changed, 327 insertions(+), 270 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/api/context/{Node.java => Matcher.java} (92%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/context/{Strategy.java => NameContext.java} (76%) rename dorive-core/src/main/java/com/gitee/dorive/core/{impl/selector/EmptySelector.java => entity/context/StaticContext.java} (47%) rename dorive-core/src/main/java/com/gitee/dorive/core/{impl/selector/AllSelector.java => entity/option/QueryStrategy.java} (67%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{selector => context}/NameSelector.java (69%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{selector/RootSelector.java => context/SelectionMatcher.java} (33%) rename dorive-core/src/main/java/com/gitee/dorive/core/repository/{AbstractExampleRepository.java => AbstractTransformRepository.java} (45%) rename dorive-core/src/main/java/com/gitee/dorive/core/{impl/selector/AbstractSelector.java => util/ContextUtils.java} (72%) delete mode 100644 dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index e5029ae9..dc33fe22 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -17,16 +17,19 @@ package com.gitee.dorive.core.api.context; -import com.gitee.dorive.core.entity.context.Strategy; +import com.gitee.dorive.core.entity.context.StaticContext; +import com.gitee.dorive.core.entity.option.Selection; import java.util.Map; public interface Context { - Selector getSelector(); + Context NONE = new StaticContext(Selection.NONE); + Context ROOT = new StaticContext(Selection.ROOT); + Context ALL = new StaticContext(Selection.ALL); - Map getAttachments(); + Map, Object> getInstances(); - Strategy getStrategy(); + Map getAttachments(); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Matcher.java similarity index 92% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/context/Matcher.java index 21b24d8b..d71bd7c4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Node.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Matcher.java @@ -17,10 +17,8 @@ package com.gitee.dorive.core.api.context; -public interface Node { +public interface Matcher { - boolean isRoot(); - - String getName(); + boolean matches(Context context); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java index 96be4e7e..36c2db6f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java @@ -17,20 +17,13 @@ package com.gitee.dorive.core.api.context; -import com.gitee.dorive.core.impl.selector.AllSelector; -import com.gitee.dorive.core.impl.selector.EmptySelector; -import com.gitee.dorive.core.impl.selector.RootSelector; - import java.util.List; +import java.util.Set; public interface Selector { - Selector EMPTY = new EmptySelector(); - Selector ROOT = new RootSelector(); - Selector ALL = new AllSelector(); - - boolean matches(Context context, Node node); + Set getNames(); - List select(Context context, Node node); + List select(String name); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 6119d6a5..7018c0c4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -18,23 +18,20 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.option.Selection; import lombok.Data; -import lombok.NoArgsConstructor; import java.util.LinkedHashMap; import java.util.Map; @Data -@NoArgsConstructor public abstract class AbstractContext implements Context { - private Selector selector = Selector.EMPTY; - private Map attachments = new LinkedHashMap<>(8); - private Strategy strategy = new Strategy(); + protected Map, Object> instances = new LinkedHashMap<>(4); + protected Map attachments = new LinkedHashMap<>(8); - public AbstractContext(Selector selector) { - this.selector = selector; + public AbstractContext() { + this.instances.put(Selection.class, Selection.NONE); } public Object put(String key, Object value) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java index d33be1af..05c875c7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.context; -import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.api.context.Context; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -25,10 +25,10 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = false) -public class BoundedContext extends AbstractContext { +public class BoundedContext extends InnerContext { - public BoundedContext(Selector selector) { - super(selector); + public BoundedContext(Context anotherContext) { + super(anotherContext); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java index 004c82ec..a226acc9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.context; -import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.api.context.Context; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -27,8 +27,9 @@ import lombok.NoArgsConstructor; @EqualsAndHashCode(callSuper = false) public class InnerContext extends AbstractContext { - public InnerContext(Selector selector) { - super(selector); + public InnerContext(Context anotherContext) { + this.instances.putAll(anotherContext.getInstances()); + this.attachments.putAll(anotherContext.getAttachments()); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java similarity index 76% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java index 9d326dbf..c044a083 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/Strategy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java @@ -17,17 +17,13 @@ package com.gitee.dorive.core.entity.context; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import com.gitee.dorive.core.entity.option.Selection; +import com.gitee.dorive.core.impl.context.NameSelector; -@Data -@NoArgsConstructor -@AllArgsConstructor -public class Strategy { +public class NameContext extends StaticContext { - public enum Query {DEFAULT, SQL,} - - private Query query; + public NameContext(String... names) { + super(Selection.NAME, new NameSelector(names)); + } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java similarity index 47% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java index 5eaa5121..be4e8034 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/EmptySelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java @@ -15,20 +15,39 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.selector; +package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; -import lombok.Data; -import lombok.EqualsAndHashCode; +import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.option.Selection; -@Data -@EqualsAndHashCode(callSuper = false) -public class EmptySelector extends AbstractSelector { +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +public class StaticContext implements Context { + + private Map, Object> instances = new LinkedHashMap<>(3); + + public StaticContext(Selection selection) { + this.instances.put(Selection.class, selection); + this.instances = Collections.unmodifiableMap(this.instances); + } + + public StaticContext(Selection selection, Selector selector) { + this.instances.put(Selection.class, selection); + this.instances.put(Selector.class, selector); + this.instances = Collections.unmodifiableMap(this.instances); + } + + @Override + public Map, Object> getInstances() { + return instances; + } @Override - public boolean matches(Context context, Node node) { - return false; + public Map getAttachments() { + return Collections.emptyMap(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java similarity index 67% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java index bdca51a1..aece4c98 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AllSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java @@ -15,20 +15,9 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.selector; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = false) -public class AllSelector extends AbstractSelector { - - @Override - public boolean matches(Context context, Node node) { - return true; - } +package com.gitee.dorive.core.entity.option; +public enum QueryStrategy { + DEFAULT, + SQL } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java new file mode 100644 index 00000000..d77d2061 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.option; + +public enum Selection { + NONE, + ROOT, + ALL, + NAME +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java similarity index 69% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java index db28324e..b450bb18 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/NameSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java @@ -15,53 +15,57 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.selector; +package com.gitee.dorive.core.impl.context; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; +import com.gitee.dorive.core.api.context.Selector; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; -import org.apache.commons.lang3.StringUtils; import java.util.Collections; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; @Data @EqualsAndHashCode(callSuper = false) -public class NameSelector extends AbstractSelector { +public class NameSelector implements Selector { + private Set names = Collections.emptySet(); private Map nameDefMap = Collections.emptyMap(); public NameSelector(String... names) { if (names != null && names.length > 0) { - this.nameDefMap = new LinkedHashMap<>(names.length * 4 / 3 + 1); + int size = names.length * 4 / 3 + 1; + this.names = new LinkedHashSet<>(size); + this.nameDefMap = new LinkedHashMap<>(size); for (String name : names) { if (name.contains("(") && name.contains(")")) { String realName = name.substring(0, name.indexOf("(")); String propText = name.substring(name.indexOf("(") + 1, name.indexOf(")")); List properties = StrUtil.splitTrim(propText, ","); - nameDefMap.put(realName, new NameDef(realName, Collections.unmodifiableList(properties))); + this.names.add(realName); + this.nameDefMap.put(realName, new NameDef(realName, Collections.unmodifiableList(properties))); } else { - nameDefMap.put(name, new NameDef(name, Collections.emptyList())); + this.names.add(name); + this.nameDefMap.put(name, new NameDef(name, Collections.emptyList())); } } + this.names = Collections.unmodifiableSet(this.names); } } @Override - public boolean matches(Context context, Node node) { - String name = node.getName(); - return StringUtils.isBlank(name) || nameDefMap.containsKey(name); + public Set getNames() { + return names; } @Override - public List select(Context context, Node node) { - String name = node.getName(); + public List select(String name) { NameDef nameDef = nameDefMap.get(name); return nameDef != null && !nameDef.getProperties().isEmpty() ? nameDef.getProperties() : null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java similarity index 33% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java index 041c6814..ec38fb7b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/RootSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java @@ -15,20 +15,63 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.selector; +package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; +import com.gitee.dorive.core.api.context.Matcher; +import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.option.Selection; +import com.gitee.dorive.core.repository.CommonRepository; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +/** + * 双向依赖,在获取hashCode时,会栈溢出 + */ @Data -@EqualsAndHashCode(callSuper = false) -public class RootSelector extends AbstractSelector { +@EqualsAndHashCode(exclude = "repository") +public class SelectionMatcher implements Matcher { + + private CommonRepository repository; + private Map matcherMap = new LinkedHashMap<>(8); + + public SelectionMatcher(CommonRepository repository) { + this.repository = repository; + this.matcherMap.put(Selection.NONE, context -> false); + this.matcherMap.put(Selection.ROOT, context -> repository.isRoot()); + this.matcherMap.put(Selection.ALL, context -> true); + this.matcherMap.put(Selection.NAME, new NameMatcher()); + } @Override - public boolean matches(Context context, Node node) { - return node.isRoot(); + public boolean matches(Context context) { + Map, Object> instances = context.getInstances(); + Selection selection = (Selection) instances.get(Selection.class); + if (selection != null) { + Matcher matcher = matcherMap.get(selection); + if (matcher != null) { + return matcher.matches(context); + } + } + return false; + } + + private class NameMatcher implements Matcher { + @Override + public boolean matches(Context context) { + Map, Object> instances = context.getInstances(); + Selector selector = (Selector) instances.get(Selector.class); + if (selector != null) { + Set names = selector.getNames(); + String name = repository.getName(); + return names.contains(name); + } + return false; + } } } 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 b3541b53..8a788a08 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 @@ -21,7 +21,6 @@ import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Delete; @@ -56,9 +55,8 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { @Override public Result executeQuery(Context context, Query query) { Assert.isTrue(!query.isEmpty(), "The query cannot be empty!"); - Selector selector = context.getSelector(); CommonRepository rootRepository = repository.getRootRepository(); - if (selector.matches(context, rootRepository) || query.isIncludeRoot()) { + if (rootRepository.matches(context) || query.isIncludeRoot()) { Result result = rootRepository.executeQuery(context, query); List entities = result.getRecords(); if (!entities.isEmpty()) { @@ -101,20 +99,19 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } private int executeInsert(Context context, Operation operation, AbstractContextRepository delegateRepository) { - Selector selector = context.getSelector(); Object rootEntity = operation.getEntity(); int totalCount = 0; for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { if (repository.isRoot()) { if (!operation.isIgnoreRoot()) { - if (selector.matches(context, repository) || operation.isIncludeRoot()) { + if (repository.matches(context) || operation.isIncludeRoot()) { getBoundValue(context, rootEntity, repository, rootEntity); totalCount += repository.execute(context, operation); setBoundId(context, rootEntity, repository, rootEntity); } } } else { - boolean isMatch = selector.matches(context, repository); + boolean isMatch = repository.matches(context); boolean isAggregated = repository.isAggregated(); if (!isMatch && !isAggregated) { continue; @@ -143,12 +140,11 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } private int executeUpdateOrDelete(Context context, Operation operation, AbstractContextRepository delegateRepository) { - Selector selector = context.getSelector(); Object rootEntity = operation.getEntity(); int totalCount = 0; if (!operation.isIgnoreRoot()) { CommonRepository rootRepository = delegateRepository.getRootRepository(); - if (selector.matches(context, rootRepository) || operation.isIncludeRoot()) { + if (rootRepository.matches(context) || operation.isIncludeRoot()) { Object primaryKey = rootRepository.getPrimaryKey(rootEntity); if (primaryKey != null) { totalCount += rootRepository.execute(context, operation); @@ -156,7 +152,7 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } } for (CommonRepository subRepository : delegateRepository.getSubRepositories()) { - boolean isMatch = selector.matches(context, subRepository); + boolean isMatch = subRepository.matches(context); boolean isAggregated = subRepository.isAggregated(); if (!isMatch && !isAggregated) { continue; @@ -184,14 +180,13 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } private int executeInsertOrUpdate(Context context, Operation operation, AbstractContextRepository delegateRepository) { - Selector selector = context.getSelector(); Object rootEntity = operation.getEntity(); int totalCount = 0; for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { OperationFactory operationFactory = repository.getOperationFactory(); if (repository.isRoot()) { if (!operation.isIgnoreRoot()) { - if (selector.matches(context, repository) || operation.isIncludeRoot()) { + if (repository.matches(context) || operation.isIncludeRoot()) { Operation newOperation = operationFactory.buildInsertOrUpdate(rootEntity); if (newOperation instanceof Insert) { getBoundValue(context, rootEntity, repository, rootEntity); @@ -203,7 +198,7 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } } } else { - boolean isMatch = selector.matches(context, repository); + boolean isMatch = repository.matches(context); boolean isAggregated = repository.isAggregated(); if (!isMatch && !isAggregated) { continue; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index dcf74e94..d5e7dad5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -18,7 +18,6 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; @@ -36,10 +35,9 @@ public class BatchEntityHandler implements EntityHandler { @Override public long handle(Context context, List entities) { - Selector selector = context.getSelector(); long totalCount = 0L; for (CommonRepository repository : this.repository.getSubRepositories()) { - if (selector.matches(context, repository)) { + if (repository.matches(context)) { BinderResolver binderResolver = repository.getBinderResolver(); EntityHandler entityHandler = binderResolver.isSimpleRootBinding() ? new MultiEntityHandler(repository) : new UnionEntityHandler(repository); 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 6f12a071..dab849e1 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 @@ -34,6 +34,7 @@ import com.gitee.dorive.core.api.converter.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.impl.context.SelectionMatcher; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; @@ -151,6 +152,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setAnchorPoint(anchorPoint); repository.setBinderResolver(binderResolver); repository.setBoundEntity(false); + repository.setMatcher(new SelectionMatcher(repository)); return repository; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index 5f36ad06..d41b0133 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -19,7 +19,6 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.InsertOrUpdate; @@ -45,10 +44,9 @@ public abstract class AbstractGenericRepository extends AbstractContextRe public int updateByExample(Context context, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); - Selector selector = context.getSelector(); int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { - if (selector.matches(context, repository)) { + if (repository.matches(context)) { totalCount += repository.updateByExample(context, entity, ExampleUtils.clone(example)); } } @@ -72,10 +70,9 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int deleteByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Selector selector = context.getSelector(); int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { - if (selector.matches(context, repository)) { + if (repository.matches(context)) { totalCount += repository.deleteByExample(context, ExampleUtils.clone(example)); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java similarity index 45% rename from dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java rename to dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java index b04ebc34..52d3a980 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractExampleRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java @@ -18,9 +18,11 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.core.util.ExampleUtils; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,10 +31,21 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractExampleRepository extends AbstractGenericRepository { +public abstract class AbstractTransformRepository extends AbstractGenericRepository { + + @Override + public E selectByPrimaryKey(Context context, PK primaryKey) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.selectByPrimaryKey(context, primaryKey); + } @Override public List selectByExample(Context context, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -41,6 +54,9 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public E selectOneByExample(Context context, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -49,6 +65,9 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public Page selectPageByExample(Context context, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -57,26 +76,107 @@ public abstract class AbstractExampleRepository extends AbstractGenericRe @Override public long selectCountByExample(Context context, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.selectCountByExample(context, example); } + @Override + public int insert(Context context, E entity) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.insert(context, entity); + } + + @Override + public int update(Context context, E entity) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.update(context, entity); + } + @Override public int updateByExample(Context context, Object entity, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.updateByExample(context, entity, example); } + @Override + public int insertOrUpdate(Context context, E entity) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.insertOrUpdate(context, entity); + } + + @Override + public int delete(Context context, E entity) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.delete(context, entity); + } + + @Override + public int deleteByPrimaryKey(Context context, PK primaryKey) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.deleteByPrimaryKey(context, primaryKey); + } + @Override public int deleteByExample(Context context, Example example) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.deleteByExample(context, example); } + @Override + public int insertList(Context context, List entities) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.insertList(context, entities); + } + + @Override + public int updateList(Context context, List entities) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.updateList(context, entities); + } + + @Override + public int insertOrUpdateList(Context context, List entities) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.insertOrUpdateList(context, entities); + } + + @Override + public int deleteList(Context context, List entities) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } + return super.deleteList(context, entities); + } + } 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 a3f4af17..8a05abcf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -19,7 +19,7 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; +import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; @@ -32,10 +32,11 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; +import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public class CommonRepository extends AbstractProxyRepository implements Node { +public class CommonRepository extends AbstractProxyRepository implements Matcher { private String accessPath; private boolean root; @@ -44,6 +45,11 @@ public class CommonRepository extends AbstractProxyRepository implements Node { private PropChain anchorPoint; private BinderResolver binderResolver; private boolean boundEntity; + private Matcher matcher; + + public String getName() { + return getEntityDef().getName(); + } public Object getPrimaryKey(Object entity) { return getEntityEle().getPkProxy().getValue(entity); @@ -54,23 +60,26 @@ public class CommonRepository extends AbstractProxyRepository implements Node { } @Override - public String getName() { - return getEntityDef().getName(); + public boolean matches(Context context) { + return matcher.matches(context); } @Override public Result executeQuery(Context context, Query query) { - Selector selector = context.getSelector(); - List properties = selector.select(context, this); - if (properties != null && !properties.isEmpty()) { - if (query.getPrimaryKey() != null) { - Example example = new InnerExample().eq("id", query.getPrimaryKey()); - query.setPrimaryKey(null); - query.setExample(example); - } - Example example = query.getExample(); - if (example != null) { - example.select(properties); + Map, Object> instances = context.getInstances(); + Selector selector = (Selector) instances.get(Selector.class); + if (selector != null) { + List properties = selector.select(getName()); + if (properties != null && !properties.isEmpty()) { + if (query.getPrimaryKey() != null) { + Example example = new InnerExample().eq("id", query.getPrimaryKey()); + query.setPrimaryKey(null); + query.setExample(example); + } + Example example = query.getExample(); + if (example != null) { + example.select(properties); + } } } Example example = query.getExample(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java similarity index 72% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java rename to dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java index 0898c630..8df9b305 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/selector/AbstractSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java @@ -15,19 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.selector; +package com.gitee.dorive.core.util; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Node; -import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.context.InnerContext; -import java.util.List; +public class ContextUtils { -public abstract class AbstractSelector implements Selector { - - @Override - public List select(Context context, Node node) { - return null; + public static Context clone(Context context) { + return new InnerContext(context); } } 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 34536d65..c6d9a3a7 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -19,7 +19,7 @@ package com.gitee.dorive.event.repository; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.repository.AbstractExampleRepository; +import com.gitee.dorive.core.repository.AbstractTransformRepository; import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.DefaultRepository; @@ -27,7 +27,7 @@ import com.gitee.dorive.event.annotation.EnableEvent; import com.gitee.dorive.event.impl.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; -public abstract class AbstractEventRepository extends AbstractExampleRepository { +public abstract class AbstractEventRepository extends AbstractTransformRepository { private boolean enableEvent; 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 26a2ed87..d452f812 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 @@ -28,7 +28,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.context.Strategy; +import com.gitee.dorive.core.entity.option.QueryStrategy; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; @@ -115,9 +115,9 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { - Strategy strategy = context.getStrategy(); - Strategy.Query query = strategy.getQuery(); - if (query == null || Strategy.Query.SQL.equals(query)) { + Map, Object> instances = context.getInstances(); + QueryStrategy queryStrategy = (QueryStrategy) instances.get(QueryStrategy.class); + if (queryStrategy == null || queryStrategy == QueryStrategy.SQL) { return sqlQueryBuilder; } return super.adaptiveQueryBuilder(context, buildQuery); 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 86fef643..b0ab7c55 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 @@ -20,8 +20,10 @@ 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.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.event.repository.AbstractEventRepository; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.api.QueryRepository; @@ -91,6 +93,9 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public List selectByQuery(Context context, Object query) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -106,6 +111,9 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -124,6 +132,9 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public long selectCountByQuery(Context context, Object query) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } BuildQuery buildQuery = newQuery(context, query, true); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java index 44d96d8c..746fc2a2 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java @@ -17,9 +17,10 @@ package com.gitee.dorive.ref.api; +import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.ref.repository.AbstractRefRepository; -public interface Ref extends SelectorRepository { +public interface Ref extends QueryRepository { > R get(); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java index 4c28909c..f00d7c9c 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java @@ -18,7 +18,6 @@ package com.gitee.dorive.ref.api; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; public interface RefObj { @@ -28,10 +27,4 @@ public interface RefObj { int delete(Context context); - long select(Selector selector); - - int insertOrUpdate(Selector selector); - - int delete(Selector selector); - } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java deleted file mode 100644 index 40468f38..00000000 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/SelectorRepository.java +++ /dev/null @@ -1,106 +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.ref.api; - -import com.gitee.dorive.query.api.QueryRepository; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.context.InnerContext; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.Page; - -import java.util.List; - -public interface SelectorRepository extends QueryRepository { - - default E selectByPrimaryKey(Selector selector, PK primaryKey) { - return selectByPrimaryKey(new InnerContext(selector), primaryKey); - } - - default List selectByExample(Selector selector, Example example) { - return selectByExample(new InnerContext(selector), example); - } - - default E selectOneByExample(Selector selector, Example example) { - return selectOneByExample(new InnerContext(selector), example); - } - - default Page selectPageByExample(Selector selector, Example example) { - return selectPageByExample(new InnerContext(selector), example); - } - - default long selectCountByExample(Selector selector, Example example) { - return selectCountByExample(new InnerContext(selector), example); - } - - default int insert(Selector selector, E entity) { - return insert(new InnerContext(selector), entity); - } - - default int update(Selector selector, E entity) { - return update(new InnerContext(selector), entity); - } - - default int updateByExample(Selector selector, Object entity, Example example) { - return updateByExample(new InnerContext(selector), entity, example); - } - - default int insertOrUpdate(Selector selector, E entity) { - return insertOrUpdate(new InnerContext(selector), entity); - } - - default int delete(Selector selector, E entity) { - return delete(new InnerContext(selector), entity); - } - - default int deleteByPrimaryKey(Selector selector, PK primaryKey) { - return deleteByPrimaryKey(new InnerContext(selector), primaryKey); - } - - default int deleteByExample(Selector selector, Example example) { - return deleteByExample(new InnerContext(selector), example); - } - - default int insertList(Selector selector, List entities) { - return insertList(new InnerContext(selector), entities); - } - - default int updateList(Selector selector, List entities) { - return updateList(new InnerContext(selector), entities); - } - - default int insertOrUpdateList(Selector selector, List entities) { - return insertOrUpdateList(new InnerContext(selector), entities); - } - - default int deleteList(Selector selector, List entities) { - return deleteList(new InnerContext(selector), entities); - } - - default List selectByQuery(Selector selector, Object query) { - return selectByQuery(new InnerContext(selector), query); - } - - default Page selectPageByQuery(Selector selector, Object query) { - return selectPageByQuery(new InnerContext(selector), query); - } - - default long selectCountByQuery(Selector selector, Object query) { - return selectCountByQuery(new InnerContext(selector), query); - } - -} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java index 5fd2bead..199e40ad 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java @@ -18,10 +18,10 @@ package com.gitee.dorive.ref.impl; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.repository.AbstractRepository; +import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.ref.api.RefObj; import lombok.AllArgsConstructor; import lombok.Data; @@ -37,35 +37,29 @@ public class RefObjImpl implements RefObj { @Override public long select(Context context) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } EntityHandler entityHandler = ref.getEntityHandler(); return entityHandler.handle(context, Collections.singletonList(object)); } @Override public int insertOrUpdate(Context context) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } AbstractRepository repository = ref.getProxyRepository(); return repository.insertOrUpdate(context, object); } @Override public int delete(Context context) { + if (!(context instanceof InnerContext)) { + context = ContextUtils.clone(context); + } AbstractRepository repository = ref.getProxyRepository(); return repository.delete(context, object); } - @Override - public long select(Selector selector) { - return select(new InnerContext(selector)); - } - - @Override - public int insertOrUpdate(Selector selector) { - return insertOrUpdate(new InnerContext(selector)); - } - - @Override - public int delete(Selector selector) { - return delete(new InnerContext(selector)); - } - } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index ee2d01de..4ed929e0 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -17,12 +17,11 @@ package com.gitee.dorive.ref.repository; -import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.ref.api.SelectorRepository; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.ref.impl.RefInjector; -public abstract class AbstractRefRepository extends AbstractQueryRepository implements SelectorRepository { +public abstract class AbstractRefRepository extends AbstractQueryRepository { @Override protected EntityHandler processEntityHandler(EntityHandler entityHandler) { -- Gitee From d636976fe0720cbba0ae622bb22162f565c96daf Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 23 Jan 2024 18:04:40 +0800 Subject: [PATCH 102/146] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=B8=8D=E5=86=8D=E6=94=AF?= =?UTF-8?q?=E6=8C=81Selector=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/context/SelectionMatcher.java | 8 ++++---- .../core/repository/AbstractContextRepository.java | 12 ++++++------ .../core/repository/AbstractGenericRepository.java | 4 ---- .../core/repository/AbstractTransformRepository.java | 4 ---- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java index ec38fb7b..2d0b3002 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java @@ -22,8 +22,8 @@ import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.option.Selection; import com.gitee.dorive.core.repository.CommonRepository; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.util.LinkedHashMap; import java.util.Map; @@ -32,8 +32,8 @@ import java.util.Set; /** * 双向依赖,在获取hashCode时,会栈溢出 */ -@Data -@EqualsAndHashCode(exclude = "repository") +@Getter +@Setter public class SelectionMatcher implements Matcher { private CommonRepository repository; 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 dab849e1..f17133b9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -28,25 +28,25 @@ import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; import com.gitee.dorive.core.api.converter.EntityFactory; +import com.gitee.dorive.core.api.converter.EntityMapper; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.api.converter.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.impl.context.SelectionMatcher; +import com.gitee.dorive.core.impl.converter.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.converter.DefaultEntityFactory; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.impl.resolver.EntityMapperResolver; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; @@ -60,8 +60,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public abstract class AbstractContextRepository extends AbstractRepository implements ApplicationContextAware, InitializingBean { private static final Map ENTITY_STORE_INFO_MAP = new ConcurrentHashMap<>(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index d41b0133..7ecae9ef 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -24,13 +24,9 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.util.ExampleUtils; -import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.List; -@Data -@EqualsAndHashCode(callSuper = false) public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java index 52d3a980..d3c0b8d4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java @@ -24,13 +24,9 @@ import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.core.util.ExampleUtils; -import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.List; -@Data -@EqualsAndHashCode(callSuper = false) public abstract class AbstractTransformRepository extends AbstractGenericRepository { @Override -- Gitee From 3cc012f3ee50ec4a8a1743f77f9622143718d57d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 23 Jan 2024 18:12:33 +0800 Subject: [PATCH 103/146] =?UTF-8?q?=E7=A7=BB=E9=99=A4Data=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E9=81=BF=E5=85=8D=E5=B5=8C=E5=A5=97=E9=80=92?= =?UTF-8?q?=E5=BD=92=E8=B0=83=E7=94=A8toString?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/repository/AbstractProxyRepository.java | 8 ++++---- .../gitee/dorive/core/repository/AbstractRepository.java | 6 ++++-- .../gitee/dorive/core/repository/CommonRepository.java | 8 ++++---- .../gitee/dorive/core/repository/DefaultRepository.java | 8 ++++---- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index 2243ef1a..01a18a73 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -24,16 +24,16 @@ import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.List; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor -@EqualsAndHashCode(callSuper = false) public abstract class AbstractProxyRepository extends AbstractRepository { private AbstractRepository proxyRepository; 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 c7daeb03..f61ffa8e 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 @@ -32,11 +32,13 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.factory.OperationFactory; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.util.List; -@Data +@Getter +@Setter public abstract class AbstractRepository implements Repository, Executor { private EntityDef entityDef; 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 8a05abcf..bc2ef772 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 @@ -28,14 +28,14 @@ import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.util.ExampleUtils; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class CommonRepository extends AbstractProxyRepository implements Matcher { private String accessPath; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java index ec576f8a..0309eae3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java @@ -17,12 +17,12 @@ package com.gitee.dorive.core.repository; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter @NoArgsConstructor -@EqualsAndHashCode(callSuper = false) public class DefaultRepository extends AbstractRepository { } -- Gitee From 2c45b80e5e6575d806bd30001cdc6603f827289b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 24 Jan 2024 10:01:46 +0800 Subject: [PATCH 104/146] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/api/context/Context.java | 2 +- .../core/entity/context/AbstractContext.java | 4 ++-- .../dorive/core/entity/context/InnerContext.java | 2 +- .../core/entity/context/StaticContext.java | 16 ++++++++-------- .../core/impl/context/SelectionMatcher.java | 8 ++++---- .../dorive/core/repository/CommonRepository.java | 4 ++-- .../plus/repository/MybatisPlusRepository.java | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index dc33fe22..e1787496 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -28,7 +28,7 @@ public interface Context { Context ROOT = new StaticContext(Selection.ROOT); Context ALL = new StaticContext(Selection.ALL); - Map, Object> getInstances(); + Map, Object> getOptions(); Map getAttachments(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 7018c0c4..48d09c63 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -27,11 +27,11 @@ import java.util.Map; @Data public abstract class AbstractContext implements Context { - protected Map, Object> instances = new LinkedHashMap<>(4); + protected Map, Object> options = new LinkedHashMap<>(4); protected Map attachments = new LinkedHashMap<>(8); public AbstractContext() { - this.instances.put(Selection.class, Selection.NONE); + this.options.put(Selection.class, Selection.NONE); } public Object put(String key, Object value) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java index a226acc9..5155d166 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java @@ -28,7 +28,7 @@ import lombok.NoArgsConstructor; public class InnerContext extends AbstractContext { public InnerContext(Context anotherContext) { - this.instances.putAll(anotherContext.getInstances()); + this.options.putAll(anotherContext.getOptions()); this.attachments.putAll(anotherContext.getAttachments()); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java index be4e8034..100ee29c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java @@ -27,22 +27,22 @@ import java.util.Map; public class StaticContext implements Context { - private Map, Object> instances = new LinkedHashMap<>(3); + private Map, Object> options = new LinkedHashMap<>(3); public StaticContext(Selection selection) { - this.instances.put(Selection.class, selection); - this.instances = Collections.unmodifiableMap(this.instances); + this.options.put(Selection.class, selection); + this.options = Collections.unmodifiableMap(this.options); } public StaticContext(Selection selection, Selector selector) { - this.instances.put(Selection.class, selection); - this.instances.put(Selector.class, selector); - this.instances = Collections.unmodifiableMap(this.instances); + this.options.put(Selection.class, selection); + this.options.put(Selector.class, selector); + this.options = Collections.unmodifiableMap(this.options); } @Override - public Map, Object> getInstances() { - return instances; + public Map, Object> getOptions() { + return options; } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java index 2d0b3002..3c937328 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java @@ -49,8 +49,8 @@ public class SelectionMatcher implements Matcher { @Override public boolean matches(Context context) { - Map, Object> instances = context.getInstances(); - Selection selection = (Selection) instances.get(Selection.class); + Map, Object> options = context.getOptions(); + Selection selection = (Selection) options.get(Selection.class); if (selection != null) { Matcher matcher = matcherMap.get(selection); if (matcher != null) { @@ -63,8 +63,8 @@ public class SelectionMatcher implements Matcher { private class NameMatcher implements Matcher { @Override public boolean matches(Context context) { - Map, Object> instances = context.getInstances(); - Selector selector = (Selector) instances.get(Selector.class); + Map, Object> options = context.getOptions(); + Selector selector = (Selector) options.get(Selector.class); if (selector != null) { Set names = selector.getNames(); String name = repository.getName(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index bc2ef772..b4b21034 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 @@ -66,8 +66,8 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher @Override public Result executeQuery(Context context, Query query) { - Map, Object> instances = context.getInstances(); - Selector selector = (Selector) instances.get(Selector.class); + Map, Object> options = context.getOptions(); + Selector selector = (Selector) options.get(Selector.class); if (selector != null) { List properties = selector.select(getName()); if (properties != null && !properties.isEmpty()) { 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 d452f812..723eb61a 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 @@ -115,8 +115,8 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { - Map, Object> instances = context.getInstances(); - QueryStrategy queryStrategy = (QueryStrategy) instances.get(QueryStrategy.class); + Map, Object> options = context.getOptions(); + QueryStrategy queryStrategy = (QueryStrategy) options.get(QueryStrategy.class); if (queryStrategy == null || queryStrategy == QueryStrategy.SQL) { return sqlQueryBuilder; } -- Gitee From e5240a643e6e1ba82dafc6939892f6b9100fa9e6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 24 Jan 2024 10:18:32 +0800 Subject: [PATCH 105/146] =?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/core/entity/context/BoundedContext.java | 4 ---- .../com/gitee/dorive/core/entity/context/InnerContext.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java index 05c875c7..3a552f3d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java @@ -18,13 +18,9 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; -import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -@Data @NoArgsConstructor -@EqualsAndHashCode(callSuper = false) public class BoundedContext extends InnerContext { public BoundedContext(Context anotherContext) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java index 5155d166..5e2cd414 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java @@ -18,13 +18,9 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; -import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -@Data @NoArgsConstructor -@EqualsAndHashCode(callSuper = false) public class InnerContext extends AbstractContext { public InnerContext(Context anotherContext) { -- Gitee From d1edc446245406e87b304bfd1ec02523e451f237 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 25 Jan 2024 16:54:00 +0800 Subject: [PATCH 106/146] =?UTF-8?q?=E5=B0=86=E6=B4=BE=E7=94=9F=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E7=BB=9F=E4=B8=80=E5=B0=81=E8=A3=85=E5=9C=A8ContextEx?= =?UTF-8?q?ecutor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/executor/ContextExecutor.java | 60 +++++++++----- .../impl/handler/AdaptiveEntityHandler.java | 81 ------------------- .../core/impl/resolver/DerivedResolver.java | 27 ++++--- .../repository/AbstractContextRepository.java | 17 ++-- 4 files changed, 64 insertions(+), 121 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java 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 8a788a08..a139562c 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 @@ -22,6 +22,7 @@ import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; +import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Delete; import com.gitee.dorive.core.entity.operation.Insert; @@ -39,10 +40,11 @@ import lombok.EqualsAndHashCode; import java.util.Collection; import java.util.List; +import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public class ContextExecutor extends AbstractExecutor implements EntityHandler { +public class ContextExecutor extends AbstractExecutor { private final AbstractContextRepository repository; private final EntityHandler entityHandler; @@ -60,16 +62,31 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { Result result = rootRepository.executeQuery(context, query); List entities = result.getRecords(); if (!entities.isEmpty()) { - handle(context, entities); + populate(context, entities); } return result; } return new Result<>(); } - @Override - public long handle(Context context, List entities) { - return entityHandler.handle(context, entities); + public void populate(Context context, List entities) { + DerivedResolver derivedResolver = repository.getDerivedResolver(); + if (!derivedResolver.hasDerived()) { + entityHandler.handle(context, entities); + } else { + Map, List> repositoryEntitiesMap = derivedResolver.distribute(entities); + repositoryEntitiesMap.forEach((repository, partEntities) -> { + if (repository == this.repository) { // 避免自循环 + entityHandler.handle(context, partEntities); + } else { + Executor executor = repository.getExecutor(); + if (executor instanceof ContextExecutor) { + ContextExecutor contextExecutor = (ContextExecutor) executor; + contextExecutor.populate(context, partEntities); + } + } + }); + } } @Override @@ -83,25 +100,28 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { Assert.notNull(rootEntity, "The root entity cannot be null!"); DerivedResolver derivedResolver = repository.getDerivedResolver(); - AbstractContextRepository delegateRepository = derivedResolver.deriveRepository(rootEntity); - delegateRepository = delegateRepository == null ? repository : delegateRepository; + AbstractContextRepository repository = derivedResolver.distribute(rootEntity); - if (operation instanceof Insert) { - return executeInsert(context, operation, delegateRepository); + Executor executor = repository.getExecutor(); + if (executor instanceof ContextExecutor) { + ContextExecutor contextExecutor = (ContextExecutor) executor; + if (operation instanceof Insert) { + return contextExecutor.executeInsert(context, operation); - } else if (operation instanceof Update || operation instanceof Delete) { - return executeUpdateOrDelete(context, operation, delegateRepository); + } else if (operation instanceof Update || operation instanceof Delete) { + return contextExecutor.executeUpdateOrDelete(context, operation); - } else if (operation instanceof InsertOrUpdate) { - return executeInsertOrUpdate(context, operation, delegateRepository); + } else if (operation instanceof InsertOrUpdate) { + return contextExecutor.executeInsertOrUpdate(context, operation); + } } return 0; } - private int executeInsert(Context context, Operation operation, AbstractContextRepository delegateRepository) { + public int executeInsert(Context context, Operation operation) { Object rootEntity = operation.getEntity(); int totalCount = 0; - for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { + for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { if (!operation.isIgnoreRoot()) { if (repository.matches(context) || operation.isIncludeRoot()) { @@ -139,11 +159,11 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { return totalCount; } - private int executeUpdateOrDelete(Context context, Operation operation, AbstractContextRepository delegateRepository) { + public int executeUpdateOrDelete(Context context, Operation operation) { Object rootEntity = operation.getEntity(); int totalCount = 0; if (!operation.isIgnoreRoot()) { - CommonRepository rootRepository = delegateRepository.getRootRepository(); + CommonRepository rootRepository = this.repository.getRootRepository(); if (rootRepository.matches(context) || operation.isIncludeRoot()) { Object primaryKey = rootRepository.getPrimaryKey(rootEntity); if (primaryKey != null) { @@ -151,7 +171,7 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { } } } - for (CommonRepository subRepository : delegateRepository.getSubRepositories()) { + for (CommonRepository subRepository : this.repository.getSubRepositories()) { boolean isMatch = subRepository.matches(context); boolean isAggregated = subRepository.isAggregated(); if (!isMatch && !isAggregated) { @@ -179,10 +199,10 @@ public class ContextExecutor extends AbstractExecutor implements EntityHandler { return totalCount; } - private int executeInsertOrUpdate(Context context, Operation operation, AbstractContextRepository delegateRepository) { + public int executeInsertOrUpdate(Context context, Operation operation) { Object rootEntity = operation.getEntity(); int totalCount = 0; - for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { + for (CommonRepository repository : this.repository.getOrderedRepositories()) { OperationFactory operationFactory = repository.getOperationFactory(); if (repository.isRoot()) { if (!operation.isIgnoreRoot()) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java deleted file mode 100644 index 618241e4..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/AdaptiveEntityHandler.java +++ /dev/null @@ -1,81 +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.handler; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.impl.resolver.DerivedResolver; -import com.gitee.dorive.core.repository.AbstractContextRepository; -import lombok.Data; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -@Data -public class AdaptiveEntityHandler implements EntityHandler { - - private final AbstractContextRepository repository; - private final EntityHandler entityHandler; - - public AdaptiveEntityHandler(AbstractContextRepository repository, EntityHandler entityHandler) { - this.repository = repository; - this.entityHandler = entityHandler; - } - - @Override - public long handle(Context context, List entities) { - List newEntities = new ArrayList<>(entities.size()); - Map, List> repositoryEntitiesMap = distribute(entities, newEntities); - - long totalCount = 0L; - if (!newEntities.isEmpty()) { - totalCount += (entityHandler.handle(context, newEntities)); - } - for (Map.Entry, List> entry : repositoryEntitiesMap.entrySet()) { - AbstractContextRepository repository = entry.getKey(); - List subclassEntities = entry.getValue(); - Executor executor = repository.getExecutor(); - if (executor instanceof EntityHandler) { - totalCount += (((EntityHandler) executor).handle(context, subclassEntities)); - } - } - return totalCount; - } - - private Map, List> distribute(List entities, List newEntities) { - DerivedResolver derivedResolver = repository.getDerivedResolver(); - int numberOf = derivedResolver.numberOf(); - Map, List> repositoryEntitiesMap = new LinkedHashMap<>(numberOf * 4 / 3 + 1); - - for (Object entity : entities) { - AbstractContextRepository repository = derivedResolver.deriveRepository(entity); - if (repository == null) { - newEntities.add(entity); - } else { - List existEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(entities.size())); - existEntities.add(entity); - } - } - - return repositoryEntitiesMap; - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java index 95cce01c..4a788e29 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java @@ -22,21 +22,23 @@ import lombok.Data; import org.springframework.context.ApplicationContext; import org.springframework.util.ReflectionUtils; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; @Data public class DerivedResolver { private AbstractContextRepository repository; - private Map, AbstractContextRepository> derivedRepositoryMap = new LinkedHashMap<>(3 * 4 / 3 + 1); + private Map, AbstractContextRepository> classRepositoryMap = new LinkedHashMap<>(3 * 4 / 3 + 1); public DerivedResolver(AbstractContextRepository repository) { this.repository = repository; resolve(); } - public void resolve() { + private void resolve() { ReflectionUtils.doWithLocalFields(repository.getClass(), declaredField -> { Class fieldClass = declaredField.getType(); if (AbstractContextRepository.class.isAssignableFrom(fieldClass)) { @@ -45,22 +47,29 @@ public class DerivedResolver { AbstractContextRepository abstractContextRepository = (AbstractContextRepository) beanInstance; Class fieldEntityClass = abstractContextRepository.getEntityClass(); if (repository.getEntityClass().isAssignableFrom(fieldEntityClass)) { - derivedRepositoryMap.put(fieldEntityClass, abstractContextRepository); + classRepositoryMap.put(fieldEntityClass, abstractContextRepository); } } }); } - public boolean isDerived() { - return !derivedRepositoryMap.isEmpty(); + public boolean hasDerived() { + return !classRepositoryMap.isEmpty(); } - public int numberOf() { - return derivedRepositoryMap.size(); + public AbstractContextRepository distribute(Object entity) { + return classRepositoryMap.getOrDefault(entity.getClass(), repository); } - public AbstractContextRepository deriveRepository(Object entity) { - return derivedRepositoryMap.get(entity.getClass()); + public Map, List> distribute(List entities) { + int size = classRepositoryMap.size() + 1; + Map, List> repositoryEntitiesMap = new LinkedHashMap<>(size * 4 / 3 + 1); + for (Object entity : entities) { + AbstractContextRepository repository = distribute(entity); + List existEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(entities.size())); + existEntities.add(entity); + } + return repositoryEntitiesMap; } } 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 f17133b9..7b46991d 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 @@ -40,7 +40,6 @@ import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.handler.AdaptiveEntityHandler; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; @@ -118,7 +117,12 @@ public abstract class AbstractContextRepository extends AbstractRepositor setEntityDef(rootRepository.getEntityDef()); setEntityEle(rootRepository.getEntityEle()); setOperationFactory(rootRepository.getOperationFactory()); - setExecutor(newContextExecutor()); + + derivedResolver = new DerivedResolver(this); + + EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); + Executor executor = new ContextExecutor(this, entityHandler); + setExecutor(executor); } private CommonRepository newRepository(String accessPath, EntityEle entityEle) { @@ -225,15 +229,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor return null; } - private Executor newContextExecutor() { - EntityHandler entityHandler = processEntityHandler(new BatchEntityHandler(this)); - derivedResolver = new DerivedResolver(this); - if (derivedResolver.isDerived()) { - entityHandler = new AdaptiveEntityHandler(this, entityHandler); - } - return new ContextExecutor(this, entityHandler); - } - protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle); protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle); -- Gitee From e523906b304443a8687416be65d44ec20bb6eb8a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 13:45:39 +0800 Subject: [PATCH 107/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/executor/EntityJoiner.java | 32 +++ .../core/entity/executor/UnionExample.java | 5 + .../dorive/core/entity/option/JoinType.java | 25 ++ .../core/impl/handler/BatchEntityHandler.java | 43 +++- .../core/impl/handler/MultiEntityHandler.java | 242 ------------------ .../impl/joiner/AbstractEntityJoiner.java | 123 +++++++++ .../core/impl/joiner/MultiEntityJoiner.java | 114 +++++++++ .../core/impl/joiner/SingleEntityJoiner.java | 92 +++++++ .../UnionEntityJoiner.java} | 108 +++----- .../core/impl/resolver/BinderResolver.java | 14 +- .../core/repository/CommonRepository.java | 15 ++ .../dorive/core/util/MultiInBuilder.java | 24 +- .../impl/builder/DefaultQueryBuilder.java | 2 +- 13 files changed, 507 insertions(+), 332 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{handler/UnionEntityHandler.java => joiner/UnionEntityJoiner.java} (44%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java new file mode 100644 index 00000000..132a3f48 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/EntityJoiner.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.api.executor; + +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 java.util.List; + +public interface EntityJoiner { + + Example newExample(Context context, List entities); + + void join(Context context, List entities, Result result); + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index c0e004fd..dab7f1a3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -31,6 +31,11 @@ public class UnionExample extends Example { private List examples = new ArrayList<>(); + @Override + public boolean isEmpty() { + return examples.isEmpty(); + } + @Override public boolean isNotEmpty() { return !examples.isEmpty(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java new file mode 100644 index 00000000..0be2334a --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.option; + +public enum JoinType { + UNKNOWN, + SINGLE, + MULTI, + UNION +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index d5e7dad5..65ebc0e3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -19,7 +19,15 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.api.executor.EntityJoiner; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.impl.joiner.MultiEntityJoiner; +import com.gitee.dorive.core.impl.joiner.SingleEntityJoiner; +import com.gitee.dorive.core.impl.joiner.UnionEntityJoiner; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; import lombok.AllArgsConstructor; @@ -38,13 +46,38 @@ public class BatchEntityHandler implements EntityHandler { long totalCount = 0L; for (CommonRepository repository : this.repository.getSubRepositories()) { if (repository.matches(context)) { - BinderResolver binderResolver = repository.getBinderResolver(); - EntityHandler entityHandler = binderResolver.isSimpleRootBinding() ? - new MultiEntityHandler(repository) : new UnionEntityHandler(repository); - totalCount += entityHandler.handle(context, entities); + EntityJoiner entityJoiner = getEntityJoiner(repository, entities); + if (entityJoiner == null) { + continue; + } + Example example = entityJoiner.newExample(context, entities); + if (example.isEmpty()) { + continue; + } + OperationFactory operationFactory = repository.getOperationFactory(); + Query query = operationFactory.buildQueryByExample(example); + query.includeRoot(); + Result result = repository.executeQuery(context, query); + entityJoiner.join(context, entities, result); + totalCount += result.getCount(); } } return totalCount; } + protected EntityJoiner getEntityJoiner(CommonRepository repository, List entities) { + JoinType joinType = repository.getJoinType(); + int entitiesSize = entities.size(); + if (joinType == JoinType.SINGLE) { + return new SingleEntityJoiner(repository, entitiesSize); + + } else if (joinType == JoinType.MULTI) { + return new MultiEntityJoiner(repository, entitiesSize); + + } else if (joinType == JoinType.UNION) { + return new UnionEntityJoiner(repository, entitiesSize); + } + return null; + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java deleted file mode 100644 index 6c74c6f6..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/MultiEntityHandler.java +++ /dev/null @@ -1,242 +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.handler; - -import com.gitee.dorive.api.entity.element.PropChain; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.impl.binder.AbstractBinder; -import com.gitee.dorive.core.impl.binder.ContextBinder; -import com.gitee.dorive.core.impl.binder.PropertyBinder; -import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.resolver.BinderResolver; -import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.core.util.MultiInBuilder; -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Data -@AllArgsConstructor -public class MultiEntityHandler implements EntityHandler { - - private final CommonRepository repository; - - @Override - public long handle(Context context, List entities) { - Map entityIndex = new LinkedHashMap<>(entities.size() * 4 / 3 + 1); - Example example = newExample(context, entities, entityIndex); - if (example.isNotEmpty()) { - OperationFactory operationFactory = repository.getOperationFactory(); - Query query = operationFactory.buildQueryByExample(example); - query.includeRoot(); - Result result = repository.executeQuery(context, query); - setValueForRootEntities(context, entities, entityIndex, result); - return result.getCount(); - } - return 0L; - } - - private Example newExample(Context context, List entities, Map entityIndex) { - BinderResolver binderResolver = repository.getBinderResolver(); - Map> mergedBindersMap = binderResolver.getMergedBindersMap(); - List binders = mergedBindersMap.get("/"); - - Example example = new InnerExample(); - if (binders.size() == 1) { - PropertyBinder binder = binders.get(0); - List boundValues = collectBoundValues(context, entities, entityIndex, binder); - if (!boundValues.isEmpty()) { - String fieldName = binder.getFieldName(); - if (boundValues.size() == 1) { - example.eq(fieldName, boundValues.get(0)); - } else { - example.in(fieldName, boundValues); - } - } - - } else { - List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); - MultiInBuilder builder = new MultiInBuilder(aliases, entities.size()); - collectBoundValues(context, entities, entityIndex, binders, builder); - if (!builder.isEmpty()) { - example.getCriteria().add(builder.toCriterion()); - } - } - - if (example.isNotEmpty()) { - for (ContextBinder binder : binderResolver.getContextBinders()) { - String fieldName = binder.getFieldName(); - Object boundValue = binder.getBoundValue(context, null); - if (boundValue != null) { - example.eq(fieldName, boundValue); - } - } - } - - return example; - } - - private List collectBoundValues(Context context, List entities, Map entityIndex, PropertyBinder binder) { - List boundValues = new ArrayList<>(entities.size()); - for (Object entity : entities) { - Object boundValue = binder.getBoundValue(context, entity); - if (boundValue != null) { - boundValue = binder.input(context, boundValue); - String key = String.valueOf(boundValue); - if (!entityIndex.containsKey(key)) { - boundValues.add(boundValue); - } - addToIndex(entityIndex, key, entity); - } - } - return boundValues; - } - - private void collectBoundValues(Context context, List entities, Map entityIndex, List binders, - MultiInBuilder multiInBuilder) { - for (Object entity : entities) { - StringBuilder strBuilder = new StringBuilder(); - for (PropertyBinder binder : binders) { - Object boundValue = binder.getBoundValue(context, entity); - if (boundValue != null) { - boundValue = binder.input(context, boundValue); - multiInBuilder.append(boundValue); - String boundValueStr = String.valueOf(boundValue); - strBuilder.append("(").append(boundValueStr.length()).append(")").append(boundValueStr).append(","); - - } else { - multiInBuilder.clearLast(); - strBuilder = null; - break; - } - } - if (strBuilder != null) { - if (strBuilder.length() > 0) { - strBuilder.deleteCharAt(strBuilder.length() - 1); - } - String key = strBuilder.toString(); - if (entityIndex.containsKey(key)) { - multiInBuilder.clearLast(); - } - addToIndex(entityIndex, key, entity); - } - } - } - - @SuppressWarnings("unchecked") - private void addToIndex(Map entityIndex, String key, Object entity) { - Object object = entityIndex.get(key); - if (object instanceof Collection) { - ((Collection) object).add(entity); - - } else if (object != null) { - List entities = new ArrayList<>(4); - entities.add(object); - entities.add(entity); - entityIndex.put(key, entities); - - } else { - entityIndex.put(key, entity); - } - } - - @SuppressWarnings("unchecked") - private void setValueForRootEntities(Context context, List rootEntities, Map entityIndex, Result result) { - boolean isCollection = repository.getEntityEle().isCollection(); - PropChain anchorPoint = repository.getAnchorPoint(); - - BinderResolver binderResolver = repository.getBinderResolver(); - Map> mergedBindersMap = binderResolver.getMergedBindersMap(); - List binders = mergedBindersMap.get("/"); - - List entities = result.getRecords(); - int averageSize = entities.size() / rootEntities.size() + 1; - - for (Object entity : entities) { - StringBuilder strBuilder = new StringBuilder(); - if (binders.size() == 1) { - PropertyBinder binder = binders.get(0); - Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue != null) { - strBuilder.append(fieldValue); - } else { - strBuilder = null; - } - } else { - for (PropertyBinder binder : binders) { - Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue != null) { - String fieldValueStr = String.valueOf(fieldValue); - strBuilder.append("(").append(fieldValueStr.length()).append(")").append(fieldValueStr).append(","); - - } else { - strBuilder = null; - break; - } - } - if (strBuilder != null && strBuilder.length() > 0) { - strBuilder.deleteCharAt(strBuilder.length() - 1); - } - } - if (strBuilder != null) { - Object object = entityIndex.get(strBuilder.toString()); - if (object instanceof Collection) { - for (Object rootEntity : (Collection) object) { - setValueForRootEntity(isCollection, anchorPoint, averageSize, rootEntity, entity); - } - } else { - setValueForRootEntity(isCollection, anchorPoint, averageSize, object, entity); - } - } - } - } - - @SuppressWarnings("unchecked") - private void setValueForRootEntity(boolean isCollection, PropChain anchorPoint, int averageSize, Object rootEntity, Object entity) { - if (rootEntity != null) { - Object value = anchorPoint.getValue(rootEntity); - if (isCollection) { - Collection collection; - if (value == null) { - collection = new ArrayList<>(averageSize); - anchorPoint.setValue(rootEntity, collection); - } else { - collection = (Collection) value; - } - collection.add(entity); - - } else { - if (value == null) { - anchorPoint.setValue(rootEntity, entity); - } - } - } - } - -} 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 new file mode 100644 index 00000000..9427e5e5 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java @@ -0,0 +1,123 @@ +/* + * 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.joiner; + +import com.gitee.dorive.api.entity.element.PropChain; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.EntityJoiner; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.impl.binder.ContextBinder; +import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.repository.CommonRepository; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public abstract class AbstractEntityJoiner implements EntityJoiner { + + protected CommonRepository repository; + protected Map rootIndex; + protected Set keys; + protected Map recordIndex; + protected int averageSize; + + public AbstractEntityJoiner(CommonRepository repository, int entitiesSize) { + this.repository = repository; + int size = entitiesSize * 4 / 3 + 1; + this.rootIndex = new LinkedHashMap<>(size); + this.keys = new LinkedHashSet<>(size); + this.recordIndex = new LinkedHashMap<>(size); + } + + protected void appendContext(Context context, Example example) { + if (example == null || example.isEmpty()) { + return; + } + BinderResolver binderResolver = repository.getBinderResolver(); + List contextBinders = binderResolver.getContextBinders(); + for (ContextBinder contextBinder : contextBinders) { + String fieldName = contextBinder.getFieldName(); + Object boundValue = contextBinder.getBoundValue(context, null); + if (boundValue != null) { + example.eq(fieldName, boundValue); + } + } + } + + protected void addToRootIndex(Object entity, String key) { + if (entity == null || StringUtils.isBlank(key)) { + return; + } + rootIndex.put(System.identityHashCode(entity), key); + keys.add(key); + } + + @Override + public void join(Context context, List entities, Result result) { + List records = result.getRecords(); + averageSize = records.size() / entities.size() + 1; + addToRecordIndex(context, entities, result); + joinMany(entities); + } + + @SuppressWarnings("unchecked") + protected void addToRecordIndex(String key, Object entity) { + if (StringUtils.isBlank(key) || entity == null) { + return; + } + boolean isCollection = repository.isCollection(); + if (isCollection) { + Collection collection = (Collection) recordIndex.computeIfAbsent(key, k -> new ArrayList<>(averageSize)); + collection.add(entity); + } else { + recordIndex.putIfAbsent(key, entity); + } + } + + protected void joinMany(List entities) { + for (Object entity : entities) { + String key = rootIndex.get(System.identityHashCode(entity)); + if (key != null) { + Object object = recordIndex.get(key); + joinOne(entity, object); + } + } + } + + protected void joinOne(Object entity, Object object) { + if (entity == null || object == null) { + return; + } + PropChain anchorPoint = repository.getAnchorPoint(); + Object value = anchorPoint.getValue(entity); + if (value != null) { + return; + } + anchorPoint.setValue(entity, object); + } + + protected abstract void addToRecordIndex(Context context, List entities, Result result); + +} 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 new file mode 100644 index 00000000..35801b32 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java @@ -0,0 +1,114 @@ +/* + * 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.joiner; + +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.PropertyBinder; +import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.util.MultiInBuilder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Setter +public class MultiEntityJoiner extends AbstractEntityJoiner { + + private List binders; + + public MultiEntityJoiner(CommonRepository repository, int entitiesSize) { + super(repository, entitiesSize); + this.binders = repository.getRootBinders(); + } + + @Override + public Example newExample(Context context, List entities) { + Example example = new InnerExample(); + MultiInBuilder builder = newMultiInBuilder(context, entities); + if (!builder.isEmpty()) { + example.getCriteria().add(builder.toCriterion()); + } + appendContext(context, example); + return example; + } + + private MultiInBuilder newMultiInBuilder(Context context, List entities) { + List aliases = binders.stream().map(AbstractBinder::getAlias).collect(Collectors.toList()); + MultiInBuilder multiInBuilder = new MultiInBuilder(aliases, entities.size()); + + for (Object entity : entities) { + StringBuilder keyBuilder = new StringBuilder(); + for (PropertyBinder binder : binders) { + Object boundValue = binder.getBoundValue(context, entity); + if (boundValue == null) { + multiInBuilder.clearRemainder(); + keyBuilder = null; + break; + } + boundValue = binder.input(context, boundValue); + if (boundValue == null) { + multiInBuilder.clearRemainder(); + keyBuilder = null; + break; + } + multiInBuilder.append(boundValue); + String key = boundValue.toString(); + keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); + } + if (keyBuilder != null && keyBuilder.length() > 0) { + keyBuilder.deleteCharAt(keyBuilder.length() - 1); + String key = keyBuilder.toString(); + if (keys.contains(key)) { + multiInBuilder.clearLast(); + } + addToRootIndex(entity, key); + } + } + + return multiInBuilder; + } + + @Override + protected void addToRecordIndex(Context context, List entities, Result result) { + List records = result.getRecords(); + for (Object entity : records) { + StringBuilder keyBuilder = new StringBuilder(); + for (PropertyBinder binder : binders) { + Object fieldValue = binder.getFieldValue(context, entity); + if (fieldValue == null) { + keyBuilder = null; + break; + } + String key = fieldValue.toString(); + keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); + } + if (keyBuilder != null && keyBuilder.length() > 0) { + keyBuilder.deleteCharAt(keyBuilder.length() - 1); + String key = keyBuilder.toString(); + addToRecordIndex(key, entity); + } + } + } + +} 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 new file mode 100644 index 00000000..aecc83ee --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java @@ -0,0 +1,92 @@ +/* + * 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.joiner; + +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.PropertyBinder; +import com.gitee.dorive.core.repository.CommonRepository; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +public class SingleEntityJoiner extends AbstractEntityJoiner { + + private PropertyBinder binder; + + public SingleEntityJoiner(CommonRepository repository, int entitiesSize) { + super(repository, entitiesSize); + this.binder = repository.getRootBinders().get(0); + } + + @Override + public Example newExample(Context context, List entities) { + Example example = new InnerExample(); + List boundValues = collectBoundValues(context, entities); + if (!boundValues.isEmpty()) { + String fieldName = binder.getFieldName(); + if (boundValues.size() == 1) { + example.eq(fieldName, boundValues.get(0)); + } else { + example.in(fieldName, boundValues); + } + } + appendContext(context, example); + return example; + } + + private List collectBoundValues(Context context, List entities) { + List boundValues = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object boundValue = binder.getBoundValue(context, entity); + if (boundValue == null) { + continue; + } + boundValue = binder.input(context, boundValue); + if (boundValue == null) { + continue; + } + String key = boundValue.toString(); + if (!keys.contains(key)) { + boundValues.add(boundValue); + } + addToRootIndex(entity, key); + } + return boundValues; + } + + @Override + protected void addToRecordIndex(Context context, List entities, Result result) { + List records = result.getRecords(); + for (Object entity : records) { + Object fieldValue = binder.getFieldValue(context, entity); + if (fieldValue == null) { + continue; + } + String key = fieldValue.toString(); + addToRecordIndex(key, entity); + } + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java similarity index 44% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java index 6152f01b..a1811514 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java @@ -15,51 +15,33 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.handler; +package com.gitee.dorive.core.impl.joiner; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; -import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.core.util.NumberUtils; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -@Data -@AllArgsConstructor -public class UnionEntityHandler implements EntityHandler { +@Getter +@Setter +public class UnionEntityJoiner extends AbstractEntityJoiner { - private final CommonRepository repository; - - @Override - public long handle(Context context, List entities) { - Example example = newExample(context, entities); - if (example.isNotEmpty()) { - OperationFactory operationFactory = repository.getOperationFactory(); - Query query = operationFactory.buildQueryByExample(example); - query.includeRoot(); - Result result = repository.executeQuery(context, query); - setValueForRootEntities(entities, result); - return result.getCount(); - } - return 0L; + public UnionEntityJoiner(CommonRepository repository, int entitiesSize) { + super(repository, entitiesSize); } - private Example newExample(Context context, List entities) { + @Override + public Example newExample(Context context, List entities) { PropChain anchorPoint = repository.getAnchorPoint(); PropChain lastPropChain = anchorPoint.getLastPropChain(); UnionExample unionExample = new UnionExample(); @@ -68,75 +50,53 @@ public class UnionEntityHandler implements EntityHandler { Object lastEntity = lastPropChain == null ? entity : lastPropChain.getValue(entity); if (lastEntity != null) { Example example = newExample(context, entity); - if (example.isNotEmpty()) { - example.selectExtra((index + 1) + " as $row"); - unionExample.addExample(example); + if (example.isEmpty()) { + continue; } + String row = Integer.toString(index + 1); + example.selectExtra(row + " as $row"); + unionExample.addExample(example); + addToRootIndex(entity, row); } } return unionExample; } private Example newExample(Context context, Object entity) { - BinderResolver binderResolver = repository.getBinderResolver(); Example example = new InnerExample(); - for (PropertyBinder binder : binderResolver.getPropertyBinders()) { - String fieldName = binder.getFieldName(); + List binders = repository.getBinderResolver().getPropertyBinders(); + for (PropertyBinder binder : binders) { Object boundValue = binder.getBoundValue(context, entity); if (boundValue instanceof Collection) { - boundValue = !((Collection) boundValue).isEmpty() ? boundValue : null; + if (((Collection) boundValue).isEmpty()) { + boundValue = null; + } } - if (boundValue != null) { - boundValue = binder.input(context, boundValue); - example.eq(fieldName, boundValue); - } else { + if (boundValue == null) { example.getCriteria().clear(); break; } - } - if (example.isNotEmpty()) { - for (ContextBinder binder : binderResolver.getContextBinders()) { - String fieldName = binder.getFieldName(); - Object boundValue = binder.getBoundValue(context, entity); - if (boundValue != null) { - example.eq(fieldName, boundValue); - } + boundValue = binder.input(context, boundValue); + if (boundValue == null) { + example.getCriteria().clear(); + break; } + String fieldName = binder.getFieldName(); + example.eq(fieldName, boundValue); } + appendContext(context, example); return example; } - private void setValueForRootEntities(List rootEntities, Result result) { - boolean isCollection = repository.getEntityEle().isCollection(); - PropChain anchorPoint = repository.getAnchorPoint(); - + @Override + protected void addToRecordIndex(Context context, List entities, Result result) { List> recordMaps = result.getRecordMaps(); - int averageSize = recordMaps.size() / rootEntities.size() + 1; - int lastRowNum = -1; - Collection lastCollection = null; - for (Map resultMap : recordMaps) { - Integer rowNum = NumberUtils.intValue(resultMap.get("$row")); + Object row = resultMap.get("$row"); Object entity = resultMap.get("$entity"); - - if (rowNum == lastRowNum) { - if (isCollection && lastCollection != null) { - lastCollection.add(entity); - } - - } else { - Object rootEntity = rootEntities.get(rowNum - 1); - if (isCollection) { - Collection collection = new ArrayList<>(averageSize); - collection.add(entity); - lastCollection = collection; - anchorPoint.setValue(rootEntity, collection); - } else { - anchorPoint.setValue(rootEntity, entity); - } + if (row != null && entity != null) { + addToRecordIndex(row.toString(), entity); } - - lastRowNum = rowNum; } } 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 a9ab5aaa..417ae98a 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 @@ -28,6 +28,7 @@ import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.api.impl.resolver.PropChainResolver; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; +import com.gitee.dorive.core.entity.option.JoinType; import com.gitee.dorive.core.impl.binder.ContextBinder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.processor.DefaultProcessor; @@ -54,7 +55,7 @@ public class BinderResolver { private List allBinders; private List propertyBinders; private Map> mergedBindersMap; - private boolean simpleRootBinding; + private JoinType joinType; private List selfFields; private List contextBinders; private List boundValueBinders; @@ -72,7 +73,7 @@ public class BinderResolver { allBinders = new ArrayList<>(bindingDefs.size()); propertyBinders = new ArrayList<>(bindingDefs.size()); mergedBindersMap = new LinkedHashMap<>(bindingDefs.size() * 4 / 3 + 1); - simpleRootBinding = false; + joinType = JoinType.UNKNOWN; selfFields = new ArrayList<>(bindingDefs.size()); contextBinders = new ArrayList<>(bindingDefs.size()); boundValueBinders = new ArrayList<>(bindingDefs.size()); @@ -123,7 +124,14 @@ public class BinderResolver { } if (mergedBindersMap.size() == 1 && mergedBindersMap.containsKey("/")) { - simpleRootBinding = CollUtil.findOne(mergedBindersMap.get("/"), PropertyBinder::isCollection) == null; + List binders = mergedBindersMap.get("/"); + boolean hasCollection = CollUtil.findOne(binders, PropertyBinder::isCollection) != null; + if (!hasCollection) { + joinType = binders.size() == 1 ? JoinType.SINGLE : JoinType.MULTI; + } + } + if (joinType == JoinType.UNKNOWN) { + joinType = JoinType.UNION; } selfFields = Collections.unmodifiableList(selfFields); } 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 b4b21034..ec6dd4a4 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 @@ -26,6 +26,8 @@ import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.util.ExampleUtils; import lombok.Getter; @@ -51,6 +53,10 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return getEntityDef().getName(); } + public boolean isCollection() { + return getEntityEle().isCollection(); + } + public Object getPrimaryKey(Object entity) { return getEntityEle().getPkProxy().getValue(entity); } @@ -59,6 +65,15 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return getEntityEle().hasField(field); } + public JoinType getJoinType() { + return binderResolver.getJoinType(); + } + + public List getRootBinders() { + Map> mergedBindersMap = binderResolver.getMergedBindersMap(); + return mergedBindersMap.get("/"); + } + @Override public boolean matches(Context context) { return matcher.matches(context); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java index 9ff20c5b..57ed1af7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/MultiInBuilder.java @@ -32,15 +32,15 @@ import java.util.stream.Collectors; public class MultiInBuilder { private List aliases; - private int number; private int size; + private int count; private List values; - public MultiInBuilder(List aliases, int number) { + public MultiInBuilder(List aliases, int count) { this.aliases = aliases; - this.number = number; this.size = aliases.size(); - this.values = new ArrayList<>(number * size); + this.count = count; + this.values = new ArrayList<>(count * size); } public boolean isEmpty() { @@ -51,10 +51,20 @@ public class MultiInBuilder { values.add(value); } + public void clearRemainder() { + int total = values.size(); + int remainder = total % size; + if (remainder != 0) { + values.subList(total - remainder, total).clear(); + } + } + public void clearLast() { - int size = values.size(); - int remainder = size % this.size; - values.subList(size - remainder, size).clear(); + int total = values.size(); + int remainder = total % size; + if (remainder == 0) { + values.subList(total - size, total).clear(); + } } public Criterion toCriterion() { diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java index 26c32b17..664fb992 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java @@ -143,7 +143,7 @@ public class DefaultQueryBuilder implements QueryBuilder { fieldValue = binder.output(context, fieldValue); builder.append(fieldValue); } else { - builder.clearLast(); + builder.clearRemainder(); break; } } -- Gitee From 3d67c2519521ac2317013ebc6440006cd4bbef9c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 14:14:34 +0800 Subject: [PATCH 108/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/UnionExample.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index dab7f1a3..ed6e92be 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -31,6 +31,15 @@ public class UnionExample extends Example { private List examples = new ArrayList<>(); + @Override + public void select(List fields) { + if (examples != null && !examples.isEmpty()) { + for (Example example : examples) { + example.select(fields); + } + } + } + @Override public boolean isEmpty() { return examples.isEmpty(); @@ -41,15 +50,6 @@ public class UnionExample extends Example { return !examples.isEmpty(); } - @Override - public void select(List fields) { - if (examples != null && !examples.isEmpty()) { - for (Example example : examples) { - example.select(fields); - } - } - } - public void addExample(Example example) { examples.add(example); } -- Gitee From 690794d036b4f4f7da55d59d7496669a6ff65a8e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 14:36:11 +0800 Subject: [PATCH 109/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/joiner/UnionEntityJoiner.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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 a1811514..ab95a238 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 @@ -48,16 +48,17 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { for (int index = 0; index < entities.size(); index++) { Object entity = entities.get(index); Object lastEntity = lastPropChain == null ? entity : lastPropChain.getValue(entity); - if (lastEntity != null) { - Example example = newExample(context, entity); - if (example.isEmpty()) { - continue; - } - String row = Integer.toString(index + 1); - example.selectExtra(row + " as $row"); - unionExample.addExample(example); - addToRootIndex(entity, row); + if (lastEntity == null) { + continue; + } + Example example = newExample(context, entity); + if (example.isEmpty()) { + continue; } + String row = Integer.toString(index + 1); + example.selectExtra(row + " as $row"); + unionExample.addExample(example); + addToRootIndex(entity, row); } return unionExample; } -- Gitee From b9d9ea20608c80d1a5ad90db320f738915b8ed03 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 14:59:32 +0800 Subject: [PATCH 110/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=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/repository/CommonRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 ec6dd4a4..d7c5a7f9 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 @@ -70,8 +70,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher } public List getRootBinders() { - Map> mergedBindersMap = binderResolver.getMergedBindersMap(); - return mergedBindersMap.get("/"); + return binderResolver.getMergedBindersMap().get("/"); } @Override -- Gitee From d232777d296e3fc66baff4424a65951534fd47de Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 15:15:26 +0800 Subject: [PATCH 111/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/handler/BatchEntityHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index 65ebc0e3..58dcfb71 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -46,7 +46,7 @@ public class BatchEntityHandler implements EntityHandler { long totalCount = 0L; for (CommonRepository repository : this.repository.getSubRepositories()) { if (repository.matches(context)) { - EntityJoiner entityJoiner = getEntityJoiner(repository, entities); + EntityJoiner entityJoiner = getEntityJoiner(repository, entities.size()); if (entityJoiner == null) { continue; } @@ -65,9 +65,8 @@ public class BatchEntityHandler implements EntityHandler { return totalCount; } - protected EntityJoiner getEntityJoiner(CommonRepository repository, List entities) { + protected EntityJoiner getEntityJoiner(CommonRepository repository, int entitiesSize) { JoinType joinType = repository.getJoinType(); - int entitiesSize = entities.size(); if (joinType == JoinType.SINGLE) { return new SingleEntityJoiner(repository, entitiesSize); -- Gitee From f74553668f771654a7351c1c853f479abd377d9e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 15:30:09 +0800 Subject: [PATCH 112/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 9427e5e5..93617970 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 @@ -112,10 +112,9 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { } PropChain anchorPoint = repository.getAnchorPoint(); Object value = anchorPoint.getValue(entity); - if (value != null) { - return; + if (value == null) { + anchorPoint.setValue(entity, object); } - anchorPoint.setValue(entity, object); } protected abstract void addToRecordIndex(Context context, List entities, Result result); -- Gitee From 51a8cdb7596c0373a43fbf57d84917c19d5ef81b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 16:57:39 +0800 Subject: [PATCH 113/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=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/joiner/AbstractEntityJoiner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 93617970..cad81610 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 @@ -58,9 +58,9 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { BinderResolver binderResolver = repository.getBinderResolver(); List contextBinders = binderResolver.getContextBinders(); for (ContextBinder contextBinder : contextBinders) { - String fieldName = contextBinder.getFieldName(); Object boundValue = contextBinder.getBoundValue(context, null); if (boundValue != null) { + String fieldName = contextBinder.getFieldName(); example.eq(fieldName, boundValue); } } -- Gitee From 70b860dd367aaf066accc1bf0724ce927a737ef0 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 17:01:01 +0800 Subject: [PATCH 114/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 cad81610..c4d83d43 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 @@ -87,8 +87,7 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { if (StringUtils.isBlank(key) || entity == null) { return; } - boolean isCollection = repository.isCollection(); - if (isCollection) { + if (repository.isCollection()) { Collection collection = (Collection) recordIndex.computeIfAbsent(key, k -> new ArrayList<>(averageSize)); collection.add(entity); } else { -- Gitee From c93f3da709930e3ca700d62a090d02d28e2efd0a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 17:14:49 +0800 Subject: [PATCH 115/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/joiner/AbstractEntityJoiner.java | 4 ++-- .../com/gitee/dorive/core/impl/joiner/MultiEntityJoiner.java | 2 +- .../com/gitee/dorive/core/impl/joiner/SingleEntityJoiner.java | 2 +- .../com/gitee/dorive/core/impl/joiner/UnionEntityJoiner.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) 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 c4d83d43..bbe7b8f9 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 @@ -78,7 +78,7 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { public void join(Context context, List entities, Result result) { List records = result.getRecords(); averageSize = records.size() / entities.size() + 1; - addToRecordIndex(context, entities, result); + buildRecordIndex(context, entities, result); joinMany(entities); } @@ -116,6 +116,6 @@ public abstract class AbstractEntityJoiner implements EntityJoiner { } } - protected abstract void addToRecordIndex(Context context, List entities, Result result); + protected abstract void buildRecordIndex(Context context, List entities, Result result); } 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 35801b32..7baace06 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 @@ -90,7 +90,7 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { } @Override - protected void addToRecordIndex(Context context, List entities, Result result) { + protected void buildRecordIndex(Context context, List entities, Result result) { List records = result.getRecords(); for (Object entity : records) { StringBuilder keyBuilder = new StringBuilder(); 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 aecc83ee..870c33c1 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 @@ -77,7 +77,7 @@ public class SingleEntityJoiner extends AbstractEntityJoiner { } @Override - protected void addToRecordIndex(Context context, List entities, Result result) { + protected void buildRecordIndex(Context context, List entities, Result result) { List records = result.getRecords(); for (Object entity : records) { Object fieldValue = binder.getFieldValue(context, entity); 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 ab95a238..8ec7d37f 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 @@ -90,7 +90,7 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { } @Override - protected void addToRecordIndex(Context context, List entities, Result result) { + protected void buildRecordIndex(Context context, List entities, Result result) { List> recordMaps = result.getRecordMaps(); for (Map resultMap : recordMaps) { Object row = resultMap.get("$row"); -- Gitee From 41766dc3e9d389b6665330598a37bd669e8db1d6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 17:24:17 +0800 Subject: [PATCH 116/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/handler/BatchEntityHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index 58dcfb71..1c196901 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -46,7 +46,7 @@ public class BatchEntityHandler implements EntityHandler { long totalCount = 0L; for (CommonRepository repository : this.repository.getSubRepositories()) { if (repository.matches(context)) { - EntityJoiner entityJoiner = getEntityJoiner(repository, entities.size()); + EntityJoiner entityJoiner = newEntityJoiner(repository, entities.size()); if (entityJoiner == null) { continue; } @@ -65,7 +65,7 @@ public class BatchEntityHandler implements EntityHandler { return totalCount; } - protected EntityJoiner getEntityJoiner(CommonRepository repository, int entitiesSize) { + protected EntityJoiner newEntityJoiner(CommonRepository repository, int entitiesSize) { JoinType joinType = repository.getJoinType(); if (joinType == JoinType.SINGLE) { return new SingleEntityJoiner(repository, entitiesSize); -- Gitee From b093c60f9ef2b0a470ffcfd727f5c9186087fe69 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 31 Jan 2024 18:11:32 +0800 Subject: [PATCH 117/146] =?UTF-8?q?=E6=96=B0=E5=A2=9EEntityJoiner=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E5=B9=B6=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/joiner/MultiEntityJoiner.java | 23 ++++++++--------- .../core/impl/joiner/SingleEntityJoiner.java | 25 ++++++++----------- .../core/impl/joiner/UnionEntityJoiner.java | 13 +++++----- 3 files changed, 28 insertions(+), 33 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 7baace06..5f2d66fa 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 @@ -61,20 +61,18 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { StringBuilder keyBuilder = new StringBuilder(); for (PropertyBinder binder : binders) { Object boundValue = binder.getBoundValue(context, entity); - if (boundValue == null) { - multiInBuilder.clearRemainder(); - keyBuilder = null; - break; + if (boundValue != null) { + boundValue = binder.input(context, boundValue); } - boundValue = binder.input(context, boundValue); - if (boundValue == null) { + if (boundValue != null) { + multiInBuilder.append(boundValue); + String key = boundValue.toString(); + keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); + } else { multiInBuilder.clearRemainder(); keyBuilder = null; break; } - multiInBuilder.append(boundValue); - String key = boundValue.toString(); - keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); } if (keyBuilder != null && keyBuilder.length() > 0) { keyBuilder.deleteCharAt(keyBuilder.length() - 1); @@ -96,12 +94,13 @@ public class MultiEntityJoiner extends AbstractEntityJoiner { StringBuilder keyBuilder = new StringBuilder(); for (PropertyBinder binder : binders) { Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue == null) { + if (fieldValue != null) { + String key = fieldValue.toString(); + keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); + } else { keyBuilder = null; break; } - String key = fieldValue.toString(); - keyBuilder.append("(").append(key.length()).append(")").append(key).append(","); } if (keyBuilder != null && keyBuilder.length() > 0) { keyBuilder.deleteCharAt(keyBuilder.length() - 1); 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 870c33c1..166f981e 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 @@ -60,18 +60,16 @@ public class SingleEntityJoiner extends AbstractEntityJoiner { List boundValues = new ArrayList<>(entities.size()); for (Object entity : entities) { Object boundValue = binder.getBoundValue(context, entity); - if (boundValue == null) { - continue; + if (boundValue != null) { + boundValue = binder.input(context, boundValue); } - boundValue = binder.input(context, boundValue); - if (boundValue == null) { - continue; + if (boundValue != null) { + String key = boundValue.toString(); + if (!keys.contains(key)) { + boundValues.add(boundValue); + } + addToRootIndex(entity, key); } - String key = boundValue.toString(); - if (!keys.contains(key)) { - boundValues.add(boundValue); - } - addToRootIndex(entity, key); } return boundValues; } @@ -81,11 +79,10 @@ public class SingleEntityJoiner extends AbstractEntityJoiner { List records = result.getRecords(); for (Object entity : records) { Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue == null) { - continue; + if (fieldValue != null) { + String key = fieldValue.toString(); + addToRecordIndex(key, entity); } - String key = fieldValue.toString(); - addToRecordIndex(key, entity); } } 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 8ec7d37f..32766cf8 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 @@ -73,17 +73,16 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { boundValue = null; } } - if (boundValue == null) { - example.getCriteria().clear(); - break; + if (boundValue != null) { + boundValue = binder.input(context, boundValue); } - boundValue = binder.input(context, boundValue); - if (boundValue == null) { + if (boundValue != null) { + String fieldName = binder.getFieldName(); + example.eq(fieldName, boundValue); + } else { example.getCriteria().clear(); break; } - String fieldName = binder.getFieldName(); - example.eq(fieldName, boundValue); } appendContext(context, example); return example; -- Gitee From 00e8da50c3a88db5bb680927a50aeaf7b820bdd8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 1 Feb 2024 14:00:27 +0800 Subject: [PATCH 118/146] =?UTF-8?q?=E8=B0=83=E6=95=B4Context=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/context/Context.java | 7 -- .../context/Options.java} | 13 ++- .../dorive/core/api/context/Selector.java | 2 +- .../core/entity/context/AbstractContext.java | 13 ++- .../core/entity/context/BoundedContext.java | 7 +- .../core/entity/context/InnerContext.java | 8 +- .../core/entity/context/StaticContext.java | 53 --------- .../SelectType.java} | 20 ++-- .../core/impl/context/NameSelector.java | 9 ++ ...ionMatcher.java => SelectTypeMatcher.java} | 22 ++-- .../repository/AbstractContextRepository.java | 4 +- .../AbstractTransformRepository.java | 100 ----------------- .../repository/AbstractQueryRepository.java | 13 +-- .../dorive/ref/api/OptionsRepository.java | 106 ++++++++++++++++++ .../java/com/gitee/dorive/ref/api/Ref.java | 3 +- .../java/com/gitee/dorive/ref/api/RefObj.java | 7 ++ .../com/gitee/dorive/ref/impl/RefObjImpl.java | 26 +++-- .../ref/repository/AbstractRefRepository.java | 3 +- 18 files changed, 198 insertions(+), 218 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/{entity/option/Selection.java => api/context/Options.java} (86%) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{context/NameContext.java => option/SelectType.java} (69%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/context/{SelectionMatcher.java => SelectTypeMatcher.java} (75%) create mode 100644 dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index e1787496..d9e69716 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -17,17 +17,10 @@ package com.gitee.dorive.core.api.context; -import com.gitee.dorive.core.entity.context.StaticContext; -import com.gitee.dorive.core.entity.option.Selection; - import java.util.Map; public interface Context { - Context NONE = new StaticContext(Selection.NONE); - Context ROOT = new StaticContext(Selection.ROOT); - Context ALL = new StaticContext(Selection.ALL); - Map, Object> getOptions(); Map getAttachments(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java similarity index 86% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java index d77d2061..8bb19cca 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/Selection.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java @@ -15,11 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.api.context; + +import java.util.Map; + +public interface Options { + + Map, Object> get(); -public enum Selection { - NONE, - ROOT, - ALL, - NAME } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java index 36c2db6f..af7f7df6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Selector.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.api.context; import java.util.List; import java.util.Set; -public interface Selector { +public interface Selector extends Options { Set getNames(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 48d09c63..de1014d1 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -18,20 +18,27 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.option.Selection; +import com.gitee.dorive.core.api.context.Options; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.LinkedHashMap; import java.util.Map; @Data +@NoArgsConstructor public abstract class AbstractContext implements Context { protected Map, Object> options = new LinkedHashMap<>(4); protected Map attachments = new LinkedHashMap<>(8); - public AbstractContext() { - this.options.put(Selection.class, Selection.NONE); + public AbstractContext(Options options) { + this.options.putAll(options.get()); + } + + public AbstractContext(Context anotherContext) { + this.options.putAll(anotherContext.getOptions()); + this.attachments.putAll(anotherContext.getAttachments()); } public Object put(String key, Object value) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java index 3a552f3d..9174f445 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java @@ -18,10 +18,15 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import lombok.NoArgsConstructor; @NoArgsConstructor -public class BoundedContext extends InnerContext { +public class BoundedContext extends AbstractContext { + + public BoundedContext(Options options) { + super(options); + } public BoundedContext(Context anotherContext) { super(anotherContext); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java index 5e2cd414..b70e6f8a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java @@ -18,14 +18,18 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import lombok.NoArgsConstructor; @NoArgsConstructor public class InnerContext extends AbstractContext { + public InnerContext(Options options) { + super(options); + } + public InnerContext(Context anotherContext) { - this.options.putAll(anotherContext.getOptions()); - this.attachments.putAll(anotherContext.getAttachments()); + super(anotherContext); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java deleted file mode 100644 index 100ee29c..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/StaticContext.java +++ /dev/null @@ -1,53 +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.entity.context; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.Selection; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -public class StaticContext implements Context { - - private Map, Object> options = new LinkedHashMap<>(3); - - public StaticContext(Selection selection) { - this.options.put(Selection.class, selection); - this.options = Collections.unmodifiableMap(this.options); - } - - public StaticContext(Selection selection, Selector selector) { - this.options.put(Selection.class, selection); - this.options.put(Selector.class, selector); - this.options = Collections.unmodifiableMap(this.options); - } - - @Override - public Map, Object> getOptions() { - return options; - } - - @Override - public Map getAttachments() { - return Collections.emptyMap(); - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java similarity index 69% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java index c044a083..de127ba8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/NameContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java @@ -15,15 +15,21 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.context; +package com.gitee.dorive.core.entity.option; -import com.gitee.dorive.core.entity.option.Selection; -import com.gitee.dorive.core.impl.context.NameSelector; +import com.gitee.dorive.core.api.context.Options; -public class NameContext extends StaticContext { +import java.util.Collections; +import java.util.Map; - public NameContext(String... names) { - super(Selection.NAME, new NameSelector(names)); - } +public enum SelectType implements Options { + NONE, + ROOT, + ALL, + NAME; + @Override + public Map, Object> get() { + return Collections.singletonMap(SelectType.class, this); + } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java index b450bb18..180f666a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java @@ -19,6 +19,7 @@ package com.gitee.dorive.core.impl.context; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.option.SelectType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -70,6 +71,14 @@ public class NameSelector implements Selector { return nameDef != null && !nameDef.getProperties().isEmpty() ? nameDef.getProperties() : null; } + @Override + public Map, Object> get() { + Map, Object> options = new LinkedHashMap<>(3); + options.put(SelectType.class, SelectType.NAME); + options.put(Selector.class, this); + return options; + } + @Data @AllArgsConstructor public static class NameDef { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java similarity index 75% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index 3c937328..d0102937 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectionMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.Selection; +import com.gitee.dorive.core.entity.option.SelectType; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; import lombok.Setter; @@ -34,25 +34,25 @@ import java.util.Set; */ @Getter @Setter -public class SelectionMatcher implements Matcher { +public class SelectTypeMatcher implements Matcher { private CommonRepository repository; - private Map matcherMap = new LinkedHashMap<>(8); + private Map matcherMap = new LinkedHashMap<>(8); - public SelectionMatcher(CommonRepository repository) { + public SelectTypeMatcher(CommonRepository repository) { this.repository = repository; - this.matcherMap.put(Selection.NONE, context -> false); - this.matcherMap.put(Selection.ROOT, context -> repository.isRoot()); - this.matcherMap.put(Selection.ALL, context -> true); - this.matcherMap.put(Selection.NAME, new NameMatcher()); + this.matcherMap.put(SelectType.NONE, context -> false); + this.matcherMap.put(SelectType.ROOT, context -> repository.isRoot()); + this.matcherMap.put(SelectType.ALL, context -> true); + this.matcherMap.put(SelectType.NAME, new NameMatcher()); } @Override public boolean matches(Context context) { Map, Object> options = context.getOptions(); - Selection selection = (Selection) options.get(Selection.class); - if (selection != null) { - Matcher matcher = matcherMap.get(selection); + SelectType selectType = (SelectType) options.get(SelectType.class); + if (selectType != null) { + Matcher matcher = matcherMap.get(selectType); if (matcher != null) { return matcher.matches(context); } 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 7b46991d..993c1524 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 @@ -34,7 +34,7 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.impl.context.SelectionMatcher; +import com.gitee.dorive.core.impl.context.SelectTypeMatcher; import com.gitee.dorive.core.impl.converter.DefaultEntityFactory; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; @@ -156,7 +156,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor repository.setAnchorPoint(anchorPoint); repository.setBinderResolver(binderResolver); repository.setBoundEntity(false); - repository.setMatcher(new SelectionMatcher(repository)); + repository.setMatcher(new SelectTypeMatcher(repository)); return repository; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java index d3c0b8d4..10959abf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java @@ -18,30 +18,17 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.core.util.ExampleUtils; import java.util.List; public abstract class AbstractTransformRepository extends AbstractGenericRepository { - @Override - public E selectByPrimaryKey(Context context, PK primaryKey) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.selectByPrimaryKey(context, primaryKey); - } - @Override public List selectByExample(Context context, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -50,9 +37,6 @@ public abstract class AbstractTransformRepository extends AbstractGeneric @Override public E selectOneByExample(Context context, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -61,9 +45,6 @@ public abstract class AbstractTransformRepository extends AbstractGeneric @Override public Page selectPageByExample(Context context, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } @@ -72,107 +53,26 @@ public abstract class AbstractTransformRepository extends AbstractGeneric @Override public long selectCountByExample(Context context, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.selectCountByExample(context, example); } - @Override - public int insert(Context context, E entity) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.insert(context, entity); - } - - @Override - public int update(Context context, E entity) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.update(context, entity); - } - @Override public int updateByExample(Context context, Object entity, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.updateByExample(context, entity, example); } - @Override - public int insertOrUpdate(Context context, E entity) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.insertOrUpdate(context, entity); - } - - @Override - public int delete(Context context, E entity) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.delete(context, entity); - } - - @Override - public int deleteByPrimaryKey(Context context, PK primaryKey) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.deleteByPrimaryKey(context, primaryKey); - } - @Override public int deleteByExample(Context context, Example example) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); } return super.deleteByExample(context, example); } - @Override - public int insertList(Context context, List entities) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.insertList(context, entities); - } - - @Override - public int updateList(Context context, List entities) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.updateList(context, entities); - } - - @Override - public int insertOrUpdateList(Context context, List entities) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.insertOrUpdateList(context, entities); - } - - @Override - public int deleteList(Context context, List entities) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } - return super.deleteList(context, entities); - } - } 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 b0ab7c55..2e7f9cf4 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 @@ -20,18 +20,16 @@ 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.entity.context.InnerContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.event.repository.AbstractEventRepository; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.query.entity.def.QueryScanDef; import com.gitee.dorive.query.impl.builder.DefaultQueryBuilder; -import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.builder.QueryResolver; +import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Data; import lombok.EqualsAndHashCode; @@ -93,9 +91,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public List selectByQuery(Context context, Object query) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -111,9 +106,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Context context, Object query) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -132,9 +124,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public long selectCountByQuery(Context context, Object query) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } BuildQuery buildQuery = newQuery(context, query, true); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java new file mode 100644 index 00000000..385f0340 --- /dev/null +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.ref.api; + +import com.gitee.dorive.core.api.context.Options; +import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.query.api.QueryRepository; + +import java.util.List; + +public interface OptionsRepository extends QueryRepository { + + default E selectByPrimaryKey(Options options, PK primaryKey) { + return selectByPrimaryKey(new InnerContext(options), primaryKey); + } + + default List selectByExample(Options options, Example example) { + return selectByExample(new InnerContext(options), example); + } + + default E selectOneByExample(Options options, Example example) { + return selectOneByExample(new InnerContext(options), example); + } + + default Page selectPageByExample(Options options, Example example) { + return selectPageByExample(new InnerContext(options), example); + } + + default long selectCountByExample(Options options, Example example) { + return selectCountByExample(new InnerContext(options), example); + } + + default int insert(Options options, E entity) { + return insert(new InnerContext(options), entity); + } + + default int update(Options options, E entity) { + return update(new InnerContext(options), entity); + } + + default int updateByExample(Options options, Object entity, Example example) { + return updateByExample(new InnerContext(options), entity, example); + } + + default int insertOrUpdate(Options options, E entity) { + return insertOrUpdate(new InnerContext(options), entity); + } + + default int delete(Options options, E entity) { + return delete(new InnerContext(options), entity); + } + + default int deleteByPrimaryKey(Options options, PK primaryKey) { + return deleteByPrimaryKey(new InnerContext(options), primaryKey); + } + + default int deleteByExample(Options options, Example example) { + return deleteByExample(new InnerContext(options), example); + } + + default int insertList(Options options, List entities) { + return insertList(new InnerContext(options), entities); + } + + default int updateList(Options options, List entities) { + return updateList(new InnerContext(options), entities); + } + + default int insertOrUpdateList(Options options, List entities) { + return insertOrUpdateList(new InnerContext(options), entities); + } + + default int deleteList(Options options, List entities) { + return deleteList(new InnerContext(options), entities); + } + + default List selectByQuery(Options options, Object query) { + return selectByQuery(new InnerContext(options), query); + } + + default Page selectPageByQuery(Options options, Object query) { + return selectPageByQuery(new InnerContext(options), query); + } + + default long selectCountByQuery(Options options, Object query) { + return selectCountByQuery(new InnerContext(options), query); + } + +} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java index 746fc2a2..5545b9d3 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java @@ -17,10 +17,9 @@ package com.gitee.dorive.ref.api; -import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.ref.repository.AbstractRefRepository; -public interface Ref extends QueryRepository { +public interface Ref extends OptionsRepository { > R get(); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java index f00d7c9c..15b0fca4 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java @@ -18,6 +18,7 @@ package com.gitee.dorive.ref.api; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; public interface RefObj { @@ -27,4 +28,10 @@ public interface RefObj { int delete(Context context); + long select(Options options); + + int insertOrUpdate(Options options); + + int delete(Options options); + } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java index 199e40ad..65e38bbe 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java @@ -18,10 +18,10 @@ package com.gitee.dorive.ref.impl; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.context.InnerContext; import com.gitee.dorive.core.repository.AbstractRepository; -import com.gitee.dorive.core.util.ContextUtils; import com.gitee.dorive.ref.api.RefObj; import lombok.AllArgsConstructor; import lombok.Data; @@ -37,29 +37,35 @@ public class RefObjImpl implements RefObj { @Override public long select(Context context) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } EntityHandler entityHandler = ref.getEntityHandler(); return entityHandler.handle(context, Collections.singletonList(object)); } @Override public int insertOrUpdate(Context context) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } AbstractRepository repository = ref.getProxyRepository(); return repository.insertOrUpdate(context, object); } @Override public int delete(Context context) { - if (!(context instanceof InnerContext)) { - context = ContextUtils.clone(context); - } AbstractRepository repository = ref.getProxyRepository(); return repository.delete(context, object); } + @Override + public long select(Options options) { + return select(new InnerContext(options)); + } + + @Override + public int insertOrUpdate(Options options) { + return insertOrUpdate(new InnerContext(options)); + } + + @Override + public int delete(Options options) { + return delete(new InnerContext(options)); + } + } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index 4ed929e0..9e45143f 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -19,9 +19,10 @@ package com.gitee.dorive.ref.repository; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.query.repository.AbstractQueryRepository; +import com.gitee.dorive.ref.api.OptionsRepository; import com.gitee.dorive.ref.impl.RefInjector; -public abstract class AbstractRefRepository extends AbstractQueryRepository { +public abstract class AbstractRefRepository extends AbstractQueryRepository implements OptionsRepository { @Override protected EntityHandler processEntityHandler(EntityHandler entityHandler) { -- Gitee From 3bf7153ef0ca42f0d4ac572a9a236333708c9997 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 1 Feb 2024 14:20:52 +0800 Subject: [PATCH 119/146] =?UTF-8?q?=E8=B0=83=E6=95=B4Context=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/core/api/context/Context.java | 6 ++++++ .../dorive/core/entity/option/SelectType.java | 14 ++------------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index d9e69716..d5a17dec 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -17,10 +17,16 @@ package com.gitee.dorive.core.api.context; +import com.gitee.dorive.core.entity.option.SelectType; + +import java.util.Collections; import java.util.Map; public interface Context { + Options ROOT = () -> Collections.singletonMap(SelectType.class, SelectType.ROOT); + Options ALL = () -> Collections.singletonMap(SelectType.class, SelectType.ALL); + Map, Object> getOptions(); Map getAttachments(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java index de127ba8..0fec47a3 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java @@ -17,19 +17,9 @@ package com.gitee.dorive.core.entity.option; -import com.gitee.dorive.core.api.context.Options; - -import java.util.Collections; -import java.util.Map; - -public enum SelectType implements Options { +public enum SelectType { NONE, ROOT, ALL, - NAME; - - @Override - public Map, Object> get() { - return Collections.singletonMap(SelectType.class, this); - } + NAME } -- Gitee From 0878df1e1c5185f0b40eee5707b553673779f182 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 1 Feb 2024 14:51:18 +0800 Subject: [PATCH 120/146] =?UTF-8?q?=E8=B0=83=E6=95=B4Context=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/core/entity/option/SelectType.java | 2 +- .../java/com/gitee/dorive/core/impl/context/NameSelector.java | 2 +- .../com/gitee/dorive/core/impl/context/SelectTypeMatcher.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java index 0fec47a3..46827789 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java @@ -21,5 +21,5 @@ public enum SelectType { NONE, ROOT, ALL, - NAME + SELECTOR } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java index 180f666a..aeaeadec 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java @@ -74,7 +74,7 @@ public class NameSelector implements Selector { @Override public Map, Object> get() { Map, Object> options = new LinkedHashMap<>(3); - options.put(SelectType.class, SelectType.NAME); + options.put(SelectType.class, SelectType.SELECTOR); options.put(Selector.class, this); return options; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index d0102937..611e3dc9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -44,7 +44,7 @@ public class SelectTypeMatcher implements Matcher { this.matcherMap.put(SelectType.NONE, context -> false); this.matcherMap.put(SelectType.ROOT, context -> repository.isRoot()); this.matcherMap.put(SelectType.ALL, context -> true); - this.matcherMap.put(SelectType.NAME, new NameMatcher()); + this.matcherMap.put(SelectType.SELECTOR, new SelectorMatcher()); } @Override @@ -60,7 +60,7 @@ public class SelectTypeMatcher implements Matcher { return false; } - private class NameMatcher implements Matcher { + private class SelectorMatcher implements Matcher { @Override public boolean matches(Context context) { Map, Object> options = context.getOptions(); -- Gitee From 1ab19867fdcff25edf7a06a16cb71702ab7323f7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 2 Feb 2024 15:31:38 +0800 Subject: [PATCH 121/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86=E6=8E=A5=E5=8F=A3=E8=A7=84=E8=8C=83=E4=B8=AD=E7=9A=84?= =?UTF-8?q?Context=E6=9B=BF=E6=8D=A2=E4=B8=BAOptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/context/Context.java | 14 +- .../dorive/core/api/context/Options.java | 14 +- .../api/repository/ListableRepository.java | 10 +- .../core/api/repository/Repository.java | 50 ++--- .../core/entity/context/AbstractContext.java | 38 +++- .../context/EnumOptions.java} | 57 ++--- .../core/impl/binder/ContextBinder.java | 8 +- .../core/impl/context/AbstractSelector.java | 55 +++++ .../core/impl/context/NameSelector.java | 12 +- .../core/impl/context/SelectTypeMatcher.java | 6 +- .../repository/AbstractGenericRepository.java | 43 ++-- .../repository/AbstractProxyRepository.java | 45 ++-- .../core/repository/AbstractRepository.java | 49 ++--- .../core/repository/CommonRepository.java | 4 +- .../repository/AbstractEventRepository.java | 4 +- .../repository/MybatisPlusRepository.java | 3 +- .../dorive/query/api/QueryRepository.java | 8 +- .../repository/AbstractQueryRepository.java | 10 +- .../dorive/ref/api/OptionsRepository.java | 106 --------- .../java/com/gitee/dorive/ref/api/Ref.java | 3 +- .../java/com/gitee/dorive/ref/api/RefObj.java | 7 - .../com/gitee/dorive/ref/impl/RefImpl.java | 30 +-- .../com/gitee/dorive/ref/impl/RefObjImpl.java | 36 ++-- .../repository/AbstractInnerRepository.java | 203 ++++++++++++++++++ .../ref/repository/AbstractRefRepository.java | 4 +- 25 files changed, 473 insertions(+), 346 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/{repository/AbstractTransformRepository.java => entity/context/EnumOptions.java} (31%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java delete mode 100644 dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java create mode 100644 dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java index d5a17dec..ea47340a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Context.java @@ -17,18 +17,16 @@ package com.gitee.dorive.core.api.context; -import com.gitee.dorive.core.entity.option.SelectType; - -import java.util.Collections; import java.util.Map; -public interface Context { +public interface Context extends Options { + + Map getAttachments(); - Options ROOT = () -> Collections.singletonMap(SelectType.class, SelectType.ROOT); - Options ALL = () -> Collections.singletonMap(SelectType.class, SelectType.ALL); + void setAttachment(String name, Object value); - Map, Object> getOptions(); + Object getAttachment(String name); - Map getAttachments(); + void removeAttachment(String name); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java index 8bb19cca..545275e7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java @@ -17,10 +17,22 @@ package com.gitee.dorive.core.api.context; +import com.gitee.dorive.core.entity.context.EnumOptions; +import com.gitee.dorive.core.entity.option.SelectType; + import java.util.Map; public interface Options { - Map, Object> get(); + Options ROOT = new EnumOptions(SelectType.class, SelectType.ROOT); + Options ALL = new EnumOptions(SelectType.class, SelectType.ALL); + + Map, Object> getOptions(); + + void setOption(Class type, Object value); + + Object getOption(Class type); + + void removeOption(Class type); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/ListableRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/ListableRepository.java index 9c770fd7..ac2a6614 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/ListableRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/ListableRepository.java @@ -17,18 +17,18 @@ package com.gitee.dorive.core.api.repository; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import java.util.List; public interface ListableRepository extends Repository { - int insertList(Context context, List entities); + int insertList(Options options, List entities); - int updateList(Context context, List entities); + int updateList(Options options, List entities); - int insertOrUpdateList(Context context, List entities); + int insertOrUpdateList(Options options, List entities); - int deleteList(Context context, List entities); + int deleteList(Options options, List entities); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java index 007fc498..c6681e98 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.api.repository; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; @@ -34,112 +34,112 @@ public interface Repository { /** * 根据主键,查询实体 * - * @param context 上下文 + * @param options 可选项 * @param primaryKey 主键 * @return 实体 */ - E selectByPrimaryKey(Context context, PK primaryKey); + E selectByPrimaryKey(Options options, PK primaryKey); /** * 根据条件,查询实体 * - * @param context 上下文 + * @param options 可选项 * @param example 条件 * @return 实体 */ - List selectByExample(Context context, Example example); + List selectByExample(Options options, Example example); /** * 根据条件,查询实体 * 如果存在多条记录,取第一条 * - * @param context 上下文 + * @param options 可选项 * @param example 条件 * @return 实体 */ - E selectOneByExample(Context context, Example example); + E selectOneByExample(Options options, Example example); /** * 根据条件,查询分页 * - * @param context 上下文 + * @param options 可选项 * @param example 条件 * @return 分页 */ - Page selectPageByExample(Context context, Example example); + Page selectPageByExample(Options options, Example example); /** * 根据条件,查询计数 * - * @param context 上下文 + * @param options 可选项 * @param example 条件 * @return 计数 */ - long selectCountByExample(Context context, Example example); + long selectCountByExample(Options options, Example example); /** * 插入一个实体 * - * @param context 上下文 + * @param options 可选项 * @param entity 实体 * @return 操作数 */ - int insert(Context context, E entity); + int insert(Options options, E entity); /** * 根据实体的主键,修改一个实体 * - * @param context 上下文 + * @param options 可选项 * @param entity 实体 * @return 操作数 */ - int update(Context context, E entity); + int update(Options options, E entity); /** * 根据实体和条件,修改聚合内的所有实体 * - * @param context 上下文 + * @param options 可选项 * @param entity 实体 * @param example 条件 * @return 操作数 */ - int updateByExample(Context context, Object entity, Example example); + int updateByExample(Options options, Object entity, Example example); /** * 根据实体的主键,插入或者修改一个实体。 * 主键为空则插入,主键非空则修改。 * - * @param context 上下文 + * @param options 可选项 * @param entity 实体 * @return 操作数 */ - int insertOrUpdate(Context context, E entity); + int insertOrUpdate(Options options, E entity); /** * 根据实体的主键,删除一个实体 * - * @param context 上下文 + * @param options 可选项 * @param entity 实体 * @return 操作数 */ - int delete(Context context, E entity); + int delete(Options options, E entity); /** * 根据主键,删除一个实体 * - * @param context 上下文 + * @param options 可选项 * @param primaryKey 主键 * @return 操作数 */ - int deleteByPrimaryKey(Context context, PK primaryKey); + int deleteByPrimaryKey(Options options, PK primaryKey); /** * 根据条件,删除聚合内的所有实体 * - * @param context 上下文 + * @param options 可选项 * @param example 条件 * @return 操作数 */ - int deleteByExample(Context context, Example example); + int deleteByExample(Options options, Example example); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index de1014d1..d011dcab 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -19,13 +19,15 @@ package com.gitee.dorive.core.entity.context; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.LinkedHashMap; import java.util.Map; -@Data +@Getter +@Setter @NoArgsConstructor public abstract class AbstractContext implements Context { @@ -33,7 +35,7 @@ public abstract class AbstractContext implements Context { protected Map attachments = new LinkedHashMap<>(8); public AbstractContext(Options options) { - this.options.putAll(options.get()); + this.options.putAll(options.getOptions()); } public AbstractContext(Context anotherContext) { @@ -41,20 +43,34 @@ public abstract class AbstractContext implements Context { this.attachments.putAll(anotherContext.getAttachments()); } - public Object put(String key, Object value) { - return attachments.put(key, value); + @Override + public void setOption(Class type, Object value) { + options.put(type, value); } - public boolean containsKey(String key) { - return attachments.containsKey(key); + @Override + public Object getOption(Class type) { + return options.get(type); } - public Object get(String key) { - return attachments.get(key); + @Override + public void removeOption(Class type) { + options.remove(type); } - public Object remove(String key) { - return attachments.remove(key); + @Override + public void setAttachment(String name, Object value) { + attachments.put(name, value); + } + + @Override + public Object getAttachment(String name) { + return attachments.get(name); + } + + @Override + public void removeAttachment(String name) { + attachments.remove(name); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java similarity index 31% rename from dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java index 10959abf..205c5001 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractTransformRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java @@ -15,64 +15,39 @@ * limitations under the License. */ -package com.gitee.dorive.core.repository; +package com.gitee.dorive.core.entity.context; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.InnerExample; -import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.util.ExampleUtils; +import com.gitee.dorive.core.api.context.Options; -import java.util.List; +import java.util.Collections; +import java.util.Map; -public abstract class AbstractTransformRepository extends AbstractGenericRepository { +public class EnumOptions implements Options { - @Override - public List selectByExample(Context context, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.selectByExample(context, example); - } + private final Map, Object> options; - @Override - public E selectOneByExample(Context context, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.selectOneByExample(context, example); + public EnumOptions(Class type, Object value) { + this.options = Collections.singletonMap(type, value); } @Override - public Page selectPageByExample(Context context, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.selectPageByExample(context, example); + public Map, Object> getOptions() { + return options; } @Override - public long selectCountByExample(Context context, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.selectCountByExample(context, example); + public void setOption(Class type, Object value) { + throw new UnsupportedOperationException(); } @Override - public int updateByExample(Context context, Object entity, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.updateByExample(context, entity, example); + public Object getOption(Class type) { + return options.get(type); } @Override - public int deleteByExample(Context context, Example example) { - if (!(example instanceof InnerExample)) { - example = ExampleUtils.clone(example); - } - return super.deleteByExample(context, example); + public void removeOption(Class type) { + throw new UnsupportedOperationException(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java index 79da64a8..30882a1f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/binder/ContextBinder.java @@ -18,11 +18,9 @@ package com.gitee.dorive.core.impl.binder; import com.gitee.dorive.api.entity.def.BindingDef; +import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.binder.Processor; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.api.entity.element.PropChain; - -import java.util.Map; public class ContextBinder extends AbstractBinder { @@ -32,9 +30,7 @@ public class ContextBinder extends AbstractBinder { @Override public Object getBoundValue(Context context, Object rootEntity) { - Map attachments = context.getAttachments(); - String bindExp = getBindingDef().getBindExp(); - return attachments.get(bindExp); + return context.getAttachment(getBindingDef().getBindExp()); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java new file mode 100644 index 00000000..ce1407e8 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java @@ -0,0 +1,55 @@ +/* + * 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.context; + +import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.option.SelectType; + +import java.util.LinkedHashMap; +import java.util.Map; + +public abstract class AbstractSelector implements Selector { + + private final Map, Object> options = new LinkedHashMap<>(3); + + public AbstractSelector() { + this.options.put(SelectType.class, SelectType.SELECTOR); + this.options.put(Selector.class, this); + } + + @Override + public Map, Object> getOptions() { + return options; + } + + @Override + public void setOption(Class type, Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public Object getOption(Class type) { + return options.get(type); + } + + @Override + public void removeOption(Class type) { + throw new UnsupportedOperationException(); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java index aeaeadec..0f254292 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/NameSelector.java @@ -18,8 +18,6 @@ package com.gitee.dorive.core.impl.context; import cn.hutool.core.util.StrUtil; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.SelectType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -33,7 +31,7 @@ import java.util.Set; @Data @EqualsAndHashCode(callSuper = false) -public class NameSelector implements Selector { +public class NameSelector extends AbstractSelector { private Set names = Collections.emptySet(); private Map nameDefMap = Collections.emptyMap(); @@ -71,14 +69,6 @@ public class NameSelector implements Selector { return nameDef != null && !nameDef.getProperties().isEmpty() ? nameDef.getProperties() : null; } - @Override - public Map, Object> get() { - Map, Object> options = new LinkedHashMap<>(3); - options.put(SelectType.class, SelectType.SELECTOR); - options.put(Selector.class, this); - return options; - } - @Data @AllArgsConstructor public static class NameDef { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index 611e3dc9..d9f3048e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -49,8 +49,7 @@ public class SelectTypeMatcher implements Matcher { @Override public boolean matches(Context context) { - Map, Object> options = context.getOptions(); - SelectType selectType = (SelectType) options.get(SelectType.class); + SelectType selectType = (SelectType) context.getOption(SelectType.class); if (selectType != null) { Matcher matcher = matcherMap.get(selectType); if (matcher != null) { @@ -63,8 +62,7 @@ public class SelectTypeMatcher implements Matcher { private class SelectorMatcher implements Matcher { @Override public boolean matches(Context context) { - Map, Object> options = context.getOptions(); - Selector selector = (Selector) options.get(Selector.class); + Selector selector = (Selector) context.getOption(Selector.class); if (selector != null) { Set names = selector.getNames(); String name = repository.getName(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java index 7ecae9ef..a8480cb4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -19,6 +19,7 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.InsertOrUpdate; @@ -30,69 +31,69 @@ import java.util.List; public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @Override - public long selectCountByExample(Context context, Example example) { + public long selectCountByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); CommonRepository repository = getRootRepository(); - return repository.selectCountByExample(context, example); + return repository.selectCountByExample(options, example); } @Override - public int updateByExample(Context context, Object entity, Example example) { + public int updateByExample(Options options, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { - if (repository.matches(context)) { - totalCount += repository.updateByExample(context, entity, ExampleUtils.clone(example)); + if (repository.matches((Context) options)) { + totalCount += repository.updateByExample(options, entity, ExampleUtils.clone(example)); } } return totalCount; } @Override - public int insertOrUpdate(Context context, E entity) { + public int insertOrUpdate(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); Operation operation = new InsertOrUpdate(entity); - return execute(context, operation); + return execute((Context) options, operation); } @Override - public int deleteByPrimaryKey(Context context, PK primaryKey) { + public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); - E entity = selectByPrimaryKey(context, primaryKey); - return delete(context, entity); + E entity = selectByPrimaryKey(options, primaryKey); + return delete(options, entity); } @Override - public int deleteByExample(Context context, Example example) { + public int deleteByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); int totalCount = 0; for (CommonRepository repository : getOrderedRepositories()) { - if (repository.matches(context)) { - totalCount += repository.deleteByExample(context, ExampleUtils.clone(example)); + if (repository.matches((Context) options)) { + totalCount += repository.deleteByExample(options, ExampleUtils.clone(example)); } } return totalCount; } @Override - public int insertList(Context context, List entities) { - return entities.stream().mapToInt(entity -> insert(context, entity)).sum(); + public int insertList(Options options, List entities) { + return entities.stream().mapToInt(entity -> insert(options, entity)).sum(); } @Override - public int updateList(Context context, List entities) { - return entities.stream().mapToInt(entity -> update(context, entity)).sum(); + public int updateList(Options options, List entities) { + return entities.stream().mapToInt(entity -> update(options, entity)).sum(); } @Override - public int insertOrUpdateList(Context context, List entities) { - return entities.stream().mapToInt(entity -> insertOrUpdate(context, entity)).sum(); + public int insertOrUpdateList(Options options, List entities) { + return entities.stream().mapToInt(entity -> insertOrUpdate(options, entity)).sum(); } @Override - public int deleteList(Context context, List entities) { - return entities.stream().mapToInt(entity -> delete(context, entity)).sum(); + public int deleteList(Options options, List entities) { + return entities.stream().mapToInt(entity -> delete(options, entity)).sum(); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index 01a18a73..f13a3b5e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; @@ -53,58 +54,58 @@ public abstract class AbstractProxyRepository extends AbstractRepository selectByExample(Context context, Example example) { - return proxyRepository.selectByExample(context, example); + public List selectByExample(Options options, Example example) { + return proxyRepository.selectByExample(options, example); } @Override - public Page selectPageByExample(Context context, Example example) { - return proxyRepository.selectPageByExample(context, example); + public Page selectPageByExample(Options options, Example example) { + return proxyRepository.selectPageByExample(options, example); } @Override - public long selectCountByExample(Context context, Example example) { - return proxyRepository.selectCountByExample(context, example); + public long selectCountByExample(Options options, Example example) { + return proxyRepository.selectCountByExample(options, example); } @Override - public int insert(Context context, Object entity) { - return proxyRepository.insert(context, entity); + public int insert(Options options, Object entity) { + return proxyRepository.insert(options, entity); } @Override - public int update(Context context, Object entity) { - return proxyRepository.update(context, entity); + public int update(Options options, Object entity) { + return proxyRepository.update(options, entity); } @Override - public int updateByExample(Context context, Object entity, Example example) { - return proxyRepository.updateByExample(context, entity, example); + public int updateByExample(Options options, Object entity, Example example) { + return proxyRepository.updateByExample(options, entity, example); } @Override - public int insertOrUpdate(Context context, Object entity) { - return proxyRepository.insertOrUpdate(context, entity); + public int insertOrUpdate(Options options, Object entity) { + return proxyRepository.insertOrUpdate(options, entity); } @Override - public int delete(Context context, Object entity) { - return proxyRepository.delete(context, entity); + public int delete(Options options, Object entity) { + return proxyRepository.delete(options, entity); } @Override - public int deleteByPrimaryKey(Context context, Object primaryKey) { - return proxyRepository.deleteByPrimaryKey(context, primaryKey); + public int deleteByPrimaryKey(Options options, Object primaryKey) { + return proxyRepository.deleteByPrimaryKey(options, primaryKey); } @Override - public int deleteByExample(Context context, Example example) { - return proxyRepository.deleteByExample(context, example); + public int deleteByExample(Options options, Example example) { + return proxyRepository.deleteByExample(options, example); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractRepository.java index f61ffa8e..fa6c1c9c 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 @@ -21,6 +21,7 @@ import cn.hutool.core.lang.Assert; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.repository.Repository; import com.gitee.dorive.core.entity.executor.Example; @@ -52,93 +53,93 @@ public abstract class AbstractRepository implements Repository, Ex @Override @SuppressWarnings("unchecked") - public E selectByPrimaryKey(Context context, PK primaryKey) { + public E selectByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); Query query = operationFactory.buildQueryByPK(primaryKey); - Result result = executeQuery(context, query); + Result result = executeQuery((Context) options, query); return (E) result.getRecord(); } @Override @SuppressWarnings("unchecked") - public List selectByExample(Context context, Example example) { + public List selectByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); Query query = operationFactory.buildQueryByExample(example); - Result result = executeQuery(context, query); + Result result = executeQuery((Context) options, query); return (List) result.getRecords(); } @Override - public E selectOneByExample(Context context, Example example) { - List entities = selectByExample(context, example); + public E selectOneByExample(Options options, Example example) { + List entities = selectByExample(options, example); return entities != null && !entities.isEmpty() ? entities.get(0) : null; } @Override @SuppressWarnings("unchecked") - public Page selectPageByExample(Context context, Example example) { + public Page selectPageByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); Assert.notNull(example.getPage(), "The page cannot be null!"); Query query = operationFactory.buildQueryByExample(example); - Result result = executeQuery(context, query); + Result result = executeQuery((Context) options, query); return (Page) result.getPage(); } @Override - public long selectCountByExample(Context context, Example example) { + public long selectCountByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); Query query = operationFactory.buildQueryByExample(example); - return executeCount(context, query); + return executeCount((Context) options, query); } @Override - public int insert(Context context, E entity) { + public int insert(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); Insert insert = operationFactory.buildInsert(entity); - return execute(context, insert); + return execute((Context) options, insert); } @Override - public int update(Context context, E entity) { + public int update(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); Update update = operationFactory.buildUpdate(entity); - return execute(context, update); + return execute((Context) options, update); } @Override - public int updateByExample(Context context, Object entity, Example example) { + public int updateByExample(Options options, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); Update update = operationFactory.buildUpdateByExample(entity, example); - return execute(context, update); + return execute((Context) options, update); } @Override - public int insertOrUpdate(Context context, E entity) { + public int insertOrUpdate(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); Operation operation = operationFactory.buildInsertOrUpdate(entity); - return execute(context, operation); + return execute((Context) options, operation); } @Override - public int delete(Context context, E entity) { + public int delete(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); Delete delete = operationFactory.buildDelete(entity); - return execute(context, delete); + return execute((Context) options, delete); } @Override - public int deleteByPrimaryKey(Context context, PK primaryKey) { + public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); Delete delete = operationFactory.buildDeleteByPK(primaryKey); - return execute(context, delete); + return execute((Context) options, delete); } @Override - public int deleteByExample(Context context, Example example) { + public int deleteByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); Delete delete = operationFactory.buildDeleteByExample(example); - return execute(context, delete); + return execute((Context) options, delete); } @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 d7c5a7f9..67ec785a 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 @@ -34,7 +34,6 @@ import lombok.Getter; import lombok.Setter; import java.util.List; -import java.util.Map; @Getter @Setter @@ -80,8 +79,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher @Override public Result executeQuery(Context context, Query query) { - Map, Object> options = context.getOptions(); - Selector selector = (Selector) options.get(Selector.class); + Selector selector = (Selector) context.getOption(Selector.class); if (selector != null) { List properties = selector.select(getName()); if (properties != null && !properties.isEmpty()) { diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java index c6d9a3a7..c90c7791 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -19,7 +19,7 @@ package com.gitee.dorive.event.repository; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.repository.AbstractTransformRepository; +import com.gitee.dorive.core.repository.AbstractGenericRepository; import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.DefaultRepository; @@ -27,7 +27,7 @@ import com.gitee.dorive.event.annotation.EnableEvent; import com.gitee.dorive.event.impl.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; -public abstract class AbstractEventRepository extends AbstractTransformRepository { +public abstract class AbstractEventRepository extends AbstractGenericRepository { private boolean enableEvent; 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 723eb61a..3c01ceae 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 @@ -115,8 +115,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { - Map, Object> options = context.getOptions(); - QueryStrategy queryStrategy = (QueryStrategy) options.get(QueryStrategy.class); + QueryStrategy queryStrategy = (QueryStrategy) context.getOption(QueryStrategy.class); if (queryStrategy == null || queryStrategy == QueryStrategy.SQL) { return sqlQueryBuilder; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java index 5047bf61..beb67a45 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryRepository.java @@ -17,7 +17,7 @@ package com.gitee.dorive.query.api; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Page; @@ -25,10 +25,10 @@ import java.util.List; public interface QueryRepository extends ListableRepository { - List selectByQuery(Context context, Object query); + List selectByQuery(Options options, Object query); - Page selectPageByQuery(Context context, Object query); + Page selectPageByQuery(Options options, Object query); - long selectCountByQuery(Context context, Object query); + long selectCountByQuery(Options options, 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 2e7f9cf4..cd846957 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 @@ -20,6 +20,7 @@ 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.Options; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.event.repository.AbstractEventRepository; @@ -90,7 +91,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } @Override - public List selectByQuery(Context context, Object query) { + public List selectByQuery(Options options, Object query) { + Context context = (Context) options; BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -105,7 +107,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") - public Page selectPageByQuery(Context context, Object query) { + public Page selectPageByQuery(Options options, Object query) { + Context context = (Context) options; BuildQuery buildQuery = newQuery(context, query, false); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { @@ -123,7 +126,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } @Override - public long selectCountByQuery(Context context, Object query) { + public long selectCountByQuery(Options options, Object query) { + Context context = (Context) options; BuildQuery buildQuery = newQuery(context, query, true); Example example = buildQuery.getExample(); if (buildQuery.isAbandoned()) { diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java deleted file mode 100644 index 385f0340..00000000 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/OptionsRepository.java +++ /dev/null @@ -1,106 +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.ref.api; - -import com.gitee.dorive.core.api.context.Options; -import com.gitee.dorive.core.entity.context.InnerContext; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.query.api.QueryRepository; - -import java.util.List; - -public interface OptionsRepository extends QueryRepository { - - default E selectByPrimaryKey(Options options, PK primaryKey) { - return selectByPrimaryKey(new InnerContext(options), primaryKey); - } - - default List selectByExample(Options options, Example example) { - return selectByExample(new InnerContext(options), example); - } - - default E selectOneByExample(Options options, Example example) { - return selectOneByExample(new InnerContext(options), example); - } - - default Page selectPageByExample(Options options, Example example) { - return selectPageByExample(new InnerContext(options), example); - } - - default long selectCountByExample(Options options, Example example) { - return selectCountByExample(new InnerContext(options), example); - } - - default int insert(Options options, E entity) { - return insert(new InnerContext(options), entity); - } - - default int update(Options options, E entity) { - return update(new InnerContext(options), entity); - } - - default int updateByExample(Options options, Object entity, Example example) { - return updateByExample(new InnerContext(options), entity, example); - } - - default int insertOrUpdate(Options options, E entity) { - return insertOrUpdate(new InnerContext(options), entity); - } - - default int delete(Options options, E entity) { - return delete(new InnerContext(options), entity); - } - - default int deleteByPrimaryKey(Options options, PK primaryKey) { - return deleteByPrimaryKey(new InnerContext(options), primaryKey); - } - - default int deleteByExample(Options options, Example example) { - return deleteByExample(new InnerContext(options), example); - } - - default int insertList(Options options, List entities) { - return insertList(new InnerContext(options), entities); - } - - default int updateList(Options options, List entities) { - return updateList(new InnerContext(options), entities); - } - - default int insertOrUpdateList(Options options, List entities) { - return insertOrUpdateList(new InnerContext(options), entities); - } - - default int deleteList(Options options, List entities) { - return deleteList(new InnerContext(options), entities); - } - - default List selectByQuery(Options options, Object query) { - return selectByQuery(new InnerContext(options), query); - } - - default Page selectPageByQuery(Options options, Object query) { - return selectPageByQuery(new InnerContext(options), query); - } - - default long selectCountByQuery(Options options, Object query) { - return selectCountByQuery(new InnerContext(options), query); - } - -} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java index 5545b9d3..746fc2a2 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/Ref.java @@ -17,9 +17,10 @@ package com.gitee.dorive.ref.api; +import com.gitee.dorive.query.api.QueryRepository; import com.gitee.dorive.ref.repository.AbstractRefRepository; -public interface Ref extends OptionsRepository { +public interface Ref extends QueryRepository { > R get(); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java index 15b0fca4..1bc88782 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/api/RefObj.java @@ -17,17 +17,10 @@ package com.gitee.dorive.ref.api; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; public interface RefObj { - long select(Context context); - - int insertOrUpdate(Context context); - - int delete(Context context); - long select(Options options); int insertOrUpdate(Options options); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java index 2ee9690a..4decd685 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefImpl.java @@ -17,7 +17,7 @@ package com.gitee.dorive.ref.impl; -import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.repository.AbstractProxyRepository; @@ -43,38 +43,38 @@ public class RefImpl extends AbstractProxyRepository implements Ref { } @Override - public int insertList(Context context, List entities) { - return repository.insertList(context, entities); + public int insertList(Options options, List entities) { + return repository.insertList(options, entities); } @Override - public int updateList(Context context, List entities) { - return repository.updateList(context, entities); + public int updateList(Options options, List entities) { + return repository.updateList(options, entities); } @Override - public int insertOrUpdateList(Context context, List entities) { - return repository.insertOrUpdateList(context, entities); + public int insertOrUpdateList(Options options, List entities) { + return repository.insertOrUpdateList(options, entities); } @Override - public int deleteList(Context context, List entities) { - return repository.deleteList(context, entities); + public int deleteList(Options options, List entities) { + return repository.deleteList(options, entities); } @Override - public List selectByQuery(Context context, Object query) { - return repository.selectByQuery(context, query); + public List selectByQuery(Options options, Object query) { + return repository.selectByQuery(options, query); } @Override - public Page selectPageByQuery(Context context, Object query) { - return repository.selectPageByQuery(context, query); + public Page selectPageByQuery(Options options, Object query) { + return repository.selectPageByQuery(options, query); } @Override - public long selectCountByQuery(Context context, Object query) { - return repository.selectCountByQuery(context, query); + public long selectCountByQuery(Options options, Object query) { + return repository.selectCountByQuery(options, query); } @Override diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java index 65e38bbe..4299fd72 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java @@ -35,37 +35,31 @@ public class RefObjImpl implements RefObj { private RefImpl ref; private Object object; - @Override - public long select(Context context) { - EntityHandler entityHandler = ref.getEntityHandler(); - return entityHandler.handle(context, Collections.singletonList(object)); - } - - @Override - public int insertOrUpdate(Context context) { - AbstractRepository repository = ref.getProxyRepository(); - return repository.insertOrUpdate(context, object); - } - - @Override - public int delete(Context context) { - AbstractRepository repository = ref.getProxyRepository(); - return repository.delete(context, object); - } - @Override public long select(Options options) { - return select(new InnerContext(options)); + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + EntityHandler entityHandler = ref.getEntityHandler(); + return entityHandler.handle((Context) options, Collections.singletonList(object)); } @Override public int insertOrUpdate(Options options) { - return insertOrUpdate(new InnerContext(options)); + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + AbstractRepository repository = ref.getProxyRepository(); + return repository.insertOrUpdate(options, object); } @Override public int delete(Options options) { - return delete(new InnerContext(options)); + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + AbstractRepository repository = ref.getProxyRepository(); + return repository.delete(options, object); } } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java new file mode 100644 index 00000000..e038cbd2 --- /dev/null +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.ref.repository; + +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Options; +import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.InnerExample; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.util.ExampleUtils; +import com.gitee.dorive.query.repository.AbstractQueryRepository; + +import java.util.List; + +public abstract class AbstractInnerRepository extends AbstractQueryRepository { + + @Override + public E selectByPrimaryKey(Options options, PK primaryKey) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.selectByPrimaryKey(options, primaryKey); + } + + @Override + public List selectByExample(Options options, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.selectByExample(options, example); + } + + @Override + public E selectOneByExample(Options options, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.selectOneByExample(options, example); + } + + @Override + public Page selectPageByExample(Options options, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.selectPageByExample(options, example); + } + + @Override + public long selectCountByExample(Options options, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.selectCountByExample(options, example); + } + + @Override + public int insert(Options options, E entity) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.insert(options, entity); + } + + @Override + public int update(Options options, E entity) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.update(options, entity); + } + + @Override + public int updateByExample(Options options, Object entity, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.updateByExample(options, entity, example); + } + + @Override + public int insertOrUpdate(Options options, E entity) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.insertOrUpdate(options, entity); + } + + @Override + public int delete(Options options, E entity) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.delete(options, entity); + } + + @Override + public int deleteByPrimaryKey(Options options, PK primaryKey) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.deleteByPrimaryKey(options, primaryKey); + } + + @Override + public int deleteByExample(Options options, Example example) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + if (!(example instanceof InnerExample)) { + example = ExampleUtils.clone(example); + } + return super.deleteByExample(options, example); + } + + @Override + public int insertList(Options options, List entities) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.insertList(options, entities); + } + + @Override + public int updateList(Options options, List entities) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.updateList(options, entities); + } + + @Override + public int insertOrUpdateList(Options options, List entities) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.insertOrUpdateList(options, entities); + } + + @Override + public int deleteList(Options options, List entities) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.deleteList(options, entities); + } + + @Override + public List selectByQuery(Options options, Object query) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.selectByQuery(options, query); + } + + @Override + public Page selectPageByQuery(Options options, Object query) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.selectPageByQuery(options, query); + } + + @Override + public long selectCountByQuery(Options options, Object query) { + if (!(options instanceof Context)) { + options = new InnerContext(options); + } + return super.selectCountByQuery(options, query); + } + +} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java index 9e45143f..96baba7e 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractRefRepository.java @@ -18,11 +18,9 @@ package com.gitee.dorive.ref.repository; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.ref.api.OptionsRepository; import com.gitee.dorive.ref.impl.RefInjector; -public abstract class AbstractRefRepository extends AbstractQueryRepository implements OptionsRepository { +public abstract class AbstractRefRepository extends AbstractInnerRepository { @Override protected EntityHandler processEntityHandler(EntityHandler entityHandler) { -- Gitee From d16209ec3307d7588ff9b1b1cd0ff4f68620e8db Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 5 Feb 2024 17:24:22 +0800 Subject: [PATCH 122/146] =?UTF-8?q?=E7=AE=80=E5=8C=96Example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/entity/executor/Example.java | 14 +------------- .../dorive/core/impl/joiner/UnionEntityJoiner.java | 2 +- .../com/gitee/dorive/core/util/ExampleUtils.java | 6 +++--- .../mybatis/plus/impl/MybatisPlusExecutor.java | 7 +++---- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java index 47a64b08..3cfb3287 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Example.java @@ -33,7 +33,7 @@ import java.util.function.Consumer; public class Example { private List selectProps; - private List extraProps; + private String selectSuffix; private List criteria = new ArrayList<>(4); private OrderBy orderBy; private Page page; @@ -50,18 +50,6 @@ public class Example { select(StringUtils.toList(fields)); } - public void selectExtra(List fields) { - if (extraProps == null) { - extraProps = fields; - } else { - extraProps.addAll(fields); - } - } - - public void selectExtra(String... fields) { - selectExtra(StringUtils.toList(fields)); - } - public boolean isEmpty() { return criteria.isEmpty(); } 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 32766cf8..45609a61 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 @@ -56,7 +56,7 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { continue; } String row = Integer.toString(index + 1); - example.selectExtra(row + " as $row"); + example.setSelectSuffix(row + " as $row"); unionExample.addExample(example); addToRootIndex(entity, row); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java index e51dfb03..67c97e20 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/ExampleUtils.java @@ -39,9 +39,9 @@ public class ExampleUtils { newExample.select(new ArrayList<>(selectProps)); } - List extraProps = example.getExtraProps(); - if (extraProps != null) { - newExample.selectExtra(new ArrayList<>(extraProps)); + String selectSuffix = example.getSelectSuffix(); + if (selectSuffix != null) { + newExample.setSelectSuffix(selectSuffix); } List criteria = example.getCriteria(); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 559c4dde..bded87ef 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -130,14 +130,13 @@ public class MybatisPlusExecutor extends AbstractExecutor { queryWrapper.select(selectProps); } - List extraProps = example.getExtraProps(); - if (extraProps != null && !extraProps.isEmpty()) { + String selectSuffix = example.getSelectSuffix(); + if (StringUtils.isNotBlank(selectSuffix)) { String sqlSelect = queryWrapper.getSqlSelect(); if (StringUtils.isBlank(sqlSelect)) { sqlSelect = queryWrapper.select(pojoClass, i -> true).getSqlSelect(); } - sqlSelect = sqlSelect + StringPool.COMMA + queryWrapper.select(extraProps).getSqlSelect(); - queryWrapper.select(sqlSelect); + queryWrapper.select(sqlSelect + StringPool.COMMA + selectSuffix); } WrapperUtils.appendCriterion(queryWrapper, example); -- Gitee From 0cdb605ab314b61423e5847e365959a88930e30c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 16:18:00 +0800 Subject: [PATCH 123/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/common/EntityStoreInfo.java | 1 + .../core/impl/executor/AbstractExecutor.java | 6 +- .../impl/executor/AbstractProxyExecutor.java | 8 +- .../core/impl/executor/ContextExecutor.java | 8 +- .../core/impl/executor/ExampleExecutor.java | 10 +- .../core/impl/executor/FactoryExecutor.java | 54 +++---- .../core/impl/joiner/UnionEntityJoiner.java | 12 +- .../plus/impl/MybatisPlusExecutor.java | 60 +------- .../repository/MybatisPlusRepository.java | 37 +++-- .../gitee/dorive/sql/impl/UnionExecutor.java | 141 ++++++++++++++++++ 10 files changed, 215 insertions(+), 122 deletions(-) create mode 100644 dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 5723de2f..dab547f8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -28,4 +28,5 @@ public class EntityStoreInfo { private Class pojoClass; private String tableName; private Map propAliasMapping; + private String selectColumns; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java index a5d0456d..cc1ddd33 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractExecutor.java @@ -18,8 +18,10 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.core.api.executor.Executor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data +@Getter +@Setter public abstract class AbstractExecutor implements Executor { } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java index 92f4fac2..45ee4fda 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java @@ -23,14 +23,14 @@ import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor -@EqualsAndHashCode(callSuper = false) public abstract class AbstractProxyExecutor extends AbstractExecutor { private Executor executor; 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 a139562c..c1d8d701 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 @@ -35,15 +35,15 @@ import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CollectionUtils; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.util.Collection; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class ContextExecutor extends AbstractExecutor { private final AbstractContextRepository repository; 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 fde8aec9..a0cb8f0b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -20,8 +20,8 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -30,13 +30,13 @@ import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.util.List; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class ExampleExecutor extends AbstractProxyExecutor { private EntityEle entityEle; 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 9bc68523..db6264cf 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 @@ -22,17 +22,22 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; -import com.gitee.dorive.core.entity.executor.*; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class FactoryExecutor extends AbstractProxyExecutor { private EntityEle entityEle; @@ -52,12 +57,8 @@ public class FactoryExecutor extends AbstractProxyExecutor { List entities = Collections.emptyList(); if (recordMaps != null && !recordMaps.isEmpty()) { - Example example = query.getExample(); - if (example instanceof UnionExample) { - entities = reconstituteWithoutDuplicate(context, recordMaps); - } else { - entities = reconstitute(context, recordMaps); - } + boolean isUnion = query.getExample() instanceof UnionExample; + entities = reconstitute(context, recordMaps, isUnion); } if (page != null) { @@ -69,35 +70,14 @@ public class FactoryExecutor extends AbstractProxyExecutor { return result; } - private List reconstituteWithoutDuplicate(Context context, List> resultMaps) { - int size = resultMaps.size(); - List entities = new ArrayList<>(size); - Map existEntityMap = new LinkedHashMap<>(size * 4 / 3 + 1); - for (Map resultMap : resultMaps) { - Object id = resultMap.get("id"); - Object entity = null; - if (id != null) { - entity = existEntityMap.get(String.valueOf(id)); - } - if (entity == null) { - entity = entityFactory.reconstitute(context, resultMap); - if (id != null) { - existEntityMap.put(String.valueOf(id), entity); - } - entities.add(entity); - } - if (entity != null) { - resultMap.put("$entity", entity); - } - } - return entities; - } - - private List reconstitute(Context context, List> resultMaps) { + private List reconstitute(Context context, List> resultMaps, boolean isUnion) { List entities = new ArrayList<>(resultMaps.size()); for (Map resultMap : resultMaps) { Object entity = entityFactory.reconstitute(context, resultMap); if (entity != null) { + if (isUnion) { + resultMap.put("$entity", entity); + } entities.add(entity); } } 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 45609a61..9a46330f 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 @@ -89,13 +89,21 @@ public class UnionEntityJoiner extends AbstractEntityJoiner { } @Override + @SuppressWarnings("unchecked") protected void buildRecordIndex(Context context, List entities, Result result) { List> recordMaps = result.getRecordMaps(); for (Map resultMap : recordMaps) { Object row = resultMap.get("$row"); + List rows = (List) resultMap.get("$rows"); Object entity = resultMap.get("$entity"); - if (row != null && entity != null) { - addToRecordIndex(row.toString(), entity); + if (entity != null) { + if (rows != null) { + for (String eachRow : rows) { + addToRecordIndex(eachRow, entity); + } + } else if (row != null) { + addToRecordIndex(row.toString(), entity); + } } } } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index bded87ef..affaaa60 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -18,8 +18,6 @@ package com.gitee.dorive.mybatis.plus.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -32,11 +30,9 @@ import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Delete; import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; @@ -96,17 +92,9 @@ public class MybatisPlusExecutor extends AbstractExecutor { return new Result<>(page, queryPage.getRecords()); } else { - if (example instanceof UnionExample) { - UnionExample unionExample = (UnionExample) example; - QueryWrapper queryWrapper = buildQueryWrapper(unionExample); - List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new Result<>(null, resultMaps); - - } else { - QueryWrapper queryWrapper = buildQueryWrapper(example); - List> resultMaps = baseMapper.selectMaps(queryWrapper); - return new Result<>(null, resultMaps); - } + QueryWrapper queryWrapper = buildQueryWrapper(example); + List> resultMaps = baseMapper.selectMaps(queryWrapper); + return new Result<>(null, resultMaps); } } return new Result<>(null, Collections.emptyList()); @@ -155,48 +143,6 @@ public class MybatisPlusExecutor extends AbstractExecutor { return queryWrapper; } - private QueryWrapper buildQueryWrapper(UnionExample unionExample) { - List examples = unionExample.getExamples(); - Assert.notEmpty(examples, "The examples cannot be empty!"); - - Example example = examples.get(0); - QueryWrapper queryWrapper = buildQueryWrapper(example); - - StringBuilder lastSql = new StringBuilder(); - if (example.getPage() != null) { - lastSql.append(example.getPage()).append(" "); - } - - for (int index = 1; index < examples.size(); index++) { - Example nextExample = examples.get(index); - QueryWrapper nextQueryWrapper = buildQueryWrapper(nextExample); - - String sqlSelect = nextQueryWrapper.getSqlSelect(); - String tableName = TableInfoHelper.getTableInfo(pojoClass).getTableName(); - String criteria = CollUtil.join(nextExample.getCriteria(), " AND ", Criterion::toString); - - String sql = ""; - if (nextExample.getOrderBy() == null && nextExample.getPage() == null) { - sql = String.format("UNION ALL (SELECT %s FROM %s WHERE %s) ", sqlSelect, tableName, criteria); - - } else if (nextExample.getOrderBy() != null && nextExample.getPage() != null) { - sql = String.format("UNION ALL (SELECT %s FROM %s WHERE %s %s %s) ", sqlSelect, tableName, criteria, nextExample.getOrderBy(), nextExample.getPage()); - - } else if (nextExample.getOrderBy() != null) { - sql = String.format("UNION ALL (SELECT %s FROM %s WHERE %s %s) ", sqlSelect, tableName, criteria, nextExample.getOrderBy()); - - } else if (nextExample.getPage() != null) { - sql = String.format("UNION ALL (SELECT %s FROM %s WHERE %s %s) ", sqlSelect, tableName, criteria, nextExample.getPage()); - } - lastSql.append(sql); - } - - if (lastSql.length() > 0) { - queryWrapper.last(lastSql.toString()); - } - return queryWrapper; - } - @Override public int execute(Context context, Operation operation) { Object persistent = operation.getEntity(); 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 3c01ceae..010c7d59 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; @@ -29,20 +30,22 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.option.QueryStrategy; +import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; import com.gitee.dorive.ref.repository.AbstractRefRepository; -import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.sql.impl.SegmentBuilder; import com.gitee.dorive.sql.impl.SqlQueryBuilder; +import com.gitee.dorive.sql.impl.UnionExecutor; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -52,8 +55,8 @@ import java.util.Map; public class MybatisPlusRepository extends AbstractRefRepository { private BaseMapper mapper; - private Class pojoClass; - private TableInfo tableInfo; + private EntityStoreInfo entityStoreInfo; + private SqlRunner sqlRunner; private QueryBuilder sqlQueryBuilder; private CountQuerier countQuerier; @@ -61,8 +64,6 @@ public class MybatisPlusRepository extends AbstractRefRepository { public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); SegmentBuilder segmentBuilder = new SegmentBuilder(); - ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); - SqlRunner sqlRunner = implFactory.getInstance(SqlRunner.class); this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlRunner); this.countQuerier = new CountQuerier(this, segmentBuilder, sqlRunner); } @@ -71,6 +72,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { @SuppressWarnings("unchecked") protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle) { Class mapperClass = entityDef.getSource(); + Class pojoClass = null; if (mapperClass != Object.class) { mapper = (BaseMapper) getApplicationContext().getBean(mapperClass); Assert.notNull(mapper, "The mapper cannot be null! source: {}", mapperClass); @@ -84,15 +86,20 @@ public class MybatisPlusRepository extends AbstractRefRepository { } } } + Assert.notNull(pojoClass, "The class of pojo cannot be null! source: {}", mapperClass); - tableInfo = TableInfoHelper.getTableInfo(pojoClass); + TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); Assert.notNull(tableInfo, "The table info cannot be null! source: {}", mapperClass); - String tableName = tableInfo != null ? tableInfo.getTableName() : null; - Map propAliasMapping = getPropAliasMapping(); - return new EntityStoreInfo(pojoClass, tableName, propAliasMapping); + assert tableInfo != null; + + String tableName = tableInfo.getTableName(); + Map propAliasMapping = getPropAliasMapping(tableInfo); + String selectColumns = getSelectColumns(propAliasMapping); + entityStoreInfo = new EntityStoreInfo(pojoClass, tableName, propAliasMapping, selectColumns); + return entityStoreInfo; } - private Map getPropAliasMapping() { + private Map getPropAliasMapping(TableInfo tableInfo) { String keyProperty = tableInfo.getKeyProperty(); String keyColumn = tableInfo.getKeyColumn(); List tableFieldInfos = tableInfo.getFieldList(); @@ -107,10 +114,18 @@ public class MybatisPlusRepository extends AbstractRefRepository { return propAliasMapping; } + private String getSelectColumns(Map propAliasMapping) { + List selectColumns = new ArrayList<>(propAliasMapping.values()); + return StrUtil.join(",", selectColumns); + } + @Override @SuppressWarnings("unchecked") protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle) { - return new MybatisPlusExecutor(entityDef, entityEle, mapper, (Class) pojoClass); + Executor executor = new MybatisPlusExecutor(entityDef, entityEle, mapper, (Class) entityStoreInfo.getPojoClass()); + ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); + sqlRunner = implFactory.getInstance(SqlRunner.class); + return new UnionExecutor(executor, entityStoreInfo, sqlRunner); } @Override diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java new file mode 100644 index 00000000..78ddcff2 --- /dev/null +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -0,0 +1,141 @@ +/* + * 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; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.executor.Criterion; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; +import com.gitee.dorive.sql.api.SqlRunner; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +public class UnionExecutor extends AbstractProxyExecutor { + + private EntityStoreInfo entityStoreInfo; + private SqlRunner sqlRunner; + + public UnionExecutor(Executor executor, EntityStoreInfo entityStoreInfo, SqlRunner sqlRunner) { + super(executor); + this.entityStoreInfo = entityStoreInfo; + this.sqlRunner = sqlRunner; + } + + @Override + public Result executeQuery(Context context, Query query) { + Example example = query.getExample(); + if (example instanceof UnionExample) { + UnionExample unionExample = (UnionExample) example; + String sql = buildSql(unionExample); + if (StringUtils.isNotBlank(sql)) { + List> resultMaps = sqlRunner.selectList(sql, (Object) null); + return buildResult(resultMaps); + } + } + return super.executeQuery(context, query); + } + + private String buildSql(UnionExample unionExample) { + List examples = unionExample.getExamples(); + if (!examples.isEmpty()) { + List sqls = new ArrayList<>(examples.size()); + Example example = examples.get(0); + String sql = buildSql(example, false); + sqls.add(sql); + for (int index = 1; index < examples.size(); index++) { + Example nextExample = examples.get(index); + String nextSql = buildSql(nextExample, true); + sqls.add(nextSql); + } + return StrUtil.join(" UNION ALL ", sqls); + } + return null; + } + + private String buildSql(Example example, boolean hasBrackets) { + StringBuilder sqlBuilder = new StringBuilder(); + if (hasBrackets) { + sqlBuilder.append("("); + } + String template = "SELECT %s,%s FROM %s WHERE %s"; + String selectColumns = entityStoreInfo.getSelectColumns(); + String selectSuffix = example.getSelectSuffix(); + String tableName = entityStoreInfo.getTableName(); + String criteria = CollUtil.join(example.getCriteria(), " AND ", Criterion::toString); + String sql = String.format(template, selectColumns, selectSuffix, tableName, criteria); + sqlBuilder.append(sql); + OrderBy orderBy = example.getOrderBy(); + if (orderBy != null) { + sqlBuilder.append(" ").append(orderBy); + } + Page page = example.getPage(); + if (page != null) { + sqlBuilder.append(" ").append(page); + } + if (hasBrackets) { + sqlBuilder.append(")"); + } + return sqlBuilder.toString(); + } + + @SuppressWarnings("unchecked") + private Result buildResult(List> resultMaps) { + Map> idResultMapMapping = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); + for (Map resultMap : resultMaps) { + Object id = resultMap.get("id"); + Object row = resultMap.get("$row"); + if (id == null || row == null) { + continue; + } + String idStr = id.toString(); + String rowStr = row.toString(); + if (!idResultMapMapping.containsKey(idStr)) { + idResultMapMapping.put(idStr, resultMap); + } else { + Map existResultMap = idResultMapMapping.get(idStr); + List existRows = (List) existResultMap.computeIfAbsent("$rows", key -> new ArrayList<>(4)); + if (existRows.isEmpty()) { + Object existRow = existResultMap.get("$row"); + if (existRow != null) { + existRows.add(existRow.toString()); + } + } + existRows.add(rowStr); + } + } + return new Result<>(null, new ArrayList<>(idResultMapMapping.values())); + } + +} -- Gitee From 533f99501f7b33deae860df40f3656303cf9a8ff Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 16:48:24 +0800 Subject: [PATCH 124/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/UnionExample.java | 1 + .../gitee/dorive/sql/impl/UnionExecutor.java | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index ed6e92be..60bed3c0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -33,6 +33,7 @@ public class UnionExample extends Example { @Override public void select(List fields) { + super.select(fields); if (examples != null && !examples.isEmpty()) { for (Example example : examples) { example.select(fields); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java index 78ddcff2..3d58b561 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -69,28 +69,32 @@ public class UnionExecutor extends AbstractProxyExecutor { private String buildSql(UnionExample unionExample) { List examples = unionExample.getExamples(); - if (!examples.isEmpty()) { - List sqls = new ArrayList<>(examples.size()); - Example example = examples.get(0); - String sql = buildSql(example, false); - sqls.add(sql); - for (int index = 1; index < examples.size(); index++) { - Example nextExample = examples.get(index); - String nextSql = buildSql(nextExample, true); - sqls.add(nextSql); - } - return StrUtil.join(" UNION ALL ", sqls); + if (examples.isEmpty()) { + return null; + } + String selectColumns = entityStoreInfo.getSelectColumns(); + List selectProps = unionExample.getSelectProps(); + if (selectProps != null && !selectProps.isEmpty()) { + selectColumns = StrUtil.join(",", selectProps); } - return null; + List sqls = new ArrayList<>(examples.size()); + Example example = examples.get(0); + String sql = buildSql(false, selectColumns, example); + sqls.add(sql); + for (int index = 1; index < examples.size(); index++) { + Example nextExample = examples.get(index); + String nextSql = buildSql(true, selectColumns, nextExample); + sqls.add(nextSql); + } + return StrUtil.join(" UNION ALL ", sqls); } - private String buildSql(Example example, boolean hasBrackets) { + private String buildSql(boolean hasBrackets, String selectColumns, Example example) { StringBuilder sqlBuilder = new StringBuilder(); if (hasBrackets) { sqlBuilder.append("("); } String template = "SELECT %s,%s FROM %s WHERE %s"; - String selectColumns = entityStoreInfo.getSelectColumns(); String selectSuffix = example.getSelectSuffix(); String tableName = entityStoreInfo.getTableName(); String criteria = CollUtil.join(example.getCriteria(), " AND ", Criterion::toString); -- Gitee From 7aae31b28236b6c1b0204fcf076158930ac1059b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 17:46:12 +0800 Subject: [PATCH 125/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/executor/UnionExample.java | 10 ---- .../core/impl/executor/ExampleExecutor.java | 14 ++++-- .../gitee/dorive/sql/impl/UnionExecutor.java | 47 +++++++++++++------ 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index 60bed3c0..dadc490c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -31,16 +31,6 @@ public class UnionExample extends Example { private List examples = new ArrayList<>(); - @Override - public void select(List fields) { - super.select(fields); - if (examples != null && !examples.isEmpty()) { - for (Example example : examples) { - example.select(fields); - } - } - } - @Override public boolean isEmpty() { return examples.isEmpty(); 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 a0cb8f0b..8ef9fc0f 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 @@ -83,16 +83,18 @@ public class ExampleExecutor extends AbstractProxyExecutor { } private void convert(Context context, UnionExample unionExample) { + convertSelectProps(unionExample); List examples = unionExample.getExamples(); for (Example example : examples) { - convert(context, example); + convertCriteria(context, example); } + convertOrderBy(unionExample); } public void convert(Context context, Example example) { convertSelectProps(example); - convertCriteria(context, example.getCriteria()); - convertOrderBy(example.getOrderBy()); + convertCriteria(context, example); + convertOrderBy(example); } private void convertSelectProps(Example example) { @@ -103,7 +105,8 @@ public class ExampleExecutor extends AbstractProxyExecutor { } } - private void convertCriteria(Context context, List criteria) { + private void convertCriteria(Context context, Example example) { + List criteria = example.getCriteria(); if (criteria != null && !criteria.isEmpty()) { for (Criterion criterion : criteria) { String operator = criterion.getOperator(); @@ -134,7 +137,8 @@ public class ExampleExecutor extends AbstractProxyExecutor { } } - private void convertOrderBy(OrderBy orderBy) { + private void convertOrderBy(Example example) { + OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { List properties = orderBy.getProperties(); properties = entityEle.toAliases(properties); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java index 3d58b561..a89791f0 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -68,28 +68,52 @@ public class UnionExecutor extends AbstractProxyExecutor { } private String buildSql(UnionExample unionExample) { - List examples = unionExample.getExamples(); - if (examples.isEmpty()) { + if (unionExample.isEmpty()) { return null; } + String selectColumns = buildSelectColumns(unionExample); + String lastSql = buildLastSql(unionExample); + List sqls = buildSqls(unionExample, selectColumns, lastSql); + return StrUtil.join(" UNION ALL ", sqls); + } + + private String buildSelectColumns(Example example) { String selectColumns = entityStoreInfo.getSelectColumns(); - List selectProps = unionExample.getSelectProps(); + List selectProps = example.getSelectProps(); if (selectProps != null && !selectProps.isEmpty()) { selectColumns = StrUtil.join(",", selectProps); } + return selectColumns; + } + + private String buildLastSql(Example example) { + StringBuilder lastSql = new StringBuilder(); + OrderBy orderBy = example.getOrderBy(); + if (orderBy != null) { + lastSql.append(" ").append(orderBy); + } + Page page = example.getPage(); + if (page != null) { + lastSql.append(" ").append(page); + } + return lastSql.toString(); + } + + private List buildSqls(UnionExample unionExample, String selectColumns, String lastSql) { + List examples = unionExample.getExamples(); List sqls = new ArrayList<>(examples.size()); Example example = examples.get(0); - String sql = buildSql(false, selectColumns, example); + String sql = doBuildSql(false, selectColumns, example, lastSql); sqls.add(sql); for (int index = 1; index < examples.size(); index++) { Example nextExample = examples.get(index); - String nextSql = buildSql(true, selectColumns, nextExample); + String nextSql = doBuildSql(true, selectColumns, nextExample, lastSql); sqls.add(nextSql); } - return StrUtil.join(" UNION ALL ", sqls); + return sqls; } - private String buildSql(boolean hasBrackets, String selectColumns, Example example) { + private String doBuildSql(boolean hasBrackets, String selectColumns, Example example, String lastSql) { StringBuilder sqlBuilder = new StringBuilder(); if (hasBrackets) { sqlBuilder.append("("); @@ -100,14 +124,7 @@ public class UnionExecutor extends AbstractProxyExecutor { String criteria = CollUtil.join(example.getCriteria(), " AND ", Criterion::toString); String sql = String.format(template, selectColumns, selectSuffix, tableName, criteria); sqlBuilder.append(sql); - OrderBy orderBy = example.getOrderBy(); - if (orderBy != null) { - sqlBuilder.append(" ").append(orderBy); - } - Page page = example.getPage(); - if (page != null) { - sqlBuilder.append(" ").append(page); - } + sqlBuilder.append(lastSql); if (hasBrackets) { sqlBuilder.append(")"); } -- Gitee From 545a82dd50cacc220b46afa2ba615c24212ef045 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 18:10:05 +0800 Subject: [PATCH 126/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/executor/ExampleExecutor.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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 8ef9fc0f..bd17e92e 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 @@ -51,12 +51,11 @@ public class ExampleExecutor extends AbstractProxyExecutor { @Override public Result executeQuery(Context context, Query query) { Example example = query.getExample(); + if (example instanceof UnionExample) { + convertUnion(context, (UnionExample) example); + } if (example != null) { - if (example instanceof UnionExample) { - convert(context, (UnionExample) example); - } else { - convert(context, example); - } + convert(context, example); } return super.executeQuery(context, query); } @@ -82,13 +81,11 @@ public class ExampleExecutor extends AbstractProxyExecutor { return super.execute(context, operation); } - private void convert(Context context, UnionExample unionExample) { - convertSelectProps(unionExample); + private void convertUnion(Context context, UnionExample unionExample) { List examples = unionExample.getExamples(); for (Example example : examples) { convertCriteria(context, example); } - convertOrderBy(unionExample); } public void convert(Context context, Example example) { -- Gitee From 96acc02c41ab8c42703d14a1e36f564391524122 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 18:12:39 +0800 Subject: [PATCH 127/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/executor/ExampleExecutor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 bd17e92e..fcfb6ab9 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 @@ -51,12 +51,12 @@ public class ExampleExecutor extends AbstractProxyExecutor { @Override public Result executeQuery(Context context, Query query) { Example example = query.getExample(); - if (example instanceof UnionExample) { - convertUnion(context, (UnionExample) example); - } if (example != null) { convert(context, example); } + if (example instanceof UnionExample) { + convertUnion(context, (UnionExample) example); + } return super.executeQuery(context, query); } -- Gitee From c485009f889e49c1754fa2bbd9bcf4dd74a51200 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 18:16:20 +0800 Subject: [PATCH 128/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/executor/FactoryExecutor.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 db6264cf..901a878c 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 @@ -22,6 +22,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; @@ -57,8 +58,7 @@ public class FactoryExecutor extends AbstractProxyExecutor { List entities = Collections.emptyList(); if (recordMaps != null && !recordMaps.isEmpty()) { - boolean isUnion = query.getExample() instanceof UnionExample; - entities = reconstitute(context, recordMaps, isUnion); + entities = reconstitute(context, query, recordMaps); } if (page != null) { @@ -70,7 +70,9 @@ public class FactoryExecutor extends AbstractProxyExecutor { return result; } - private List reconstitute(Context context, List> resultMaps, boolean isUnion) { + private List reconstitute(Context context, Query query, List> resultMaps) { + Example example = query.getExample(); + boolean isUnion = example instanceof UnionExample; List entities = new ArrayList<>(resultMaps.size()); for (Map resultMap : resultMaps) { Object entity = entityFactory.reconstitute(context, resultMap); -- Gitee From 7cd71f346042ec888c43b5397dd0e91011adb085 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Sun, 18 Feb 2024 18:17:58 +0800 Subject: [PATCH 129/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/executor/ExampleExecutor.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 fcfb6ab9..22080f10 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 @@ -81,6 +81,12 @@ public class ExampleExecutor extends AbstractProxyExecutor { return super.execute(context, operation); } + public void convert(Context context, Example example) { + convertSelectProps(example); + convertCriteria(context, example); + convertOrderBy(example); + } + private void convertUnion(Context context, UnionExample unionExample) { List examples = unionExample.getExamples(); for (Example example : examples) { @@ -88,12 +94,6 @@ public class ExampleExecutor extends AbstractProxyExecutor { } } - public void convert(Context context, Example example) { - convertSelectProps(example); - convertCriteria(context, example); - convertOrderBy(example); - } - private void convertSelectProps(Example example) { List properties = example.getSelectProps(); if (properties != null && !properties.isEmpty()) { -- Gitee From 6df47b95ae12baef3cc11bdf1e2766e881e3f55e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 19 Feb 2024 09:40:40 +0800 Subject: [PATCH 130/146] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E7=AE=80=E5=8C=96Uni?= =?UTF-8?q?on=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/sql/impl/UnionExecutor.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java index a89791f0..0336ca34 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -114,21 +114,21 @@ public class UnionExecutor extends AbstractProxyExecutor { } private String doBuildSql(boolean hasBrackets, String selectColumns, Example example, String lastSql) { - StringBuilder sqlBuilder = new StringBuilder(); + StringBuilder sql = new StringBuilder(); if (hasBrackets) { - sqlBuilder.append("("); + sql.append("("); } String template = "SELECT %s,%s FROM %s WHERE %s"; String selectSuffix = example.getSelectSuffix(); String tableName = entityStoreInfo.getTableName(); String criteria = CollUtil.join(example.getCriteria(), " AND ", Criterion::toString); - String sql = String.format(template, selectColumns, selectSuffix, tableName, criteria); - sqlBuilder.append(sql); - sqlBuilder.append(lastSql); + String selectSql = String.format(template, selectColumns, selectSuffix, tableName, criteria); + sql.append(selectSql); + sql.append(lastSql); if (hasBrackets) { - sqlBuilder.append(")"); + sql.append(")"); } - return sqlBuilder.toString(); + return sql.toString(); } @SuppressWarnings("unchecked") -- Gitee From b1cd5dafd4c399ae873c759768543b7c79e44dfc Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 19 Feb 2024 15:25:43 +0800 Subject: [PATCH 131/146] =?UTF-8?q?=E5=BC=BA=E5=8C=96EntityStoreInfo?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/common/EntityStoreInfo.java | 5 ++ .../repository/AbstractContextRepository.java | 4 +- .../plus/impl/MybatisPlusExecutor.java | 27 +++++---- .../repository/MybatisPlusRepository.java | 56 +++++++++---------- .../gitee/dorive/sql/impl/UnionExecutor.java | 6 +- 5 files changed, 51 insertions(+), 47 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index dab547f8..9c5e9217 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -25,8 +25,13 @@ import java.util.Map; @Data @AllArgsConstructor public class EntityStoreInfo { + private Class mapperClass; + private Object mapper; private Class pojoClass; private String tableName; + private String primaryProp; + private String primaryAlias; + private Map propAliasMappingWithoutPk; private Map propAliasMapping; private String selectColumns; } 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 993c1524..08e6b733 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 @@ -193,7 +193,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).resolve(); EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); - Executor executor = newExecutor(entityDef, entityEle); + Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); executor = new FactoryExecutor(executor, entityEle, entityFactory); executor = new ExampleExecutor(executor, entityEle, entityMapper); EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); @@ -231,7 +231,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle); - protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle); + protected abstract Executor newExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo); protected abstract AbstractRepository processRepository(AbstractRepository repository); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index affaaa60..7d75fe30 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -21,8 +21,6 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gitee.dorive.api.constant.Operator; @@ -30,6 +28,7 @@ import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; @@ -61,14 +60,17 @@ public class MybatisPlusExecutor extends AbstractExecutor { private EntityDef entityDef; private EntityEle entityEle; + private EntityStoreInfo entityStoreInfo; private BaseMapper baseMapper; private Class pojoClass; - public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, BaseMapper baseMapper, Class pojoClass) { + @SuppressWarnings("unchecked") + public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { this.entityDef = entityDef; this.entityEle = entityEle; - this.baseMapper = baseMapper; - this.pojoClass = pojoClass; + this.entityStoreInfo = entityStoreInfo; + this.baseMapper = (BaseMapper) entityStoreInfo.getMapper(); + this.pojoClass = (Class) entityStoreInfo.getPojoClass(); } @Override @@ -191,14 +193,15 @@ public class MybatisPlusExecutor extends AbstractExecutor { private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableFields, Object primaryKey, Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - List fieldList = TableInfoHelper.getTableInfo(pojoClass).getFieldList(); - for (TableFieldInfo tableFieldInfo : fieldList) { - String property = tableFieldInfo.getProperty(); - Object value = BeanUtil.getFieldValue(persistent, property); - if (value != null || nullableFields.contains(property)) { - updateWrapper.set(true, tableFieldInfo.getColumn(), value); + + Map propAliasMappingWithoutPk = entityStoreInfo.getPropAliasMappingWithoutPk(); + propAliasMappingWithoutPk.forEach((prop, alias) -> { + Object value = BeanUtil.getFieldValue(persistent, prop); + if (value != null || nullableFields.contains(prop)) { + updateWrapper.set(true, alias, value); } - } + }); + if (primaryKey != null) { CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(Operator.EQ); criterionAppender.appendCriterion(updateWrapper, "id", primaryKey); 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 010c7d59..ce748c7b 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 @@ -19,7 +19,6 @@ package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; @@ -54,27 +53,27 @@ import java.util.Map; @EqualsAndHashCode(callSuper = false) public class MybatisPlusRepository extends AbstractRefRepository { - private BaseMapper mapper; - private EntityStoreInfo entityStoreInfo; private SqlRunner sqlRunner; private QueryBuilder sqlQueryBuilder; private CountQuerier countQuerier; @Override public void afterPropertiesSet() throws Exception { - super.afterPropertiesSet(); + ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); + this.sqlRunner = implFactory.getInstance(SqlRunner.class); SegmentBuilder segmentBuilder = new SegmentBuilder(); - this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, sqlRunner); - this.countQuerier = new CountQuerier(this, segmentBuilder, sqlRunner); + this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, this.sqlRunner); + this.countQuerier = new CountQuerier(this, segmentBuilder, this.sqlRunner); + super.afterPropertiesSet(); } @Override - @SuppressWarnings("unchecked") protected EntityStoreInfo resolveEntityStoreInfo(EntityDef entityDef, EntityEle entityEle) { Class mapperClass = entityDef.getSource(); + Object mapper = null; Class pojoClass = null; if (mapperClass != Object.class) { - mapper = (BaseMapper) getApplicationContext().getBean(mapperClass); + mapper = getApplicationContext().getBean(mapperClass); Assert.notNull(mapper, "The mapper cannot be null! source: {}", mapperClass); Type[] genericInterfaces = mapperClass.getGenericInterfaces(); if (genericInterfaces.length > 0) { @@ -91,41 +90,38 @@ public class MybatisPlusRepository extends AbstractRefRepository { TableInfo tableInfo = TableInfoHelper.getTableInfo(pojoClass); Assert.notNull(tableInfo, "The table info cannot be null! source: {}", mapperClass); assert tableInfo != null; - - String tableName = tableInfo.getTableName(); - Map propAliasMapping = getPropAliasMapping(tableInfo); - String selectColumns = getSelectColumns(propAliasMapping); - entityStoreInfo = new EntityStoreInfo(pojoClass, tableName, propAliasMapping, selectColumns); - return entityStoreInfo; + return newEntityStoreInfo(mapperClass, mapper, pojoClass, tableInfo); } - private Map getPropAliasMapping(TableInfo tableInfo) { + private EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { + String tableName = tableInfo.getTableName(); String keyProperty = tableInfo.getKeyProperty(); String keyColumn = tableInfo.getKeyColumn(); List tableFieldInfos = tableInfo.getFieldList(); + int size = tableFieldInfos.size() + 1; + + Map propAliasMappingWithoutPk = new LinkedHashMap<>(size * 4 / 3 + 1); + for (TableFieldInfo tableFieldInfo : tableFieldInfos) { + propAliasMappingWithoutPk.put(tableFieldInfo.getProperty(), tableFieldInfo.getColumn()); + } - Map propAliasMapping = new LinkedHashMap<>(); + Map propAliasMapping = new LinkedHashMap<>(size * 4 / 3 + 1); if (StringUtils.isNotBlank(keyProperty) && StringUtils.isNotBlank(keyColumn)) { propAliasMapping.put(keyProperty, keyColumn); } - for (TableFieldInfo tableFieldInfo : tableFieldInfos) { - propAliasMapping.put(tableFieldInfo.getProperty(), tableFieldInfo.getColumn()); - } - return propAliasMapping; - } + propAliasMapping.putAll(propAliasMappingWithoutPk); + + List columns = new ArrayList<>(propAliasMapping.values()); + String selectColumns = StrUtil.join(",", columns); - private String getSelectColumns(Map propAliasMapping) { - List selectColumns = new ArrayList<>(propAliasMapping.values()); - return StrUtil.join(",", selectColumns); + return new EntityStoreInfo(mapperClass, mapper, pojoClass, + tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, selectColumns); } @Override - @SuppressWarnings("unchecked") - protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle) { - Executor executor = new MybatisPlusExecutor(entityDef, entityEle, mapper, (Class) entityStoreInfo.getPojoClass()); - ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); - sqlRunner = implFactory.getInstance(SqlRunner.class); - return new UnionExecutor(executor, entityStoreInfo, sqlRunner); + protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { + Executor executor = new MybatisPlusExecutor(entityDef, entityEle, entityStoreInfo); + return new UnionExecutor(executor, sqlRunner, entityStoreInfo); } @Override diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java index 0336ca34..710b681d 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -44,13 +44,13 @@ import java.util.Map; @Setter public class UnionExecutor extends AbstractProxyExecutor { - private EntityStoreInfo entityStoreInfo; private SqlRunner sqlRunner; + private EntityStoreInfo entityStoreInfo; - public UnionExecutor(Executor executor, EntityStoreInfo entityStoreInfo, SqlRunner sqlRunner) { + public UnionExecutor(Executor executor, SqlRunner sqlRunner, EntityStoreInfo entityStoreInfo) { super(executor); - this.entityStoreInfo = entityStoreInfo; this.sqlRunner = sqlRunner; + this.entityStoreInfo = entityStoreInfo; } @Override -- Gitee From 56db92c0e69b9ad2a96940ac97cd23cf3f69b8f4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 19 Feb 2024 16:44:46 +0800 Subject: [PATCH 132/146] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BC=9A=E5=87=BA=E7=8E=B0=E7=9A=84=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=8C=B9=E9=85=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/entity/element/EntityEle.java | 14 ++++++++++++++ .../gitee/dorive/core/entity/operation/Update.java | 2 +- .../dorive/core/impl/executor/ExampleExecutor.java | 13 +++++++++++++ .../mybatis/plus/impl/MybatisPlusExecutor.java | 10 +++++----- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java index 5767bcc1..e87956fd 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java @@ -26,8 +26,10 @@ 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; @Data @NoArgsConstructor @@ -81,6 +83,18 @@ public abstract class EntityEle { return fields; } + public Set toAliases(Set fields) { + if (fields != null && !fields.isEmpty()) { + Set aliases = new LinkedHashSet<>(fields.size() * 4 / 3 + 1); + for (String field : fields) { + String alias = toAlias(field); + aliases.add(alias); + } + return aliases; + } + return fields; + } + protected abstract void doInitialize(); public abstract boolean isCollection(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java index c9240bb4..bd514cd6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java @@ -27,7 +27,7 @@ import java.util.Set; @Setter public class Update extends Condition { - private Set nullableFields = Collections.emptySet(); + private Set nullableProps = Collections.emptySet(); public Update(Object entity) { super(entity); 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 22080f10..2836a285 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 @@ -30,10 +30,12 @@ import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.Update; import lombok.Getter; import lombok.Setter; import java.util.List; +import java.util.Set; @Getter @Setter @@ -78,6 +80,9 @@ public class ExampleExecutor extends AbstractProxyExecutor { convert(context, example); } } + if (operation instanceof Update) { + convertUpdate((Update) operation); + } return super.execute(context, operation); } @@ -94,6 +99,14 @@ public class ExampleExecutor extends AbstractProxyExecutor { } } + private void convertUpdate(Update update) { + Set nullableProps = update.getNullableProps(); + if (nullableProps != null && !nullableProps.isEmpty()) { + nullableProps = entityEle.toAliases(nullableProps); + update.setNullableProps(nullableProps); + } + } + private void convertSelectProps(Example example) { List properties = example.getSelectProps(); if (properties != null && !properties.isEmpty()) { diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 7d75fe30..bb91fab9 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -157,9 +157,9 @@ public class MybatisPlusExecutor extends AbstractExecutor { Object primaryKey = update.getPrimaryKey(); Example example = update.getExample(); - Set nullableFields = update.getNullableFields(); - if (nullableFields != null && !nullableFields.isEmpty()) { - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableFields, primaryKey, example); + Set nullableProps = update.getNullableProps(); + if (nullableProps != null && !nullableProps.isEmpty()) { + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey, example); return baseMapper.update(null, updateWrapper); } @@ -191,13 +191,13 @@ public class MybatisPlusExecutor extends AbstractExecutor { return updateWrapper; } - private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableFields, Object primaryKey, Example example) { + private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableProps, Object primaryKey, Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); Map propAliasMappingWithoutPk = entityStoreInfo.getPropAliasMappingWithoutPk(); propAliasMappingWithoutPk.forEach((prop, alias) -> { Object value = BeanUtil.getFieldValue(persistent, prop); - if (value != null || nullableFields.contains(prop)) { + if (value != null || nullableProps.contains(alias)) { updateWrapper.set(true, alias, value); } }); -- Gitee From d2d8cca04db70e47221041d68c0c7cb40bcf470c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 19 Feb 2024 17:21:14 +0800 Subject: [PATCH 133/146] =?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 --- .../mybatis/plus/impl/AppenderContext.java | 14 ++++++-- .../plus/impl/MybatisPlusExecutor.java | 7 ++-- .../mybatis/plus/util/WrapperUtils.java | 36 ------------------- 3 files changed, 14 insertions(+), 43 deletions(-) delete mode 100644 dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java index 19f29cb6..93e85662 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/AppenderContext.java @@ -17,11 +17,12 @@ package com.gitee.dorive.mybatis.plus.impl; +import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.mybatis.plus.api.CriterionAppender; -import com.gitee.dorive.mybatis.plus.util.WrapperUtils; import java.util.Collection; import java.util.Map; @@ -66,14 +67,21 @@ public class AppenderContext { }); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.AND, (abstractWrapper, property, value) -> { if (value instanceof Example) { - abstractWrapper.and(q -> WrapperUtils.appendCriterion(q, (Example) value)); + abstractWrapper.and(q -> appendCriterion(q, (Example) value)); } }); OPERATOR_CRITERION_APPENDER_MAP.put(Operator.OR, (abstractWrapper, property, value) -> { if (value instanceof Example) { - abstractWrapper.or(q -> WrapperUtils.appendCriterion(q, (Example) value)); + abstractWrapper.or(q -> appendCriterion(q, (Example) value)); } }); } + public static void appendCriterion(AbstractWrapper abstractWrapper, Example example) { + for (Criterion criterion : example.getCriteria()) { + CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); + criterionAppender.appendCriterion(abstractWrapper, criterion.getProperty(), criterion.getValue()); + } + } + } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index bb91fab9..7e6604cc 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -39,7 +39,6 @@ import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.mybatis.plus.api.CriterionAppender; -import com.gitee.dorive.mybatis.plus.util.WrapperUtils; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -129,7 +128,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { queryWrapper.select(sqlSelect + StringPool.COMMA + selectSuffix); } - WrapperUtils.appendCriterion(queryWrapper, example); + AppenderContext.appendCriterion(queryWrapper, example); OrderBy orderBy = example.getOrderBy(); if (orderBy != null) { @@ -187,7 +186,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { private UpdateWrapper buildUpdateWrapper(Example example) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - WrapperUtils.appendCriterion(updateWrapper, example); + AppenderContext.appendCriterion(updateWrapper, example); return updateWrapper; } @@ -207,7 +206,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { criterionAppender.appendCriterion(updateWrapper, "id", primaryKey); } if (example != null) { - WrapperUtils.appendCriterion(updateWrapper, example); + AppenderContext.appendCriterion(updateWrapper, example); } return updateWrapper; } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java deleted file mode 100644 index 40b95402..00000000 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/util/WrapperUtils.java +++ /dev/null @@ -1,36 +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.mybatis.plus.util; - -import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.mybatis.plus.api.CriterionAppender; - -import static com.gitee.dorive.mybatis.plus.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; - -public class WrapperUtils { - - public static void appendCriterion(AbstractWrapper abstractWrapper, Example example) { - for (Criterion criterion : example.getCriteria()) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(criterion.getOperator()); - criterionAppender.appendCriterion(abstractWrapper, criterion.getProperty(), criterion.getValue()); - } - } - -} -- Gitee From 89091edd3f7fdd0a8b21b8f86c2e7270fc1a63f2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 20 Feb 2024 18:00:26 +0800 Subject: [PATCH 134/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E5=A4=A7=E3=80=91?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89id=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= 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 | 42 +++++++++++++++++ .../gitee/dorive/api/entity/def/FieldDef.java | 1 + .../dorive/api/entity/element/EntityEle.java | 6 ++- .../api/entity/element/EntityField.java | 9 +++- .../dorive/api/entity/element/EntityType.java | 45 ++++++++++--------- ...eption.java => DefineEntityException.java} | 4 +- .../core/entity/common/EntityStoreInfo.java | 4 +- .../dorive/core/entity/operation/Query.java | 4 -- .../core/impl/executor/FactoryExecutor.java | 11 +++-- .../core/impl/factory/OperationFactory.java | 6 +-- .../core/impl/resolver/BinderResolver.java | 7 ++- .../repository/AbstractContextRepository.java | 2 +- .../core/repository/CommonRepository.java | 7 +-- .../plus/impl/MybatisPlusExecutor.java | 30 +++++-------- .../gitee/dorive/query/entity/BuildQuery.java | 5 ++- .../repository/AbstractQueryRepository.java | 2 +- .../dorive/sql/impl/SqlQueryBuilder.java | 17 +++++-- .../gitee/dorive/sql/impl/UnionExecutor.java | 2 +- 19 files changed, 137 insertions(+), 69 deletions(-) create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java rename dorive-api/src/main/java/com/gitee/dorive/api/exception/{CircularDependencyException.java => DefineEntityException.java} (88%) 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 ff42c494..1cf13397 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 @@ -27,6 +27,8 @@ import java.lang.annotation.*; @Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD}) public @interface Field { + boolean isId() default false; + @AliasFor("alias") String value() default ""; 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 new file mode 100644 index 00000000..169be88e --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.annotation; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Field +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Id { + + @AliasFor(annotation = Field.class) + boolean isId() default true; + + @AliasFor(annotation = Field.class) + String value() default "id"; + +} 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 0bcde9f3..b4b90f8a 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 @@ -32,6 +32,7 @@ import java.util.Map; @AllArgsConstructor public class FieldDef { + private boolean isId; private String alias; private Class converter; private String mapExp; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java index e87956fd..4a409df9 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityEle.java @@ -39,7 +39,7 @@ public abstract class EntityEle { private EntityDef entityDef; private boolean aggregated; private List bindingDefs; - private PropProxy pkProxy; + private PropProxy idProxy; private Map fieldAliasMapping; public EntityEle(AnnotatedElement element) { @@ -58,7 +58,7 @@ public abstract class EntityEle { } public void initialize() { - if (entityDef != null && pkProxy == null) { + if (entityDef != null && idProxy == null) { doInitialize(); } } @@ -105,4 +105,6 @@ public abstract class EntityEle { public abstract Map getEntityFieldMap(); + public abstract String getIdName(); + } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java index 338f9151..772c90ab 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityField.java @@ -18,8 +18,8 @@ package com.gitee.dorive.api.entity.element; import cn.hutool.core.util.ReflectUtil; -import com.gitee.dorive.api.entity.def.FieldDef; import com.gitee.dorive.api.entity.def.EntityDef; +import com.gitee.dorive.api.entity.def.FieldDef; import lombok.Data; import lombok.EqualsAndHashCode; @@ -81,7 +81,7 @@ public class EntityField extends EntityEle { protected void doInitialize() { if (entityType != null) { entityType.initialize(); - setPkProxy(entityType.getPkProxy()); + setIdProxy(entityType.getIdProxy()); setFieldAliasMapping(entityType.getFieldAliasMapping()); } } @@ -91,6 +91,11 @@ public class EntityField extends EntityEle { 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(); } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java index ee986729..1b57538b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java @@ -22,7 +22,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.entity.def.FieldDef; -import com.gitee.dorive.api.exception.CircularDependencyException; +import com.gitee.dorive.api.exception.DefineEntityException; import com.gitee.dorive.api.impl.factory.PropProxyFactory; import com.gitee.dorive.api.util.ReflectUtils; import lombok.Data; @@ -47,6 +47,7 @@ public class EntityType extends EntityEle { private Class type; private String name; + private EntityField idField; private Map entityFieldMap; public static synchronized EntityType getInstance(Class type) { @@ -57,7 +58,7 @@ public class EntityType extends EntityEle { CACHE.put(type, entityType); LOCK.remove(type); } else { - throw new CircularDependencyException("Circular Dependency! type: " + type.getName()); + throw new DefineEntityException("The entity nested itself! type: " + type.getName()); } } return entityType; @@ -67,44 +68,43 @@ public class EntityType extends EntityEle { 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); - entityFieldMap.put(entityField.getName(), entityField); - - } catch (CircularDependencyException e) { + String fieldName = entityField.getName(); + if (idField == null) { + FieldDef fieldDef = entityField.getFieldDef(); + if ("id".equals(fieldName) || fieldDef.isId()) { + idField = entityField; + } + } + entityFieldMap.put(fieldName, entityField); + + } catch (DefineEntityException e) { log.warn(e.getMessage()); } } } - initialize(); } @Override protected void doInitialize() { Class genericType = getGenericType(); - int initialCapacity = entityFieldMap.size() * 4 / 3 + 1; - PropProxy pkProxy = null; - Map fieldAliasMapping = new LinkedHashMap<>(initialCapacity); + 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 field = entityField.getName(); + String fieldName = entityField.getName(); FieldDef fieldDef = entityField.getFieldDef(); - if ("id".equals(field)) { - pkProxy = PropProxyFactory.newPropProxy(genericType, "id"); - } - String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(field); - fieldAliasMapping.put(field, alias); + String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(fieldName); + fieldAliasMapping.put(fieldName, alias); } - - Assert.notNull(pkProxy, "The primary key not found! type: {}", genericType.getName()); - setPkProxy(pkProxy); setFieldAliasMapping(fieldAliasMapping); } @@ -128,4 +128,9 @@ public class EntityType extends EntityEle { return entityFieldMap; } + @Override + public String getIdName() { + return idField.getName(); + } + } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/exception/CircularDependencyException.java b/dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java similarity index 88% rename from dorive-api/src/main/java/com/gitee/dorive/api/exception/CircularDependencyException.java rename to dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java index 21b04509..b865065e 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/exception/CircularDependencyException.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/exception/DefineEntityException.java @@ -22,9 +22,9 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public class CircularDependencyException extends RuntimeException { +public class DefineEntityException extends RuntimeException { - public CircularDependencyException(String message) { + public DefineEntityException(String message) { super(message); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 9c5e9217..62c7b7cf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -29,8 +29,8 @@ public class EntityStoreInfo { private Object mapper; private Class pojoClass; private String tableName; - private String primaryProp; - private String primaryAlias; + private String idProperty; + private String idColumn; private Map propAliasMappingWithoutPk; private Map propAliasMapping; private String selectColumns; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java index 3697b6d2..c679a77d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java @@ -32,8 +32,4 @@ public class Query extends Condition { return getPrimaryKey() == null && getExample() == null; } - public boolean startPage() { - return getExample() != null && getExample().getPage() != null; - } - } 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 901a878c..29f982f0 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 @@ -22,6 +22,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.converter.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; @@ -42,11 +43,13 @@ import java.util.Map; public class FactoryExecutor extends AbstractProxyExecutor { private EntityEle entityEle; + private EntityStoreInfo entityStoreInfo; private EntityFactory entityFactory; - public FactoryExecutor(Executor executor, EntityEle entityEle, EntityFactory entityFactory) { + public FactoryExecutor(Executor executor, EntityEle entityEle, EntityStoreInfo entityStoreInfo, EntityFactory entityFactory) { super(executor); this.entityEle = entityEle; + this.entityStoreInfo = entityStoreInfo; this.entityFactory = entityFactory; } @@ -96,8 +99,10 @@ public class FactoryExecutor extends AbstractProxyExecutor { int totalCount = super.execute(context, operation); if (operation instanceof Insert) { Object persistent = operation.getEntity(); - Object primaryKey = BeanUtil.getFieldValue(persistent, "id"); - entityEle.getPkProxy().setValue(entity, primaryKey); + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + if (primaryKey != null) { + entityEle.getIdProxy().setValue(entity, primaryKey); + } } operation.setEntity(entity); return totalCount; 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 55c97123..2d425c4d 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 @@ -47,7 +47,7 @@ public class OperationFactory { public Update buildUpdate(Object entity) { Update update = new Update(entity); - Object primaryKey = entityEle.getPkProxy().getValue(entity); + Object primaryKey = entityEle.getIdProxy().getValue(entity); update.setPrimaryKey(primaryKey); return update; } @@ -59,7 +59,7 @@ public class OperationFactory { } public Operation buildInsertOrUpdate(Object entity) { - Object primaryKey = entityEle.getPkProxy().getValue(entity); + Object primaryKey = entityEle.getIdProxy().getValue(entity); if (primaryKey == null) { return new Insert(entity); } else { @@ -71,7 +71,7 @@ public class OperationFactory { public Delete buildDelete(Object entity) { Delete delete = new Delete(entity); - Object primaryKey = entityEle.getPkProxy().getValue(entity); + Object primaryKey = entityEle.getIdProxy().getValue(entity); delete.setPrimaryKey(primaryKey); return delete; } 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 417ae98a..4298bf01 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 @@ -68,6 +68,9 @@ public class BinderResolver { public void resolve(String accessPath, EntityDef entityDef, EntityEle entityEle) { Map propChainMap = propChainResolver.getPropChainMap(); + + Class genericType = entityEle.getGenericType(); + String idName = entityEle.getIdName(); List bindingDefs = entityEle.getBindingDefs(); allBinders = new ArrayList<>(bindingDefs.size()); @@ -88,7 +91,7 @@ public class BinderResolver { PropChain fieldPropChain = propChainMap.get("/" + field); Assert.notNull(fieldPropChain, "The field configured for @Binding does not exist within the entity! type: {}, field: {}", - entityEle.getGenericType().getName(), field); + genericType.getName(), field); fieldPropChain.newPropProxy(); Processor processor = newProcessor(bindingDef); @@ -105,7 +108,7 @@ public class BinderResolver { selfFields.add(field); if (propertyBinder.isSameType()) { - if (!"id".equals(field)) { + if (!idName.equals(field)) { boundValueBinders.add(propertyBinder); } else { if (entityDef.getPriority() == 0) { 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 08e6b733..8ccee70b 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 @@ -194,7 +194,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); - executor = new FactoryExecutor(executor, entityEle, entityFactory); + executor = new FactoryExecutor(executor, entityEle, entityStoreInfo, entityFactory); executor = new ExampleExecutor(executor, entityEle, entityMapper); EXAMPLE_EXECUTOR_MAP.put(entityEle, (ExampleExecutor) executor); defaultRepository.setExecutor(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 67ec785a..458272a0 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 @@ -57,7 +57,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher } public Object getPrimaryKey(Object entity) { - return getEntityEle().getPkProxy().getValue(entity); + return getEntityEle().getIdProxy().getValue(entity); } public boolean hasField(String field) { @@ -83,8 +83,9 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher if (selector != null) { List properties = selector.select(getName()); if (properties != null && !properties.isEmpty()) { - if (query.getPrimaryKey() != null) { - Example example = new InnerExample().eq("id", query.getPrimaryKey()); + Object primaryKey = query.getPrimaryKey(); + if (primaryKey != null) { + Example example = new InnerExample().eq(getEntityEle().getIdName(), primaryKey); query.setPrimaryKey(null); query.setExample(example); } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 7e6604cc..d917410e 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 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.Operator; import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; @@ -38,7 +37,6 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; -import com.gitee.dorive.mybatis.plus.api.CriterionAppender; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -50,8 +48,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static com.gitee.dorive.mybatis.plus.impl.AppenderContext.OPERATOR_CRITERION_APPENDER_MAP; - @Getter @Setter @ToString @@ -74,30 +70,29 @@ public class MybatisPlusExecutor extends AbstractExecutor { @Override public Result executeQuery(Context context, Query query) { - if (query.getPrimaryKey() != null) { + Object primaryKey = query.getPrimaryKey(); + if (primaryKey != null) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id", query.getPrimaryKey()); + queryWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); List> resultMaps = baseMapper.selectMaps(queryWrapper); return new Result<>(null, resultMaps); + } - } else if (query.getExample() != null) { - Example example = query.getExample(); - if (query.startPage()) { - com.gitee.dorive.core.entity.executor.Page page = example.getPage(); - - Page> queryPage = new Page<>(page.getCurrent(), page.getSize()); - QueryWrapper queryWrapper = buildQueryWrapper(example); - queryPage = baseMapper.selectMapsPage(queryPage, queryWrapper); - + Example example = query.getExample(); + if (example != null) { + QueryWrapper queryWrapper = buildQueryWrapper(example); + com.gitee.dorive.core.entity.executor.Page page = example.getPage(); + if (page != null) { + Page> queryPage = baseMapper.selectMapsPage(new Page<>(page.getCurrent(), page.getSize()), queryWrapper); page.setTotal(queryPage.getTotal()); return new Result<>(page, queryPage.getRecords()); } else { - QueryWrapper queryWrapper = buildQueryWrapper(example); List> resultMaps = baseMapper.selectMaps(queryWrapper); return new Result<>(null, resultMaps); } } + return new Result<>(null, Collections.emptyList()); } @@ -202,8 +197,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { }); if (primaryKey != null) { - CriterionAppender criterionAppender = OPERATOR_CRITERION_APPENDER_MAP.get(Operator.EQ); - criterionAppender.appendCriterion(updateWrapper, "id", primaryKey); + updateWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); } if (example != null) { AppenderContext.appendCriterion(updateWrapper, example); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java index d54a8519..5c40be7d 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java @@ -19,6 +19,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.impl.builder.QueryResolver; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; import java.util.Map; @@ -26,6 +27,7 @@ import java.util.Map; @Data public class BuildQuery { + private AbstractQueryRepository repository; private Object query; private boolean onlyCount; private QueryResolver queryResolver; @@ -35,7 +37,8 @@ public class BuildQuery { private boolean countQueried; private boolean dataSetQueried; - public BuildQuery(Object query, boolean onlyCount) { + public BuildQuery(AbstractQueryRepository repository, Object query, boolean onlyCount) { + this.repository = repository; this.query = query; this.onlyCount = onlyCount; } 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 cd846957..5ec841cd 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 @@ -72,7 +72,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } public BuildQuery doNewQuery(Context context, Object query, boolean onlyCount) { - BuildQuery buildQuery = new BuildQuery(query, onlyCount); + BuildQuery buildQuery = new BuildQuery(this, query, onlyCount); Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); Assert.notNull(queryResolver, "No query resolver found!"); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java index db268ae3..85b83d16 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java @@ -18,13 +18,17 @@ package com.gitee.dorive.sql.impl; import cn.hutool.core.collection.CollUtil; +import com.gitee.dorive.api.entity.element.EntityEle; 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.OrderBy; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.util.ExampleUtils; import com.gitee.dorive.query.api.QueryBuilder; import com.gitee.dorive.query.entity.BuildQuery; +import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.ArgSegment; import com.gitee.dorive.sql.entity.SelectSegment; @@ -45,6 +49,11 @@ public class SqlQueryBuilder implements QueryBuilder { @Override public void buildQuery(Context context, BuildQuery buildQuery) { + AbstractQueryRepository repository = buildQuery.getRepository(); + EntityEle entityEle = repository.getEntityEle(); + EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); + String idColumn = entityStoreInfo.getIdColumn(); + Example example = buildQuery.getExample(); boolean onlyCount = buildQuery.isOnlyCount(); OrderBy orderBy = example.getOrderBy(); @@ -67,7 +76,7 @@ public class SqlQueryBuilder implements QueryBuilder { selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); - selectColumns.add(tableAlias + ".id"); + selectColumns.add(tableAlias + "." + idColumn); selectSegment.setSelectColumns(selectColumns); String selectSql = selectSegment.selectSql(); @@ -99,7 +108,7 @@ public class SqlQueryBuilder implements QueryBuilder { boolean rebuildSql = false; if (orderBy != null) { for (String property : orderBy.getProperties()) { - if (!"id".equals(property)) { + if (!idColumn.equals(property)) { selectColumns.add(tableAlias + "." + property); rebuildSql = true; } @@ -116,9 +125,9 @@ public class SqlQueryBuilder implements QueryBuilder { String sql = selectSql + fromWhereSql + selectSegment.lastSql(); List> resultMaps = sqlRunner.selectList(sql, args.toArray()); - List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); + List primaryKeys = CollUtil.map(resultMaps, map -> map.get(idColumn), true); if (!primaryKeys.isEmpty()) { - example.in("id", primaryKeys); + example.in(entityEle.getIdName(), primaryKeys); buildQuery.setDataSetQueried(true); } else { buildQuery.setAbandoned(true); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java index 710b681d..f9db3dba 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/UnionExecutor.java @@ -135,7 +135,7 @@ public class UnionExecutor extends AbstractProxyExecutor { private Result buildResult(List> resultMaps) { Map> idResultMapMapping = new LinkedHashMap<>(resultMaps.size() * 4 / 3 + 1); for (Map resultMap : resultMaps) { - Object id = resultMap.get("id"); + Object id = resultMap.get(entityStoreInfo.getIdColumn()); Object row = resultMap.get("$row"); if (id == null || row == null) { continue; -- Gitee From 9df078d09c479baf847ee1c55ade64c53377870e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 21 Feb 2024 09:48:14 +0800 Subject: [PATCH 135/146] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=8F=AF=E9=9D=A0=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/api/entity/element/EntityType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java index 1b57538b..c004e85f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/element/EntityType.java @@ -77,7 +77,7 @@ public class EntityType extends EntityEle { String fieldName = entityField.getName(); if (idField == null) { FieldDef fieldDef = entityField.getFieldDef(); - if ("id".equals(fieldName) || fieldDef.isId()) { + if ("id".equals(fieldName) || (fieldDef != null && fieldDef.isId())) { idField = entityField; } } -- Gitee From 07f0c8285d07bd3df56cdd684a21be28dca8ffd8 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 21 Feb 2024 23:05:27 +0800 Subject: [PATCH 136/146] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=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 --- .../repository/MybatisPlusRepository.java | 18 +-- .../gitee/dorive/query/api/QueryExecutor.java | 30 +++++ .../{BuildQuery.java => QueryContext.java} | 15 +-- .../QueryWrapper.java} | 14 +- ...Builder.java => DefaultQueryExecutor.java} | 29 +++-- .../query/impl/builder/QueryResolver.java | 29 ++--- .../repository/AbstractQueryRepository.java | 121 +++++++----------- .../gitee/dorive/sql/impl/CountQuerier.java | 9 +- .../gitee/dorive/sql/impl/SegmentBuilder.java | 21 +-- ...ueryBuilder.java => SqlQueryExecutor.java} | 40 +++--- 10 files changed, 173 insertions(+), 153 deletions(-) create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java rename dorive-query/src/main/java/com/gitee/dorive/query/entity/{BuildQuery.java => QueryContext.java} (80%) rename dorive-query/src/main/java/com/gitee/dorive/query/{api/QueryBuilder.java => entity/QueryWrapper.java} (77%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/{DefaultQueryBuilder.java => DefaultQueryExecutor.java} (88%) rename dorive-sql/src/main/java/com/gitee/dorive/sql/impl/{SqlQueryBuilder.java => SqlQueryExecutor.java} (80%) 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 ce748c7b..e831281d 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 @@ -30,13 +30,14 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.option.QueryStrategy; import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; -import com.gitee.dorive.query.api.QueryBuilder; -import com.gitee.dorive.query.entity.BuildQuery; +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.SqlRunner; import com.gitee.dorive.sql.impl.CountQuerier; import com.gitee.dorive.sql.impl.SegmentBuilder; -import com.gitee.dorive.sql.impl.SqlQueryBuilder; +import com.gitee.dorive.sql.impl.SqlQueryExecutor; import com.gitee.dorive.sql.impl.UnionExecutor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -54,7 +55,7 @@ import java.util.Map; public class MybatisPlusRepository extends AbstractRefRepository { private SqlRunner sqlRunner; - private QueryBuilder sqlQueryBuilder; + private QueryExecutor sqlQueryExecutor; private CountQuerier countQuerier; @Override @@ -62,7 +63,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); this.sqlRunner = implFactory.getInstance(SqlRunner.class); SegmentBuilder segmentBuilder = new SegmentBuilder(); - this.sqlQueryBuilder = new SqlQueryBuilder(segmentBuilder, this.sqlRunner); + this.sqlQueryExecutor = new SqlQueryExecutor(segmentBuilder, this.sqlRunner); this.countQuerier = new CountQuerier(this, segmentBuilder, this.sqlRunner); super.afterPropertiesSet(); } @@ -125,12 +126,13 @@ public class MybatisPlusRepository extends AbstractRefRepository { } @Override - protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { + protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { + Context context = queryContext.getContext(); QueryStrategy queryStrategy = (QueryStrategy) context.getOption(QueryStrategy.class); if (queryStrategy == null || queryStrategy == QueryStrategy.SQL) { - return sqlQueryBuilder; + return sqlQueryExecutor; } - return super.adaptiveQueryBuilder(context, buildQuery); + return super.adaptiveQueryExecutor(queryContext, queryWrapper); } } 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 new file mode 100644 index 00000000..adb1f2c1 --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryExecutor.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.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); + + long executeCount(QueryContext queryContext, QueryWrapper queryWrapper); + +} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java similarity index 80% rename from dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java index 5c40be7d..bdd12eea 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/BuildQuery.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryContext.java @@ -17,6 +17,7 @@ package com.gitee.dorive.query.entity; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.query.impl.builder.QueryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; @@ -25,22 +26,18 @@ import lombok.Data; import java.util.Map; @Data -public class BuildQuery { +public class QueryContext { private AbstractQueryRepository repository; - private Object query; - private boolean onlyCount; + private Context context; private QueryResolver queryResolver; private Map exampleMap; private Example example; - private boolean abandoned; - private boolean countQueried; - private boolean dataSetQueried; + private boolean onlyCount; - public BuildQuery(AbstractQueryRepository repository, Object query, boolean onlyCount) { + public QueryContext(AbstractQueryRepository repository, Context context) { this.repository = repository; - this.query = query; - this.onlyCount = onlyCount; + this.context = context; } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java similarity index 77% rename from dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java index 1f905540..3d01c608 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/api/QueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryWrapper.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package com.gitee.dorive.query.api; +package com.gitee.dorive.query.entity; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.query.entity.BuildQuery; - -public interface QueryBuilder { - - void buildQuery(Context context, BuildQuery buildQuery); +import lombok.AllArgsConstructor; +import lombok.Data; +@Data +@AllArgsConstructor +public class QueryWrapper { + private Object query; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java similarity index 88% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java index 664fb992..f048808c 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryBuilder.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java @@ -20,13 +20,15 @@ package com.gitee.dorive.query.impl.builder; 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.util.MultiInBuilder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.entity.BuildQuery; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryWrapper; import lombok.AllArgsConstructor; import lombok.Data; @@ -36,19 +38,28 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -public class DefaultQueryBuilder implements QueryBuilder { +public class DefaultQueryExecutor implements QueryExecutor { @Override - public void buildQuery(Context context, BuildQuery buildQuery) { - Map exampleWrapperMap = buildExampleWrapperMap(buildQuery); + public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + return null; + } + + @Override + public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { + return 0; + } + + public void buildQuery(Context context, QueryWrapper queryWrapper) { + Map exampleWrapperMap = buildExampleWrapperMap(queryWrapper); executeQuery(context, exampleWrapperMap); ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); - buildQuery.setAbandoned(exampleWrapper.isAbandoned()); + queryWrapper.setAbandoned(exampleWrapper.isAbandoned()); } - private Map buildExampleWrapperMap(BuildQuery buildQuery) { - QueryResolver queryResolver = buildQuery.getQueryResolver(); - Map exampleMap = buildQuery.getExampleMap(); + private Map buildExampleWrapperMap(QueryWrapper queryWrapper) { + QueryResolver queryResolver = queryWrapper.getQueryResolver(); + Map exampleMap = queryWrapper.getExampleMap(); Map exampleWrapperMap = new LinkedHashMap<>(); for (MergedRepository mergedRepository : queryResolver.getReversedMergedRepositories()) { String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java index f8b918d3..9e1df032 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java @@ -18,24 +18,23 @@ package com.gitee.dorive.query.impl.builder; import com.gitee.dorive.api.constant.Operator; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.*; -import com.gitee.dorive.query.api.QueryBuilder; +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.BuildQuery; -import com.gitee.dorive.query.entity.QueryField; -import com.gitee.dorive.query.entity.SpecificFields; -import com.gitee.dorive.query.entity.def.ExampleDef; +import com.gitee.dorive.query.entity.*; import com.gitee.dorive.query.entity.def.CriterionDef; +import com.gitee.dorive.query.entity.def.ExampleDef; import lombok.AllArgsConstructor; import lombok.Data; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; @Data @AllArgsConstructor -public class QueryResolver implements QueryBuilder { +public class QueryResolver { private ExampleDef exampleDef; private List queryFields; @@ -43,16 +42,14 @@ public class QueryResolver implements QueryBuilder { private List mergedRepositories; private List reversedMergedRepositories; - @Override - public void buildQuery(Context context, BuildQuery buildQuery) { - Object query = buildQuery.getQuery(); + public void resolve(QueryContext queryContext, QueryWrapper queryWrapper) { + Object query = queryWrapper.getQuery(); Map exampleMap = newExampleMap(query); Example example = exampleMap.computeIfAbsent("/", key -> new InnerExample()); example.setOrderBy(specificFields.newOrderBy(query)); example.setPage(specificFields.newPage(query)); - buildQuery.setQueryResolver(this); - buildQuery.setExampleMap(exampleMap); - buildQuery.setExample(example); + queryContext.setExampleMap(exampleMap); + queryContext.setExample(example); } 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 5ec841cd..8b7c6925 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 @@ -21,14 +21,15 @@ 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.Options; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.event.repository.AbstractEventRepository; -import com.gitee.dorive.query.api.QueryBuilder; +import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.api.QueryRepository; -import com.gitee.dorive.query.entity.BuildQuery; +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.impl.builder.DefaultQueryBuilder; +import com.gitee.dorive.query.impl.builder.DefaultQueryExecutor; import com.gitee.dorive.query.impl.builder.QueryResolver; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; @@ -37,107 +38,83 @@ import lombok.EqualsAndHashCode; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; -import java.util.Collections; import java.util.List; import java.util.Map; @Data @EqualsAndHashCode(callSuper = false) -public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryBuilder, QueryRepository { +public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryRepository, QueryExecutor { private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private QueryTypeResolver queryTypeResolver; - private QueryBuilder queryBuilder; + private QueryExecutor defaultQueryExecutor; @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Repository repository = AnnotatedElementUtils.getMergedAnnotation(this.getClass(), Repository.class); - queryScanDef = QueryScanDef.fromElement(this.getClass()); - if (repository != null && queryScanDef != null) { - if (StringUtils.isBlank(queryScanDef.getRegex())) { - queryScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); + this.queryScanDef = QueryScanDef.fromElement(this.getClass()); + if (repository != null && this.queryScanDef != null) { + if (StringUtils.isBlank(this.queryScanDef.getRegex())) { + this.queryScanDef.setRegex("^" + getEntityClass().getSimpleName() + ".*"); } - mergedRepositoryResolver = new MergedRepositoryResolver(this); - queryTypeResolver = new QueryTypeResolver(this); - queryBuilder = new DefaultQueryBuilder(); + this.mergedRepositoryResolver = new MergedRepositoryResolver(this); + this.queryTypeResolver = new QueryTypeResolver(this); + this.defaultQueryExecutor = new DefaultQueryExecutor(); } } - public BuildQuery newQuery(Context context, Object query, boolean onlyCount) { - BuildQuery buildQuery = doNewQuery(context, query, onlyCount); - buildQuery(context, buildQuery); - return buildQuery; + @Override + @SuppressWarnings("unchecked") + public List selectByQuery(Options options, Object query) { + QueryContext queryContext = new QueryContext(this, (Context) options); + QueryWrapper queryWrapper = new QueryWrapper(query); + resolveQuery(queryContext, queryWrapper); + Result result = executeQuery(queryContext, queryWrapper); + return (List) result.getRecords(); } - public BuildQuery doNewQuery(Context context, Object query, boolean onlyCount) { - BuildQuery buildQuery = new BuildQuery(this, query, onlyCount); - Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); - QueryResolver queryResolver = nameQueryResolverMap.get(query.getClass().getName()); - Assert.notNull(queryResolver, "No query resolver found!"); - queryResolver.buildQuery(context, buildQuery); - return buildQuery; + @Override + @SuppressWarnings("unchecked") + public Page selectPageByQuery(Options options, Object query) { + QueryContext queryContext = new QueryContext(this, (Context) options); + QueryWrapper queryWrapper = new QueryWrapper(query); + resolveQuery(queryContext, queryWrapper); + Result result = executeQuery(queryContext, queryWrapper); + return (Page) result.getPage(); } @Override - public void buildQuery(Context context, BuildQuery buildQuery) { - QueryBuilder queryBuilder = adaptiveQueryBuilder(context, buildQuery); - queryBuilder.buildQuery(context, buildQuery); + public long selectCountByQuery(Options options, Object query) { + QueryContext queryContext = new QueryContext(this, (Context) options); + QueryWrapper queryWrapper = new QueryWrapper(query); + resolveQuery(queryContext, queryWrapper); + return executeCount(queryContext, queryWrapper); } - protected QueryBuilder adaptiveQueryBuilder(Context context, BuildQuery buildQuery) { - return queryBuilder; + public void resolveQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + Map nameQueryResolverMap = queryTypeResolver.getNameQueryResolverMap(); + QueryResolver queryResolver = nameQueryResolverMap.get(queryWrapper.getQuery().getClass().getName()); + Assert.notNull(queryResolver, "No query resolver found!"); + queryContext.setQueryResolver(queryResolver); + queryResolver.resolve(queryContext, queryWrapper); } @Override - public List selectByQuery(Options options, Object query) { - Context context = (Context) options; - BuildQuery buildQuery = newQuery(context, query, false); - Example example = buildQuery.getExample(); - if (buildQuery.isAbandoned()) { - return Collections.emptyList(); - } - if (buildQuery.isDataSetQueried()) { - example.setPage(null); - return selectByExample(context, example); - } - return selectByExample(context, example); + public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); + return queryExecutor.executeQuery(queryContext, queryWrapper); } @Override - @SuppressWarnings("unchecked") - public Page selectPageByQuery(Options options, Object query) { - Context context = (Context) options; - BuildQuery buildQuery = newQuery(context, query, false); - Example example = buildQuery.getExample(); - if (buildQuery.isAbandoned()) { - return (Page) example.getPage(); - } - if (buildQuery.isDataSetQueried()) { - Page page = example.getPage(); - example.setPage(null); - List records = selectByExample(context, example); - example.setPage(page); - page.setRecords((List) records); - return (Page) page; - } - return selectPageByExample(context, example); + public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); + return queryExecutor.executeCount(queryContext, queryWrapper); } - @Override - public long selectCountByQuery(Options options, Object query) { - Context context = (Context) options; - BuildQuery buildQuery = newQuery(context, query, true); - Example example = buildQuery.getExample(); - if (buildQuery.isAbandoned()) { - return 0L; - } - if (buildQuery.isCountQueried()) { - Page page = example.getPage(); - return page.getTotal(); - } - return selectCountByExample(context, example); + protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { + return defaultQueryExecutor; } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index b9266185..6bbb36e6 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -19,7 +19,8 @@ package com.gitee.dorive.sql.impl; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.query.entity.BuildQuery; +import com.gitee.dorive.query.entity.QueryContext; +import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.SelectSegment; @@ -43,9 +44,11 @@ public class CountQuerier { private SqlRunner sqlRunner; public Map selectCountMap(Context context, CountQuery countQuery) { - BuildQuery buildQuery = repository.doNewQuery(context, countQuery.getQuery(), false); + QueryContext queryContext = new QueryContext(repository, context); + QueryWrapper queryWrapper = new QueryWrapper(countQuery.getQuery()); + repository.resolveQuery(queryContext, queryWrapper); - SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); + SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); TableSegment tableSegment = selectSegment.getTableSegment(); List args = selectSegment.getArgs(); String tableAlias = tableSegment.getTableAlias(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index e68c9dab..1d88d794 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -30,29 +30,22 @@ 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.BuildQuery; import com.gitee.dorive.query.entity.MergedRepository; +import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.impl.builder.QueryResolver; -import com.gitee.dorive.sql.entity.ArgSegment; -import com.gitee.dorive.sql.entity.JoinSegment; -import com.gitee.dorive.sql.entity.OnSegment; -import com.gitee.dorive.sql.entity.SelectSegment; -import com.gitee.dorive.sql.entity.TableSegment; +import com.gitee.dorive.sql.entity.*; import lombok.AllArgsConstructor; import lombok.Data; -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 SegmentBuilder { - public SelectSegment buildSegment(Context context, BuildQuery buildQuery) { - QueryResolver queryResolver = buildQuery.getQueryResolver(); - Map exampleMap = buildQuery.getExampleMap(); + public SelectSegment buildSegment(QueryContext queryContext) { + Context context = queryContext.getContext(); + QueryResolver queryResolver = queryContext.getQueryResolver(); + Map exampleMap = queryContext.getExampleMap(); List mergedRepositories = queryResolver.getMergedRepositories(); Map nodeMap = new LinkedHashMap<>(mergedRepositories.size() * 4 / 3 + 1); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java similarity index 80% rename from dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java rename to dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index 85b83d16..8a60d8db 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -19,15 +19,16 @@ package com.gitee.dorive.sql.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.element.EntityEle; -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.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.util.ExampleUtils; -import com.gitee.dorive.query.api.QueryBuilder; -import com.gitee.dorive.query.entity.BuildQuery; +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.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.ArgSegment; @@ -42,27 +43,36 @@ import java.util.Map; @Data @AllArgsConstructor -public class SqlQueryBuilder implements QueryBuilder { +public class SqlQueryExecutor implements QueryExecutor { private SegmentBuilder segmentBuilder; private SqlRunner sqlRunner; @Override - public void buildQuery(Context context, BuildQuery buildQuery) { - AbstractQueryRepository repository = buildQuery.getRepository(); + public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + return null; + } + + @Override + public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { + return 0; + } + + public Result doExecuteQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + AbstractQueryRepository repository = queryContext.getRepository(); EntityEle entityEle = repository.getEntityEle(); EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); String idColumn = entityStoreInfo.getIdColumn(); - Example example = buildQuery.getExample(); - boolean onlyCount = buildQuery.isOnlyCount(); + Example example = queryContext.getExample(); + boolean onlyCount = queryContext.isOnlyCount(); OrderBy orderBy = example.getOrderBy(); example = ExampleUtils.clone(example); - buildQuery.setExample(example); + queryContext.setExample(example); Page page = example.getPage(); - SelectSegment selectSegment = segmentBuilder.buildSegment(context, buildQuery); + SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); char letter = selectSegment.getLetter(); TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); @@ -90,7 +100,7 @@ public class SqlQueryBuilder implements QueryBuilder { example.setPage(page); } page.setTotal(count); - buildQuery.setCountQueried(true); + queryWrapper.setCountQueried(true); return; } @@ -98,9 +108,9 @@ public class SqlQueryBuilder implements QueryBuilder { String countSql = selectSql + fromWhereSql; long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); page.setTotal(count); - buildQuery.setCountQueried(true); + queryWrapper.setCountQueried(true); if (count == 0L) { - buildQuery.setAbandoned(true); + queryWrapper.setAbandoned(true); return; } } @@ -128,9 +138,9 @@ public class SqlQueryBuilder implements QueryBuilder { List primaryKeys = CollUtil.map(resultMaps, map -> map.get(idColumn), true); if (!primaryKeys.isEmpty()) { example.in(entityEle.getIdName(), primaryKeys); - buildQuery.setDataSetQueried(true); + queryWrapper.setDataSetQueried(true); } else { - buildQuery.setAbandoned(true); + queryWrapper.setAbandoned(true); } } -- Gitee From c5e7961680794e5ea4491f4718da7a577ef7923b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 14:34:44 +0800 Subject: [PATCH 137/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/query/api/QueryExecutor.java | 2 - .../dorive/query/entity/QueryContext.java | 27 ++++++- .../dorive/query/entity/enums/ResultType.java | 24 ++++++ .../impl/executor/AbstractQueryExecutor.java | 55 ++++++++++++++ .../DefaultQueryExecutor.java | 36 ++++----- .../{builder => resolver}/QueryResolver.java | 8 +- .../impl/resolver/QueryTypeResolver.java | 1 - .../repository/AbstractQueryRepository.java | 34 ++++----- .../gitee/dorive/sql/impl/CountQuerier.java | 3 +- .../gitee/dorive/sql/impl/SegmentBuilder.java | 2 +- .../dorive/sql/impl/SqlQueryExecutor.java | 73 ++++++++----------- 11 files changed, 174 insertions(+), 91 deletions(-) create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java rename dorive-query/src/main/java/com/gitee/dorive/query/impl/{builder => executor}/DefaultQueryExecutor.java (89%) rename dorive-query/src/main/java/com/gitee/dorive/query/impl/{builder => resolver}/QueryResolver.java (91%) 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 adb1f2c1..d49a4f3b 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 @@ -25,6 +25,4 @@ public interface QueryExecutor { Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper); - long executeCount(QueryContext queryContext, QueryWrapper queryWrapper); - } 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 bdd12eea..18958b81 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 @@ -19,10 +19,13 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.query.impl.builder.QueryResolver; +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.repository.AbstractQueryRepository; import lombok.Data; +import java.util.Collections; import java.util.Map; @Data @@ -30,14 +33,32 @@ public class QueryContext { private AbstractQueryRepository repository; private Context context; + private ResultType resultType; private QueryResolver queryResolver; private Map exampleMap; private Example example; - private boolean onlyCount; - public QueryContext(AbstractQueryRepository repository, Context context) { + public QueryContext(AbstractQueryRepository repository, Context context, ResultType resultType) { this.repository = repository; this.context = context; + this.resultType = resultType; + } + + public Result newEmptyResult() { + if (resultType == ResultType.COUNT_AND_DATA) { + return new Result<>(example.getPage()); + + } else if (resultType == ResultType.DATA) { + return new Result<>(Collections.emptyList()); + + } else if (resultType == ResultType.COUNT) { + return new Result<>(0L); + } + throw new RuntimeException("Unsupported type!"); + } + + public boolean isNeedCount() { + return resultType == ResultType.COUNT_AND_DATA || resultType == ResultType.COUNT; } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java new file mode 100644 index 00000000..4dcbb453 --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.query.entity.enums; + +public enum ResultType { + COUNT, + DATA, + COUNT_AND_DATA +} 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 new file mode 100644 index 00000000..e2ba2fd8 --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/AbstractQueryExecutor.java @@ -0,0 +1,55 @@ +/* + * 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.core.api.context.Context; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Page; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.query.api.QueryExecutor; +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 java.util.List; + +public abstract class AbstractQueryExecutor implements QueryExecutor { + + @Override + public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { + AbstractQueryRepository repository = queryContext.getRepository(); + Context context = queryContext.getContext(); + ResultType resultType = queryContext.getResultType(); + Example example = queryContext.getExample(); + if (resultType == ResultType.COUNT_AND_DATA) { + Page page = repository.selectPageByExample(context, example); + return new Result(page); + + } else if (resultType == ResultType.DATA) { + List entities = repository.selectByExample(context, example); + return new Result(entities); + + } else if (resultType == ResultType.COUNT) { + long count = repository.selectCountByExample(context, example); + return new Result<>(count); + } + return queryContext.newEmptyResult(); + } + +} diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java similarity index 89% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java index f048808c..3048d9ab 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/DefaultQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java @@ -15,20 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl.builder; +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.util.MultiInBuilder; import com.gitee.dorive.core.impl.binder.PropertyBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.query.api.QueryExecutor; +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.QueryWrapper; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import lombok.AllArgsConstructor; import lombok.Data; @@ -38,28 +38,23 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -public class DefaultQueryExecutor implements QueryExecutor { +public class DefaultQueryExecutor extends AbstractQueryExecutor { @Override public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - return null; - } - - @Override - public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { - return 0; - } - - public void buildQuery(Context context, QueryWrapper queryWrapper) { - Map exampleWrapperMap = buildExampleWrapperMap(queryWrapper); - executeQuery(context, exampleWrapperMap); + Map exampleWrapperMap = buildExampleWrapperMap(queryContext); + executeQuery(queryContext, exampleWrapperMap); ExampleWrapper exampleWrapper = exampleWrapperMap.get("/"); - queryWrapper.setAbandoned(exampleWrapper.isAbandoned()); + boolean abandoned = exampleWrapper.isAbandoned(); + if (abandoned) { + return queryContext.newEmptyResult(); + } + return super.executeQuery(queryContext, queryWrapper); } - private Map buildExampleWrapperMap(QueryWrapper queryWrapper) { - QueryResolver queryResolver = queryWrapper.getQueryResolver(); - Map exampleMap = queryWrapper.getExampleMap(); + 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(); @@ -71,7 +66,8 @@ public class DefaultQueryExecutor implements QueryExecutor { return exampleWrapperMap; } - private void executeQuery(Context context, Map exampleWrapperMap) { + private void executeQuery(QueryContext queryContext, Map exampleWrapperMap) { + Context context = queryContext.getContext(); exampleWrapperMap.forEach((accessPath, exampleWrapper) -> { if ("/".equals(accessPath)) return; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java similarity index 91% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java index 9e1df032..0db4b7db 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/builder/QueryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/QueryResolver.java @@ -15,14 +15,18 @@ * limitations under the License. */ -package com.gitee.dorive.query.impl.builder; +package com.gitee.dorive.query.impl.resolver; import com.gitee.dorive.api.constant.Operator; 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.*; +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; import lombok.AllArgsConstructor; 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 f3e8ee5d..f2e22a19 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 @@ -24,7 +24,6 @@ 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.impl.builder.QueryResolver; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.query.util.ResourceUtils; import com.gitee.dorive.core.repository.CommonRepository; 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 8b7c6925..943d8a19 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 @@ -27,10 +27,11 @@ 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.enums.ResultType; import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.def.QueryScanDef; -import com.gitee.dorive.query.impl.builder.DefaultQueryExecutor; -import com.gitee.dorive.query.impl.builder.QueryResolver; +import com.gitee.dorive.query.impl.executor.DefaultQueryExecutor; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; import lombok.Data; @@ -68,9 +69,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public List selectByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options); + QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.DATA); QueryWrapper queryWrapper = new QueryWrapper(query); - resolveQuery(queryContext, queryWrapper); Result result = executeQuery(queryContext, queryWrapper); return (List) result.getRecords(); } @@ -78,19 +78,25 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options); + QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.COUNT_AND_DATA); QueryWrapper queryWrapper = new QueryWrapper(query); - resolveQuery(queryContext, queryWrapper); Result result = executeQuery(queryContext, queryWrapper); return (Page) result.getPage(); } @Override public long selectCountByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options); + QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.COUNT); QueryWrapper queryWrapper = new QueryWrapper(query); + Result result = executeQuery(queryContext, queryWrapper); + return result.getCount(); + } + + @Override + public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { resolveQuery(queryContext, queryWrapper); - return executeCount(queryContext, queryWrapper); + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); + return queryExecutor.executeQuery(queryContext, queryWrapper); } public void resolveQuery(QueryContext queryContext, QueryWrapper queryWrapper) { @@ -101,18 +107,6 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi queryResolver.resolve(queryContext, queryWrapper); } - @Override - public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); - return queryExecutor.executeQuery(queryContext, queryWrapper); - } - - @Override - public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); - return queryExecutor.executeCount(queryContext, queryWrapper); - } - protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { return defaultQueryExecutor; } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index 6bbb36e6..e39cd522 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -20,6 +20,7 @@ package com.gitee.dorive.sql.impl; import com.gitee.dorive.api.entity.element.EntityEle; 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.entity.QueryWrapper; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlRunner; @@ -44,7 +45,7 @@ public class CountQuerier { private SqlRunner sqlRunner; public Map selectCountMap(Context context, CountQuery countQuery) { - QueryContext queryContext = new QueryContext(repository, context); + QueryContext queryContext = new QueryContext(repository, context, ResultType.COUNT); QueryWrapper queryWrapper = new QueryWrapper(countQuery.getQuery()); repository.resolveQuery(queryContext, queryWrapper); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java index 1d88d794..e34673e0 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SegmentBuilder.java @@ -32,7 +32,7 @@ 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.builder.QueryResolver; +import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.sql.entity.*; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index 8a60d8db..d385914c 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -19,29 +19,33 @@ package com.gitee.dorive.sql.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.element.EntityEle; +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.util.ExampleUtils; 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.query.entity.enums.ResultType; import com.gitee.dorive.query.repository.AbstractQueryRepository; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.ArgSegment; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import java.util.ArrayList; import java.util.List; import java.util.Map; -@Data +@Getter +@Setter @AllArgsConstructor public class SqlQueryExecutor implements QueryExecutor { @@ -49,41 +53,33 @@ public class SqlQueryExecutor implements QueryExecutor { private SqlRunner sqlRunner; @Override + @SuppressWarnings("unchecked") public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - return null; - } - - @Override - public long executeCount(QueryContext queryContext, QueryWrapper queryWrapper) { - return 0; - } - - public Result doExecuteQuery(QueryContext queryContext, QueryWrapper queryWrapper) { AbstractQueryRepository repository = queryContext.getRepository(); + Context context = queryContext.getContext(); + ResultType resultType = queryContext.getResultType(); + Example example = queryContext.getExample(); + EntityEle entityEle = repository.getEntityEle(); EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); String idColumn = entityStoreInfo.getIdColumn(); - Example example = queryContext.getExample(); - boolean onlyCount = queryContext.isOnlyCount(); OrderBy orderBy = example.getOrderBy(); - - example = ExampleUtils.clone(example); - queryContext.setExample(example); Page page = example.getPage(); + Result emptyResult = queryContext.newEmptyResult(); + boolean needCount = queryContext.isNeedCount(); + SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); char letter = selectSegment.getLetter(); TableSegment tableSegment = selectSegment.getTableSegment(); List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); - if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return; + return emptyResult; } String tableAlias = tableSegment.getTableAlias(); - selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); selectColumns.add(tableAlias + "." + idColumn); @@ -92,26 +88,17 @@ public class SqlQueryExecutor implements QueryExecutor { String selectSql = selectSegment.selectSql(); String fromWhereSql = selectSegment.fromWhereSql(); - if (onlyCount) { + if (needCount) { String countSql = selectSql + fromWhereSql; long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); - if (page == null) { - page = new Page<>(); - example.setPage(page); + if (count == 0L) { + return emptyResult; } - page.setTotal(count); - queryWrapper.setCountQueried(true); - return; - } + if (resultType == ResultType.COUNT) { + return new Result<>(count); - if (page != null) { - String countSql = selectSql + fromWhereSql; - long count = sqlRunner.selectCount("SELECT COUNT(*) AS total FROM (" + countSql + ") " + letter, args.toArray()); - page.setTotal(count); - queryWrapper.setCountQueried(true); - if (count == 0L) { - queryWrapper.setAbandoned(true); - return; + } else if (page != null) { + page.setTotal(count); } } @@ -128,7 +115,6 @@ public class SqlQueryExecutor implements QueryExecutor { if (rebuildSql) { selectSql = selectSegment.selectSql(); } - if (page != null) { selectSegment.setLimit(page.toString()); } @@ -137,11 +123,16 @@ public class SqlQueryExecutor implements QueryExecutor { List> resultMaps = sqlRunner.selectList(sql, args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get(idColumn), true); if (!primaryKeys.isEmpty()) { - example.in(entityEle.getIdName(), primaryKeys); - queryWrapper.setDataSetQueried(true); - } else { - queryWrapper.setAbandoned(true); + Example newExample = new InnerExample().in(entityEle.getIdName(), primaryKeys); + List entities = (List) repository.selectByExample(context, newExample); + if (page != null) { + page.setRecords(entities); + return new Result<>(page); + } else { + return new Result<>(entities); + } } + return emptyResult; } } -- Gitee From fa70845fc8757157694951d3fda80068abd14ae5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 14:40:46 +0800 Subject: [PATCH 138/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/option/{QueryStrategy.java => QueryMethod.java} | 2 +- .../mybatis/plus/repository/MybatisPlusRepository.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/option/{QueryStrategy.java => QueryMethod.java} (96%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java index aece4c98..3f94c7f9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryStrategy.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.option; -public enum QueryStrategy { +public enum QueryMethod { DEFAULT, SQL } 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 e831281d..c1b2afc9 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 @@ -28,7 +28,7 @@ import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.option.QueryStrategy; +import com.gitee.dorive.core.entity.option.QueryMethod; import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.QueryContext; @@ -128,8 +128,8 @@ public class MybatisPlusRepository extends AbstractRefRepository { @Override protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { Context context = queryContext.getContext(); - QueryStrategy queryStrategy = (QueryStrategy) context.getOption(QueryStrategy.class); - if (queryStrategy == null || queryStrategy == QueryStrategy.SQL) { + QueryMethod queryMethod = (QueryMethod) context.getOption(QueryMethod.class); + if (queryMethod == null || queryMethod == QueryMethod.SQL) { return sqlQueryExecutor; } return super.adaptiveQueryExecutor(queryContext, queryWrapper); -- Gitee From d53fc0e959fd16d6196a4b4d72f7b32946f9fd12 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 14:57:44 +0800 Subject: [PATCH 139/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/plus/repository/MybatisPlusRepository.java | 2 +- .../java/com/gitee/dorive/query/entity/QueryContext.java | 5 +---- .../dorive/query/impl/executor/AbstractQueryExecutor.java | 7 ++++++- .../dorive/query/impl/executor/DefaultQueryExecutor.java | 5 +++++ .../dorive/query/repository/AbstractQueryRepository.java | 8 ++++---- .../main/java/com/gitee/dorive/sql/impl/CountQuerier.java | 2 +- .../java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java | 2 +- 7 files changed, 19 insertions(+), 12 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 c1b2afc9..de7641a7 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 @@ -63,7 +63,7 @@ public class MybatisPlusRepository extends AbstractRefRepository { ImplFactory implFactory = getApplicationContext().getBean(ImplFactory.class); this.sqlRunner = implFactory.getInstance(SqlRunner.class); SegmentBuilder segmentBuilder = new SegmentBuilder(); - this.sqlQueryExecutor = new SqlQueryExecutor(segmentBuilder, this.sqlRunner); + this.sqlQueryExecutor = new SqlQueryExecutor(this, segmentBuilder, this.sqlRunner); this.countQuerier = new CountQuerier(this, segmentBuilder, this.sqlRunner); super.afterPropertiesSet(); } 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 18958b81..93303c56 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 @@ -22,7 +22,6 @@ 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.repository.AbstractQueryRepository; import lombok.Data; import java.util.Collections; @@ -31,15 +30,13 @@ import java.util.Map; @Data public class QueryContext { - private AbstractQueryRepository repository; private Context context; private ResultType resultType; private QueryResolver queryResolver; private Map exampleMap; private Example example; - public QueryContext(AbstractQueryRepository repository, Context context, ResultType resultType) { - this.repository = repository; + public QueryContext(Context context, ResultType resultType) { this.context = context; this.resultType = resultType; } 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 e2ba2fd8..8888dc25 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 @@ -31,9 +31,14 @@ import java.util.List; public abstract class AbstractQueryExecutor implements QueryExecutor { + private final AbstractQueryRepository repository; + + public AbstractQueryExecutor(AbstractQueryRepository repository) { + this.repository = repository; + } + @Override public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - AbstractQueryRepository repository = queryContext.getRepository(); 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/DefaultQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java index 3048d9ab..8355411a 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java @@ -29,6 +29,7 @@ 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; @@ -40,6 +41,10 @@ import java.util.stream.Collectors; public class DefaultQueryExecutor extends AbstractQueryExecutor { + public DefaultQueryExecutor(AbstractQueryRepository repository) { + super(repository); + } + @Override public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { Map exampleWrapperMap = buildExampleWrapperMap(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 943d8a19..b3190234 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 @@ -62,14 +62,14 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } this.mergedRepositoryResolver = new MergedRepositoryResolver(this); this.queryTypeResolver = new QueryTypeResolver(this); - this.defaultQueryExecutor = new DefaultQueryExecutor(); + this.defaultQueryExecutor = new DefaultQueryExecutor(this); } } @Override @SuppressWarnings("unchecked") public List selectByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.DATA); + QueryContext queryContext = new QueryContext((Context) options, ResultType.DATA); QueryWrapper queryWrapper = new QueryWrapper(query); Result result = executeQuery(queryContext, queryWrapper); return (List) result.getRecords(); @@ -78,7 +78,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override @SuppressWarnings("unchecked") public Page selectPageByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.COUNT_AND_DATA); + QueryContext queryContext = new QueryContext((Context) options, ResultType.COUNT_AND_DATA); QueryWrapper queryWrapper = new QueryWrapper(query); Result result = executeQuery(queryContext, queryWrapper); return (Page) result.getPage(); @@ -86,7 +86,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public long selectCountByQuery(Options options, Object query) { - QueryContext queryContext = new QueryContext(this, (Context) options, ResultType.COUNT); + QueryContext queryContext = new QueryContext((Context) options, ResultType.COUNT); QueryWrapper queryWrapper = new QueryWrapper(query); Result result = executeQuery(queryContext, queryWrapper); return result.getCount(); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java index e39cd522..39bbd8f4 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/CountQuerier.java @@ -45,7 +45,7 @@ public class CountQuerier { private SqlRunner sqlRunner; public Map selectCountMap(Context context, CountQuery countQuery) { - QueryContext queryContext = new QueryContext(repository, context, ResultType.COUNT); + QueryContext queryContext = new QueryContext(context, ResultType.COUNT); QueryWrapper queryWrapper = new QueryWrapper(countQuery.getQuery()); repository.resolveQuery(queryContext, queryWrapper); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index d385914c..6e7fb9a7 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -49,13 +49,13 @@ import java.util.Map; @AllArgsConstructor public class SqlQueryExecutor implements QueryExecutor { + private AbstractQueryRepository repository; private SegmentBuilder segmentBuilder; private SqlRunner sqlRunner; @Override @SuppressWarnings("unchecked") public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { - AbstractQueryRepository repository = queryContext.getRepository(); Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); -- Gitee From b3084199bd4d48042fbd46d2bf7480f021615021 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 16:09:00 +0800 Subject: [PATCH 140/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/executor/AbstractQueryExecutor.java | 2 +- .../gitee/dorive/sql/impl/SqlQueryExecutor.java | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 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 8888dc25..1609e9ff 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 @@ -31,7 +31,7 @@ import java.util.List; public abstract class AbstractQueryExecutor implements QueryExecutor { - private final AbstractQueryRepository repository; + protected final AbstractQueryRepository repository; public AbstractQueryExecutor(AbstractQueryRepository repository) { this.repository = repository; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index 6e7fb9a7..01f4eea1 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -27,16 +27,15 @@ 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.query.api.QueryExecutor; 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; import com.gitee.dorive.sql.api.SqlRunner; import com.gitee.dorive.sql.entity.ArgSegment; import com.gitee.dorive.sql.entity.SelectSegment; import com.gitee.dorive.sql.entity.TableSegment; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -46,13 +45,17 @@ import java.util.Map; @Getter @Setter -@AllArgsConstructor -public class SqlQueryExecutor implements QueryExecutor { +public class SqlQueryExecutor extends AbstractQueryExecutor { - private AbstractQueryRepository repository; private SegmentBuilder segmentBuilder; private SqlRunner sqlRunner; + public SqlQueryExecutor(AbstractQueryRepository repository, SegmentBuilder segmentBuilder, SqlRunner sqlRunner) { + super(repository); + this.segmentBuilder = segmentBuilder; + this.sqlRunner = sqlRunner; + } + @Override @SuppressWarnings("unchecked") public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { @@ -76,7 +79,7 @@ public class SqlQueryExecutor implements QueryExecutor { List argSegments = selectSegment.getArgSegments(); List args = selectSegment.getArgs(); if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return emptyResult; + return super.executeQuery(queryContext, queryWrapper); } String tableAlias = tableSegment.getTableAlias(); -- Gitee From d136421cd362d5e0747442c4e00cde580607abb4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 16:26:20 +0800 Subject: [PATCH 141/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/impl/executor/AbstractQueryExecutor.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 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 1609e9ff..13e2e620 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 @@ -38,17 +38,18 @@ public abstract class AbstractQueryExecutor implements QueryExecutor { } @Override + @SuppressWarnings("unchecked") public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { Context context = queryContext.getContext(); ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); if (resultType == ResultType.COUNT_AND_DATA) { - Page page = repository.selectPageByExample(context, example); - return new Result(page); + Page page = (Page) repository.selectPageByExample(context, example); + return new Result<>(page); } else if (resultType == ResultType.DATA) { - List entities = repository.selectByExample(context, example); - return new Result(entities); + List entities = (List) repository.selectByExample(context, example); + return new Result<>(entities); } else if (resultType == ResultType.COUNT) { long count = repository.selectCountByExample(context, example); -- Gitee From 7160dea2e2a045fe7bc7f2a182b662d44a6c7f6f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 16:37:48 +0800 Subject: [PATCH 142/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/query/entity/QueryContext.java | 8 ++++---- .../java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) 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 93303c56..d4e4e97a 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 @@ -41,6 +41,10 @@ public class QueryContext { this.resultType = resultType; } + public boolean isNeedCount() { + return resultType == ResultType.COUNT_AND_DATA || resultType == ResultType.COUNT; + } + public Result newEmptyResult() { if (resultType == ResultType.COUNT_AND_DATA) { return new Result<>(example.getPage()); @@ -54,8 +58,4 @@ public class QueryContext { throw new RuntimeException("Unsupported type!"); } - public boolean isNeedCount() { - return resultType == ResultType.COUNT_AND_DATA || resultType == ResultType.COUNT; - } - } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index 01f4eea1..98271b65 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -70,8 +70,8 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { OrderBy orderBy = example.getOrderBy(); Page page = example.getPage(); - Result emptyResult = queryContext.newEmptyResult(); boolean needCount = queryContext.isNeedCount(); + Result emptyResult = queryContext.newEmptyResult(); SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); char letter = selectSegment.getLetter(); -- Gitee From 97679fa19e2199cee27a28ae91e80b310ae8ef13 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 22 Feb 2024 16:51:29 +0800 Subject: [PATCH 143/146] =?UTF-8?q?=E3=80=90=E9=87=8D=E8=A6=81=E3=80=91?= =?UTF-8?q?=E5=B0=86query=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=B8=8B?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/sql/impl/SqlQueryExecutor.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index 98271b65..ea80249c 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -63,6 +63,15 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); + SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); + char letter = selectSegment.getLetter(); + TableSegment tableSegment = selectSegment.getTableSegment(); + List argSegments = selectSegment.getArgSegments(); + List args = selectSegment.getArgs(); + if (!tableSegment.isJoin() || argSegments.isEmpty()) { + return super.executeQuery(queryContext, queryWrapper); + } + EntityEle entityEle = repository.getEntityEle(); EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); String idColumn = entityStoreInfo.getIdColumn(); @@ -73,15 +82,6 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { boolean needCount = queryContext.isNeedCount(); Result emptyResult = queryContext.newEmptyResult(); - SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); - char letter = selectSegment.getLetter(); - TableSegment tableSegment = selectSegment.getTableSegment(); - List argSegments = selectSegment.getArgSegments(); - List args = selectSegment.getArgs(); - if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return super.executeQuery(queryContext, queryWrapper); - } - String tableAlias = tableSegment.getTableAlias(); selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); -- Gitee From 393d7c0fee0a6855e8e0cd19c1de98ad6060c4d2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 23 Feb 2024 10:54:42 +0800 Subject: [PATCH 144/146] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E7=9A=84=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/query/entity/QueryContext.java | 4 +++ .../impl/executor/SimpleQueryExecutor.java | 28 +++++++++++++++++++ ...ecutor.java => StepwiseQueryExecutor.java} | 4 +-- .../repository/AbstractQueryRepository.java | 23 +++++++++------ .../dorive/sql/impl/SqlQueryExecutor.java | 18 ++++++------ 5 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java rename dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/{DefaultQueryExecutor.java => StepwiseQueryExecutor.java} (98%) 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 d4e4e97a..7d456067 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 @@ -41,6 +41,10 @@ public class QueryContext { this.resultType = resultType; } + public boolean isSimpleQuery() { + return exampleMap.size() == 1 && exampleMap.containsKey("/"); + } + public boolean isNeedCount() { return resultType == ResultType.COUNT_AND_DATA || resultType == ResultType.COUNT; } 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 new file mode 100644 index 00000000..34088a98 --- /dev/null +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/SimpleQueryExecutor.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.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/DefaultQueryExecutor.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java similarity index 98% rename from dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java rename to dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java index 8355411a..7654af28 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/DefaultQueryExecutor.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/executor/StepwiseQueryExecutor.java @@ -39,9 +39,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -public class DefaultQueryExecutor extends AbstractQueryExecutor { +public class StepwiseQueryExecutor extends AbstractQueryExecutor { - public DefaultQueryExecutor(AbstractQueryRepository repository) { + public StepwiseQueryExecutor(AbstractQueryRepository repository) { super(repository); } 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 b3190234..e4bd3e84 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 @@ -27,12 +27,13 @@ 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.enums.ResultType; import com.gitee.dorive.query.entity.QueryWrapper; import com.gitee.dorive.query.entity.def.QueryScanDef; -import com.gitee.dorive.query.impl.executor.DefaultQueryExecutor; -import com.gitee.dorive.query.impl.resolver.QueryResolver; +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 lombok.Data; import lombok.EqualsAndHashCode; @@ -49,7 +50,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private QueryTypeResolver queryTypeResolver; - private QueryExecutor defaultQueryExecutor; + private SimpleQueryExecutor simpleQueryExecutor; + private QueryExecutor stepwiseQueryExecutor; @Override public void afterPropertiesSet() throws Exception { @@ -62,7 +64,8 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } this.mergedRepositoryResolver = new MergedRepositoryResolver(this); this.queryTypeResolver = new QueryTypeResolver(this); - this.defaultQueryExecutor = new DefaultQueryExecutor(this); + this.simpleQueryExecutor = new SimpleQueryExecutor(this); + this.stepwiseQueryExecutor = new StepwiseQueryExecutor(this); } } @@ -95,8 +98,12 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi @Override public Result executeQuery(QueryContext queryContext, QueryWrapper queryWrapper) { resolveQuery(queryContext, queryWrapper); - QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); - return queryExecutor.executeQuery(queryContext, queryWrapper); + if (queryContext.isSimpleQuery()) { + return simpleQueryExecutor.executeQuery(queryContext, queryWrapper); + } else { + QueryExecutor queryExecutor = adaptiveQueryExecutor(queryContext, queryWrapper); + return queryExecutor.executeQuery(queryContext, queryWrapper); + } } public void resolveQuery(QueryContext queryContext, QueryWrapper queryWrapper) { @@ -108,7 +115,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi } protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { - return defaultQueryExecutor; + return stepwiseQueryExecutor; } } diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java index ea80249c..98271b65 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/SqlQueryExecutor.java @@ -63,15 +63,6 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { ResultType resultType = queryContext.getResultType(); Example example = queryContext.getExample(); - SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); - char letter = selectSegment.getLetter(); - TableSegment tableSegment = selectSegment.getTableSegment(); - List argSegments = selectSegment.getArgSegments(); - List args = selectSegment.getArgs(); - if (!tableSegment.isJoin() || argSegments.isEmpty()) { - return super.executeQuery(queryContext, queryWrapper); - } - EntityEle entityEle = repository.getEntityEle(); EntityStoreInfo entityStoreInfo = AbstractContextRepository.getEntityStoreInfo(entityEle); String idColumn = entityStoreInfo.getIdColumn(); @@ -82,6 +73,15 @@ public class SqlQueryExecutor extends AbstractQueryExecutor { boolean needCount = queryContext.isNeedCount(); Result emptyResult = queryContext.newEmptyResult(); + SelectSegment selectSegment = segmentBuilder.buildSegment(queryContext); + char letter = selectSegment.getLetter(); + TableSegment tableSegment = selectSegment.getTableSegment(); + List argSegments = selectSegment.getArgSegments(); + List args = selectSegment.getArgs(); + if (!tableSegment.isJoin() || argSegments.isEmpty()) { + return super.executeQuery(queryContext, queryWrapper); + } + String tableAlias = tableSegment.getTableAlias(); selectSegment.setDistinct(true); List selectColumns = new ArrayList<>(2); -- Gitee From 7ff48cf5fd35d039dfd111386c498f2c8621da12 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 26 Feb 2024 10:20:18 +0800 Subject: [PATCH 145/146] =?UTF-8?q?=E4=BC=98=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/repository/AbstractQueryRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e4bd3e84..ad943bed 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 @@ -50,7 +50,7 @@ public abstract class AbstractQueryRepository extends AbstractEventReposi private QueryScanDef queryScanDef; private MergedRepositoryResolver mergedRepositoryResolver; private QueryTypeResolver queryTypeResolver; - private SimpleQueryExecutor simpleQueryExecutor; + private QueryExecutor simpleQueryExecutor; private QueryExecutor stepwiseQueryExecutor; @Override -- Gitee From 426d34a078e8f7ba3e6f06d90474c05a3342825c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 26 Feb 2024 13:34:52 +0800 Subject: [PATCH 146/146] =?UTF-8?q?=E4=BC=98=E5=8C=96=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/query/entity/enums/ResultType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java index 4dcbb453..0329d0d1 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/enums/ResultType.java @@ -18,7 +18,7 @@ package com.gitee.dorive.query.entity.enums; public enum ResultType { - COUNT, + COUNT_AND_DATA, DATA, - COUNT_AND_DATA + COUNT } -- Gitee