From 9c95eaa5b838f78d152fb8dab280b6611e33df7f Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 19 Apr 2023 19:54:49 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-coating/pom.xml | 2 +- dorive-core/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 +- pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 71548f1a..fd68cb44 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-api diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index 7ca5ef2f..ce9de44a 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-coating diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 354dfcc7..44f3b40a 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-core diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 9c015120..d6cce262 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-event diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index 24f2c76d..968a946b 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-injection diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index ab21722e..51c3dedd 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-proxy diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 6c61fdfd..7d1df7be 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 2ef45530..8737d341 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 dorive-spring-boot-starter diff --git a/pom.xml b/pom.xml index cb448d0a..2f731e93 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.3.3 + 3.3.4 pom -- Gitee From 14243423ec53e69883ed235981c6c10853fa1c46 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 19 Apr 2023 20:55:25 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=8F=90=E4=BE=9BselectCount=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/executor/Executor.java | 2 ++ .../core/api/repository/Repository.java | 9 ++++++ .../dorive/core/entity/executor/Result.java | 12 ++++--- .../core/impl/executor/ChainExecutor.java | 15 ++++++--- .../core/impl/factory/OperationFactory.java | 19 ++++++----- .../core/impl/handler/BatchEntityHandler.java | 6 ++-- .../repository/AbstractGenericRepository.java | 7 ++++ .../core/repository/AbstractRepository.java | 32 +++++++++++++------ .../core/repository/ProxyRepository.java | 5 +++ .../dorive/event/impl/EventExecutor.java | 5 +++ .../starter/impl/executor/AliasExecutor.java | 9 ++++++ .../impl/executor/FactoryExecutor.java | 5 +++ .../executor}/MybatisPlusExecutor.java | 12 ++++++- .../repository/MybatisPlusRepository.java | 1 + 14 files changed, 106 insertions(+), 33 deletions(-) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/{repository => impl/executor}/MybatisPlusExecutor.java (96%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java index caa0be4a..b8c6d66b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/executor/Executor.java @@ -26,6 +26,8 @@ public interface Executor { Result executeQuery(Context context, Query query); + long executeCountQuery(Context context, Query query); + int execute(Context context, Operation operation); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/repository/Repository.java index 422f7062..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 @@ -58,6 +58,15 @@ public interface Repository { */ Page selectPageByExample(Context context, Example example); + /** + * 根据条件,查询计数 + * + * @param context 上下文 + * @param example 条件 + * @return 计数 + */ + long selectCountByExample(Context context, Example example); + /** * 插入一个实体 * 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 361c0e24..62afcb67 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 @@ -30,24 +30,28 @@ public class Result { private Page page; private List records = Collections.emptyList(); private E record; - private int total = 0; + private long count = 0L; public Result(Page page) { this.page = page; this.records = page.getRecords(); this.record = !records.isEmpty() ? records.get(0) : null; - this.total = this.records.size(); + this.count = this.records.size(); } public Result(List records) { this.records = records; this.record = !records.isEmpty() ? records.get(0) : null; - this.total = this.records.size(); + this.count = this.records.size(); } public Result(E record) { this.record = record; - this.total = 1; + this.count = 1L; + } + + public Result(long count) { + this.count = count; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java index 9315f01c..1180df2c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java @@ -65,14 +65,14 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { int totalCount = 0; Result result = rootRepository.executeQuery(context, query); - totalCount += result.getTotal(); + totalCount += result.getCount(); List rootEntities = result.getRecords(); if (!rootEntities.isEmpty()) { totalCount += handle(context, rootEntities); } - result.setTotal(totalCount); + result.setCount(totalCount); return result; } @@ -84,6 +84,11 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { return entityHandler.handle(context, entities); } + @Override + public long executeCountQuery(Context context, Query query) { + throw new RuntimeException("This method does not support!"); + } + @Override public int execute(Context context, Operation operation) { int expectedType = operation.getType(); @@ -170,16 +175,16 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { private Operation newOperation(int realExpectedType, CommonRepository repository, Context context, Object entity) { OperationFactory operationFactory = repository.getOperationFactory(); if (realExpectedType == OperationType.INSERT) { - return operationFactory.buildInsert(context, entity); + return operationFactory.buildInsert(entity); } else if (realExpectedType == OperationType.UPDATE) { - return operationFactory.buildUpdate(context, entity); + return operationFactory.buildUpdate(entity); } else if (realExpectedType == OperationType.INSERT_OR_UPDATE) { return new Operation(OperationType.INSERT_OR_UPDATE, entity); } else if (realExpectedType == OperationType.DELETE) { - return operationFactory.buildDelete(context, entity); + return operationFactory.buildDeleteByEntity(entity); } throw new RuntimeException("Unsupported type!"); } 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 950c2b03..ba242851 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 @@ -18,7 +18,6 @@ package com.gitee.dorive.core.impl.factory; import com.gitee.dorive.api.entity.element.EntityEle; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.*; import lombok.AllArgsConstructor; @@ -30,36 +29,36 @@ public class OperationFactory { private EntityEle entityEle; - public Query buildQueryByPK(Context context, Object primaryKey) { + public Query buildQueryByPK(Object primaryKey) { Query query = new Query(null); query.setPrimaryKey(primaryKey); return query; } - public Query buildQuery(Context context, Example example) { + public Query buildQuery(Example example) { Query query = new Query(null); query.setExample(example); return query; } - public Insert buildInsert(Context context, Object entity) { + public Insert buildInsert(Object entity) { return new Insert(entity); } - public Update buildUpdate(Context context, Object entity) { + public Update buildUpdate(Object entity) { Update update = new Update(entity); Object primaryKey = entityEle.getPkProxy().getValue(entity); update.setPrimaryKey(primaryKey); return update; } - public Update buildUpdate(Context context, Object entity, Example example) { + public Update buildUpdate(Object entity, Example example) { Update update = new Update(entity); update.setExample(example); return update; } - public Operation buildInsertOrUpdate(Context context, Object entity) { + public Operation buildInsertOrUpdate(Object entity) { Object primaryKey = entityEle.getPkProxy().getValue(entity); if (primaryKey == null) { return new Insert(entity); @@ -70,20 +69,20 @@ public class OperationFactory { } } - public Delete buildDelete(Context context, Object entity) { + public Delete buildDeleteByEntity(Object entity) { Delete delete = new Delete(entity); Object primaryKey = entityEle.getPkProxy().getValue(entity); delete.setPrimaryKey(primaryKey); return delete; } - public Delete buildDeleteByPK(Context context, Object primaryKey) { + public Delete buildDeleteByPK(Object primaryKey) { Delete delete = new Delete(null); delete.setPrimaryKey(primaryKey); return delete; } - public Delete buildDelete(Context context, Example example) { + public Delete buildDelete(Example example) { Delete delete = new Delete(null); delete.setExample(example); return delete; 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 1683d157..71b77d73 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 @@ -60,16 +60,16 @@ public class BatchEntityHandler implements EntityHandler { return totalCount; } - private int executeQuery(CommonRepository repository, Context context, List rootEntities) { + private long executeQuery(CommonRepository repository, Context context, List rootEntities) { UnionExample unionExample = newUnionExample(repository, context, rootEntities); if (unionExample.isDirtyQuery()) { - Query query = operationFactory.buildQuery(context, unionExample); + Query query = operationFactory.buildQuery(unionExample); query.setType(query.getType() | OperationType.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); if (result instanceof MultiResult) { setValueForRootEntities(repository, rootEntities, (MultiResult) result); } - return result.getTotal(); + return result.getCount(); } return 0; } 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 ebfec9df..872d5720 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 @@ -36,6 +36,13 @@ import java.util.List; @EqualsAndHashCode(callSuper = false) public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { + @Override + public long selectCountByExample(Context context, Example example) { + Assert.notNull(example, "The example cannot be null!"); + CommonRepository repository = getRootRepository(); + return repository.selectCountByExample(context, example); + } + @Override public int updateByExample(Context context, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); 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 71a3f35f..d8e3976d 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 @@ -54,7 +54,7 @@ public abstract class AbstractRepository implements Repository, Ex @SuppressWarnings("unchecked") public E selectByPrimaryKey(Context context, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); - Query query = operationFactory.buildQueryByPK(context, primaryKey); + Query query = operationFactory.buildQueryByPK(primaryKey); Result result = executeQuery(context, query); return (E) result.getRecord(); } @@ -63,7 +63,7 @@ public abstract class AbstractRepository implements Repository, Ex @SuppressWarnings("unchecked") public List selectByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Query query = operationFactory.buildQuery(context, example); + Query query = operationFactory.buildQuery(example); Result result = executeQuery(context, query); return (List) result.getRecords(); } @@ -73,22 +73,29 @@ public abstract class AbstractRepository implements Repository, Ex public Page selectPageByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); Assert.notNull(example.getPage(), "The page cannot be null!"); - Query query = operationFactory.buildQuery(context, example); + Query query = operationFactory.buildQuery(example); Result result = executeQuery(context, query); return (Page) result.getPage(); } + @Override + public long selectCountByExample(Context context, Example example) { + Assert.notNull(example, "The example cannot be null!"); + Query query = operationFactory.buildQuery(example); + return executeCountQuery(context, query); + } + @Override public int insert(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Insert insert = operationFactory.buildInsert(context, entity); + Insert insert = operationFactory.buildInsert(entity); return execute(context, insert); } @Override public int update(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Update update = operationFactory.buildUpdate(context, entity); + Update update = operationFactory.buildUpdate(entity); return execute(context, update); } @@ -96,35 +103,35 @@ public abstract class AbstractRepository implements Repository, Ex public int updateByExample(Context context, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); - Update update = operationFactory.buildUpdate(context, entity, example); + Update update = operationFactory.buildUpdate(entity, example); return execute(context, update); } @Override public int insertOrUpdate(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = operationFactory.buildInsertOrUpdate(context, entity); + Operation operation = operationFactory.buildInsertOrUpdate(entity); return execute(context, operation); } @Override public int delete(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Delete delete = operationFactory.buildDelete(context, entity); + Delete delete = operationFactory.buildDeleteByEntity(entity); return execute(context, delete); } @Override public int deleteByPrimaryKey(Context context, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); - Delete delete = operationFactory.buildDeleteByPK(context, primaryKey); + Delete delete = operationFactory.buildDeleteByPK(primaryKey); return execute(context, delete); } @Override public int deleteByExample(Context context, Example example) { Assert.notNull(example, "The example cannot be null!"); - Delete delete = operationFactory.buildDelete(context, example); + Delete delete = operationFactory.buildDelete(example); return execute(context, delete); } @@ -133,6 +140,11 @@ public abstract class AbstractRepository implements Repository, Ex return executor.executeQuery(context, query); } + @Override + public long executeCountQuery(Context context, Query query) { + return executor.executeCountQuery(context, query); + } + @Override public int execute(Context context, Operation operation) { return executor.execute(context, operation); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java index 667a2e20..45e2e0bd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/ProxyRepository.java @@ -67,6 +67,11 @@ public class ProxyRepository extends AbstractRepository { return proxyRepository.selectPageByExample(context, example); } + @Override + public long selectCountByExample(Context context, Example example) { + return proxyRepository.selectCountByExample(context, example); + } + @Override public int insert(Context context, Object entity) { return proxyRepository.insert(context, entity); diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java index 02d932ac..ecacfd2f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java @@ -44,6 +44,11 @@ public class EventExecutor extends AbstractExecutor { return executor.executeQuery(context, query); } + @Override + public long executeCountQuery(Context context, Query query) { + return executor.executeCountQuery(context, query); + } + @Override public int execute(Context context, Operation operation) { int count = executor.execute(context, operation); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java index 364669f6..16aa4802 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/AliasExecutor.java @@ -56,6 +56,15 @@ public class AliasExecutor extends AbstractExecutor { return executor.executeQuery(context, query); } + @Override + public long executeCountQuery(Context context, Query query) { + Example example = query.getExample(); + if (example != null) { + convert(example); + } + return executor.executeCountQuery(context, query); + } + @Override public int execute(Context context, Operation operation) { if (operation instanceof Condition) { diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java index bd74d86d..59d56ff9 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java @@ -89,6 +89,11 @@ public class FactoryExecutor extends AbstractExecutor { return entities; } + @Override + public long executeCountQuery(Context context, Query query) { + return executor.executeCountQuery(context, query); + } + @Override public int execute(Context context, Operation operation) { Object entity = operation.getEntity(); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java similarity index 96% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java index 822a7bbe..7293b734 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/MybatisPlusExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.spring.boot.starter.repository; +package com.gitee.dorive.spring.boot.starter.impl.executor; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; @@ -102,6 +102,16 @@ public class MybatisPlusExecutor extends AbstractExecutor { return new Result<>(new QueryResult(Collections.emptyList())); } + @Override + public long executeCountQuery(Context context, Query query) { + Example example = query.getExample(); + if (example != null) { + QueryWrapper queryWrapper = buildQueryWrapper(example); + return baseMapper.selectCount(queryWrapper); + } + return 0L; + } + private QueryWrapper buildQueryWrapper(Example example) { QueryWrapper queryWrapper = new QueryWrapper<>(); 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 f7e16cfe..1d08d536 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,6 +32,7 @@ import com.gitee.dorive.spring.boot.starter.api.Keys; import com.gitee.dorive.spring.boot.starter.impl.SQLExampleBuilder; import com.gitee.dorive.spring.boot.starter.impl.executor.AliasExecutor; import com.gitee.dorive.spring.boot.starter.impl.executor.FactoryExecutor; +import com.gitee.dorive.spring.boot.starter.impl.executor.MybatisPlusExecutor; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.ParameterizedType; -- Gitee From d1ba979562e6390afff4eb056310d2cfa6e1f355 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 19 Apr 2023 21:16:35 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=B0=86=E8=BD=AC=E6=8D=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=B8=8B=E7=A7=BB=E5=88=B0ref=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AbstractCoatingRepository.java | 10 +- .../repository/AbstractGenericRepository.java | 21 +-- .../gitee/dorive/simple/impl/RefObjImpl.java | 6 + .../repository/AbstractRefRepository.java | 142 ++++++++++++++++++ 4 files changed, 150 insertions(+), 29 deletions(-) diff --git a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java b/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java index afc4e9d9..e4bd0688 100644 --- a/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java +++ b/dorive-coating/src/main/java/com/gitee/dorive/coating/repository/AbstractCoatingRepository.java @@ -17,16 +17,14 @@ package com.gitee.dorive.coating.repository; +import com.gitee.dorive.api.annotation.Repository; import com.gitee.dorive.coating.annotation.CoatingScan; import com.gitee.dorive.coating.api.CoatingRepository; import com.gitee.dorive.coating.api.ExampleBuilder; import com.gitee.dorive.coating.impl.DefaultExampleBuilder; import com.gitee.dorive.coating.impl.resolver.CoatingRepositoriesResolver; import com.gitee.dorive.coating.impl.resolver.MergedRepositoryResolver; -import com.gitee.dorive.api.annotation.Repository; import com.gitee.dorive.core.api.context.Context; -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 com.gitee.dorive.event.repository.AbstractEventRepository; @@ -73,9 +71,6 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo @Override public List selectByCoating(Context context, Object coating) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } Example example = buildExample(context, coating); if (example.isCountQueried()) { example.setPage(null); @@ -86,9 +81,6 @@ public abstract class AbstractCoatingRepository extends AbstractEventRepo @Override @SuppressWarnings("unchecked") public Page selectPageByCoating(Context context, Object coating) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } Example example = buildExample(context, coating); if (example.isCountQueried()) { Page page = example.getPage(); 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 872d5720..6607a0f2 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 @@ -21,12 +21,9 @@ 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.entity.context.InnerContext; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.api.repository.ListableRepository; -import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; import lombok.Data; import lombok.EqualsAndHashCode; @@ -104,20 +101,4 @@ public abstract class AbstractGenericRepository extends AbstractContextRe return entities.stream().mapToInt(entity -> delete(context, entity)).sum(); } - @Override - public Result executeQuery(Context context, Query query) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.executeQuery(context, query); - } - - @Override - public int execute(Context context, Operation operation) { - if (context instanceof Selector) { - context = new InnerContext((Selector) context); - } - return super.execute(context, operation); - } - } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/simple/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/simple/impl/RefObjImpl.java index ad3fcdad..c99d9244 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/simple/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/simple/impl/RefObjImpl.java @@ -46,12 +46,18 @@ public class RefObjImpl implements RefObj { @Override public int insertOrUpdate(Context context) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } AbstractRepository repository = ref.getProxyRepository(); return repository.insertOrUpdate(context, object); } @Override public int delete(Context context) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } AbstractRepository repository = ref.getProxyRepository(); return repository.delete(context, object); } diff --git a/dorive-ref/src/main/java/com/gitee/dorive/simple/repository/AbstractRefRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/simple/repository/AbstractRefRepository.java index aa49a053..a3896ac9 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/simple/repository/AbstractRefRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/simple/repository/AbstractRefRepository.java @@ -18,10 +18,16 @@ package com.gitee.dorive.simple.repository; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.api.executor.EntityHandler; +import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.simple.impl.RefInjector; import java.lang.reflect.Field; +import java.util.List; public abstract class AbstractRefRepository extends AbstractCoatingRepository { @@ -34,4 +40,140 @@ public abstract class AbstractRefRepository extends AbstractCoatingReposi } } + @Override + public E selectByPrimaryKey(Context context, PK primaryKey) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectByPrimaryKey(context, primaryKey); + } + + @Override + public List selectByExample(Context context, Example example) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectByExample(context, example); + } + + @Override + public Page selectPageByExample(Context context, Example example) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectPageByExample(context, example); + } + + @Override + public long selectCountByExample(Context context, Example example) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectCountByExample(context, example); + } + + @Override + public int insert(Context context, E entity) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.insert(context, entity); + } + + @Override + public int update(Context context, E entity) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.update(context, entity); + } + + @Override + public int updateByExample(Context context, Object entity, Example example) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.updateByExample(context, entity, example); + } + + @Override + public int insertOrUpdate(Context context, E entity) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.insertOrUpdate(context, entity); + } + + @Override + public int delete(Context context, E entity) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.delete(context, entity); + } + + @Override + public int deleteByPrimaryKey(Context context, PK primaryKey) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.deleteByPrimaryKey(context, primaryKey); + } + + @Override + public int deleteByExample(Context context, Example example) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.deleteByExample(context, example); + } + + @Override + public int insertList(Context context, List entities) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.insertList(context, entities); + } + + @Override + public int updateList(Context context, List entities) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.updateList(context, entities); + } + + @Override + public int insertOrUpdateList(Context context, List entities) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.insertOrUpdateList(context, entities); + } + + @Override + public int deleteList(Context context, List entities) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.deleteList(context, entities); + } + + @Override + public List selectByCoating(Context context, Object coating) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectByCoating(context, coating); + } + + @Override + public Page selectPageByCoating(Context context, Object coating) { + if (context instanceof Selector) { + context = new InnerContext((Selector) context); + } + return super.selectPageByCoating(context, coating); + } + } -- Gitee From 42ff2c96881f2ae72a212a28207c2907618ebe53 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 19 Apr 2023 22:55:05 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/spring/boot/starter/entity/SqlSegment.java | 2 +- .../spring/boot/starter/impl/SQLExampleBuilder.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java index a6384a93..2dbd9aac 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java @@ -35,7 +35,7 @@ public class SqlSegment { private Example example; private boolean rootReachable; private boolean dirtyQuery; - private Set targetAccessPaths; + private Set joinAccessPaths; @Override public String toString() { 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 85814683..a8f09ca9 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 @@ -171,8 +171,8 @@ public class SQLExampleBuilder implements ExampleBuilder { SqlSegment sqlSegment = sqlSegmentMap.get(targetAccessPath); if (sqlSegment != null) { - Set targetAccessPaths = sqlSegment.getTargetAccessPaths(); - targetAccessPaths.add(relativeAccessPath); + Set joinAccessPaths = sqlSegment.getJoinAccessPaths(); + joinAccessPaths.add(relativeAccessPath); String joinTableName = sqlSegment.getTableName(); String joinTableAlias = sqlSegment.getTableAlias(); @@ -189,9 +189,9 @@ public class SQLExampleBuilder implements ExampleBuilder { } private void markReachableAndDirty(Map sqlSegmentMap, SqlSegment lastSqlSegment) { - Set targetAccessPaths = lastSqlSegment.getTargetAccessPaths(); - for (String targetAccessPath : targetAccessPaths) { - SqlSegment joinSqlSegment = sqlSegmentMap.get(targetAccessPath); + Set joinAccessPaths = lastSqlSegment.getJoinAccessPaths(); + for (String joinAccessPath : joinAccessPaths) { + SqlSegment joinSqlSegment = sqlSegmentMap.get(joinAccessPath); if (joinSqlSegment != null) { joinSqlSegment.setRootReachable(true); markReachableAndDirty(sqlSegmentMap, joinSqlSegment); -- Gitee From 3d318ae3563e1c1bd37bdd7d6bcb774115c1c9a9 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 20 Apr 2023 00:24:14 +0800 Subject: [PATCH 5/8] =?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 --- .../entity/{ArgSegment.java => Argument.java} | 2 +- .../boot/starter/entity/JoinSegment.java | 22 ++- .../spring/boot/starter/entity/OnSegment.java | 30 ++++ .../spring/boot/starter/entity/Segment.java | 22 +++ .../{SqlSegment.java => SelectSegment.java} | 25 ++-- .../boot/starter/impl/SQLExampleBuilder.java | 129 +++++++++++------- 6 files changed, 152 insertions(+), 78 deletions(-) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{ArgSegment.java => Argument.java} (98%) create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/OnSegment.java create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Segment.java rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{SqlSegment.java => SelectSegment.java} (66%) 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/Argument.java similarity index 98% 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/Argument.java index 56251a67..a5164c82 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/Argument.java @@ -24,7 +24,7 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class ArgSegment { +public class Argument { private String property; private String operator; 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/JoinSegment.java index 37f1df16..3f2cf810 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/JoinSegment.java @@ -17,21 +17,15 @@ package com.gitee.dorive.spring.boot.starter.entity; -import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; -@Data -@AllArgsConstructor -public class JoinSegment { - - private String targetAccessPath; - private String joinTableName; - private String joinTableAlias; - private String sql; - - @Override - public String toString() { - return sql; - } +import java.util.List; +@Data +@EqualsAndHashCode(callSuper = true) +public class JoinSegment extends Segment { + private String tableName; + private String tableAlias; + private List onSegments; } 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/OnSegment.java new file mode 100644 index 00000000..b6893b03 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/OnSegment.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.spring.boot.starter.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class OnSegment extends Segment { + private String tableAlias; + private String column; + private String joinTableAlias; + private String joinColumn; +} 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.java new file mode 100644 index 00000000..7be906a2 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Segment.java @@ -0,0 +1,22 @@ +package com.gitee.dorive.spring.boot.starter.entity; + +import lombok.Data; + +import java.util.Set; + +@Data +public class Segment { + + private boolean reachable; + private boolean dirtyQuery; + private Set directJoinPaths; + + public String getTableName() { + return null; + } + + public String getTableAlias() { + return null; + } + +} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java similarity index 66% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java index 2dbd9aac..44736990 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SqlSegment.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SelectSegment.java @@ -17,29 +17,32 @@ package com.gitee.dorive.spring.boot.starter.entity; -import com.gitee.dorive.core.entity.executor.Example; -import lombok.AllArgsConstructor; +import cn.hutool.db.sql.SqlBuilder; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; -import java.util.Set; @Data -@AllArgsConstructor -public class SqlSegment { +@EqualsAndHashCode(callSuper = true) +public class SelectSegment extends Segment { + private boolean distinct; + private List columns; private String tableName; private String tableAlias; - private String sql; private List joinSegments; - private Example example; - private boolean rootReachable; - private boolean dirtyQuery; - private Set joinAccessPaths; + private List arguments; + private String groupBy; + private String orderBy; + private String limit; @Override public String toString() { - return sql; + SqlBuilder sqlBuilder = SqlBuilder.create(); + sqlBuilder.select(distinct, columns); + sqlBuilder.from(tableName + " " + tableAlias); + return sqlBuilder.toString(); } } 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 a8f09ca9..3d45f032 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 @@ -17,6 +17,10 @@ package com.gitee.dorive.spring.boot.starter.impl; +import java.util.HashSet; + +import com.gitee.dorive.spring.boot.starter.entity.OnSegment; + import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; @@ -41,18 +45,13 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CriterionUtils; import com.gitee.dorive.core.util.SqlUtils; import com.gitee.dorive.spring.boot.starter.api.Keys; -import com.gitee.dorive.spring.boot.starter.entity.ArgSegment; +import com.gitee.dorive.spring.boot.starter.entity.Argument; import com.gitee.dorive.spring.boot.starter.entity.JoinSegment; -import com.gitee.dorive.spring.boot.starter.entity.SqlSegment; +import com.gitee.dorive.spring.boot.starter.entity.Segment; +import com.gitee.dorive.spring.boot.starter.entity.SelectSegment; import com.gitee.dorive.spring.boot.starter.impl.executor.AliasExecutor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class SQLExampleBuilder implements ExampleBuilder { @@ -72,8 +71,8 @@ public class SQLExampleBuilder implements ExampleBuilder { Assert.notNull(coatingRepositories, "No coating definition found!"); List propertyRepositories = coatingRepositories.getPropertyRepositories(); - Map sqlSegmentMap = new LinkedHashMap<>(propertyRepositories.size() * 4 / 3 + 1); - SqlSegment rootSqlSegment = null; + Map segmentMap = new LinkedHashMap<>(propertyRepositories.size() * 4 / 3 + 1); + SelectSegment selectSegment = null; char letter = 'a'; boolean anyDirtyQuery = false; @@ -101,18 +100,39 @@ public class SQLExampleBuilder implements ExampleBuilder { boolean dirtyQuery = example.isDirtyQuery(); anyDirtyQuery = anyDirtyQuery || dirtyQuery; - Set joinTableNames = new HashSet<>(8); if ("/".equals(relativeAccessPath)) { - String sql = String.format("SELECT DISTINCT %s.id FROM %s %s ", tableAlias, tableName, tableAlias); - rootSqlSegment = new SqlSegment(tableName, tableAlias, sql, Collections.emptyList(), example, true, dirtyQuery, joinTableNames); - sqlSegmentMap.put(relativeAccessPath, rootSqlSegment); + selectSegment = new SelectSegment(); + selectSegment.setReachable(true); + selectSegment.setDirtyQuery(false); + selectSegment.setDirectJoinPaths(new LinkedHashSet<>(8)); + selectSegment.setDistinct(true); + selectSegment.setColumns(Collections.singletonList(tableAlias + ".id")); + selectSegment.setTableName(tableName); + selectSegment.setTableAlias(tableAlias); + segmentMap.put(relativeAccessPath, selectSegment); } else { - String sql = String.format("LEFT JOIN %s %s ON ", tableName, tableAlias); - List joinSegments = newJoinSegments(sqlSegmentMap, lastAccessPath, relativeAccessPath, binderResolver, tableAlias); - SqlSegment sqlSegment = new SqlSegment(tableName, tableAlias, sql, joinSegments, example, false, dirtyQuery, joinTableNames); - sqlSegmentMap.put(relativeAccessPath, sqlSegment); + JoinSegment joinSegment = new JoinSegment(); + joinSegment.setReachable(false); + joinSegment.setDirtyQuery(false); + joinSegment.setDirectJoinPaths(new LinkedHashSet<>(8)); + joinSegment.setTableName(tableName); + joinSegment.setTableAlias(tableAlias); + + List onSegments = newOnSegments(segmentMap, lastAccessPath, relativeAccessPath, binderResolver, tableAlias); + joinSegment.setOnSegments(onSegments); + + if (selectSegment != null) { + List joinSegments = selectSegment.getJoinSegments(); + if (joinSegments == null) { + joinSegments = new ArrayList<>(); + selectSegment.setJoinSegments(joinSegments); + } + joinSegments.add(joinSegment); + } + + segmentMap.put(relativeAccessPath, joinSegment); } } @@ -130,7 +150,7 @@ public class SQLExampleBuilder implements ExampleBuilder { if (!anyDirtyQuery) { return example; } - markReachableAndDirty(sqlSegmentMap, rootSqlSegment); + markReachableAndDirty(segmentMap, rootSqlSegment); if (!rootSqlSegment.isDirtyQuery()) { return example; } @@ -138,7 +158,7 @@ public class SQLExampleBuilder implements ExampleBuilder { StringBuilder sqlBuilder = new StringBuilder(); List args = new ArrayList<>(); - buildSQL(sqlBuilder, args, sqlSegmentMap); + buildSQL(sqlBuilder, args, segmentMap); if (page != null) { long count = SqlRunner.db().selectCount("SELECT COUNT(1) FROM (" + sqlBuilder + ") " + letter, args.toArray()); page.setTotal(count); @@ -161,57 +181,62 @@ public class SQLExampleBuilder implements ExampleBuilder { return example; } - private List newJoinSegments(Map sqlSegmentMap, String lastAccessPath, String relativeAccessPath, BinderResolver binderResolver, String tableAlias) { + private List newOnSegments(Map segmentMap, + String lastAccessPath, + String relativeAccessPath, + BinderResolver binderResolver, + String tableAlias) { List propertyBinders = binderResolver.getPropertyBinders(); - List joinSegments = new ArrayList<>(propertyBinders.size()); + List onSegments = new ArrayList<>(propertyBinders.size()); for (PropertyBinder propertyBinder : propertyBinders) { String belongAccessPath = propertyBinder.getBelongAccessPath(); String targetAccessPath = lastAccessPath + belongAccessPath; - SqlSegment sqlSegment = sqlSegmentMap.get(targetAccessPath); - if (sqlSegment != null) { - Set joinAccessPaths = sqlSegment.getJoinAccessPaths(); - joinAccessPaths.add(relativeAccessPath); - - String joinTableName = sqlSegment.getTableName(); - String joinTableAlias = sqlSegment.getTableAlias(); + Segment segment = segmentMap.get(targetAccessPath); + if (segment != null) { + Set directJoinPaths = segment.getDirectJoinPaths(); + directJoinPaths.add(relativeAccessPath); String alias = propertyBinder.getAlias(); + String joinTableAlias = segment.getTableAlias(); String bindAlias = propertyBinder.getBindAlias(); - String sqlCriteria = tableAlias + "." + alias + " = " + joinTableAlias + "." + bindAlias; - JoinSegment joinSegment = new JoinSegment(targetAccessPath, joinTableName, joinTableAlias, sqlCriteria); - joinSegments.add(joinSegment); + OnSegment onSegment = new OnSegment(); + onSegment.setTableAlias(tableAlias); + onSegment.setColumn(alias); + onSegment.setJoinTableAlias(joinTableAlias); + onSegment.setJoinColumn(bindAlias); + onSegments.add(onSegment); } } - return joinSegments; + return onSegments; } - private void markReachableAndDirty(Map sqlSegmentMap, SqlSegment lastSqlSegment) { - Set joinAccessPaths = lastSqlSegment.getJoinAccessPaths(); - for (String joinAccessPath : joinAccessPaths) { - SqlSegment joinSqlSegment = sqlSegmentMap.get(joinAccessPath); - if (joinSqlSegment != null) { - joinSqlSegment.setRootReachable(true); - markReachableAndDirty(sqlSegmentMap, joinSqlSegment); - if (joinSqlSegment.isDirtyQuery()) { - lastSqlSegment.setDirtyQuery(true); + private void markReachableAndDirty(Map segmentMap, Segment lastSegment) { + Set directJoinPaths = lastSegment.getDirectJoinPaths(); + for (String directJoinPath : directJoinPaths) { + Segment joinSegment = segmentMap.get(directJoinPath); + if (joinSegment != null) { + joinSegment.setReachable(true); + markReachableAndDirty(segmentMap, joinSegment); + if (joinSegment.isDirtyQuery()) { + lastSegment.setDirtyQuery(true); } } } } - private void buildSQL(StringBuilder sqlBuilder, List args, Map sqlSegmentMap) { + private void buildSQL(StringBuilder sqlBuilder, List args, Map sqlSegmentMap) { List sqlCriteria = new ArrayList<>(sqlSegmentMap.size()); - for (SqlSegment sqlSegment : sqlSegmentMap.values()) { + for (SelectSegment sqlSegment : sqlSegmentMap.values()) { if (sqlSegment.isRootReachable() && sqlSegment.isDirtyQuery()) { sqlBuilder.append(sqlSegment); List joinSegments = sqlSegment.getJoinSegments(); joinSegments = joinSegments.stream().filter(joinSegment -> { - SqlSegment joinSqlSegment = sqlSegmentMap.get(joinSegment.getTargetAccessPath()); + SelectSegment joinSqlSegment = sqlSegmentMap.get(joinSegment.getTargetAccessPath()); return joinSqlSegment.isRootReachable() && joinSqlSegment.isDirtyQuery(); }).collect(Collectors.toList()); @@ -223,7 +248,7 @@ public class SQLExampleBuilder implements ExampleBuilder { Example sqlExample = sqlSegment.getExample(); if (sqlExample != null && sqlExample.isDirtyQuery()) { List criteria = sqlExample.getCriteria(); - List argSegments = new ArrayList<>(criteria.size()); + List arguments = new ArrayList<>(criteria.size()); for (Criterion criterion : criteria) { String property = criterion.getProperty(); String operator = CriterionUtils.getOperator(criterion); @@ -234,14 +259,14 @@ public class SQLExampleBuilder implements ExampleBuilder { if (!operator.startsWith("IS")) { args.add(value); int index = args.size() - 1; - ArgSegment argSegment = new ArgSegment(property, operator, index); - argSegments.add(argSegment); + Argument argument = new Argument(property, operator, index); + arguments.add(argument); } else { - ArgSegment argSegment = new ArgSegment(property, operator, null); - argSegments.add(argSegment); + Argument argument = new Argument(property, operator, null); + arguments.add(argument); } } - String sqlCriterion = CollUtil.join(argSegments, " AND ", tableAlias + ".", null); + String sqlCriterion = CollUtil.join(arguments, " AND ", tableAlias + ".", null); sqlCriteria.add(sqlCriterion); } } -- Gitee From a9ae9665c58b0e1a943aee066e048f69ed3d210d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 20 Apr 2023 12:34:45 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=A2=9E=E5=BC=BAsql=E6=8B=BC=E6=8E=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/{Argument.java => ArgSegment.java} | 8 +- .../spring/boot/starter/entity/OnSegment.java | 7 + .../spring/boot/starter/entity/Segment.java | 25 ++- .../boot/starter/entity/SelectSegment.java | 34 +++- .../boot/starter/impl/SQLExampleBuilder.java | 166 +++++++----------- 5 files changed, 132 insertions(+), 108 deletions(-) rename dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/{Argument.java => ArgSegment.java} (88%) diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Argument.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java similarity index 88% rename from dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Argument.java rename to dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java index a5164c82..a40aaf5f 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/Argument.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/ArgSegment.java @@ -24,16 +24,16 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class Argument { +public class ArgSegment { private String property; private String operator; - private Integer index; + private String expr; @Override public String toString() { - if (index != null) { - return property + " " + operator + " {" + index + "}"; + if (expr != null) { + return property + " " + operator + " " + expr; } else { return property + " " + operator; } 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/OnSegment.java index b6893b03..0f2996bb 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/OnSegment.java @@ -23,8 +23,15 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) public class OnSegment extends Segment { + private String tableAlias; private String column; private String joinTableAlias; private String joinColumn; + + @Override + public String toString() { + return tableAlias + "." + column + " = " + joinTableAlias + "." + joinColumn; + } + } 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.java index 7be906a2..db497c4c 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.java @@ -1,15 +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.entity; import lombok.Data; -import java.util.Set; +import java.util.List; @Data public class Segment { private boolean reachable; private boolean dirtyQuery; - private Set directJoinPaths; + private List directedSegments; + + public boolean isAvailable() { + return reachable && dirtyQuery; + } public String getTableName() { return null; 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/SelectSegment.java index 44736990..70206e23 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/SelectSegment.java @@ -17,11 +17,13 @@ package com.gitee.dorive.spring.boot.starter.entity; +import cn.hutool.core.util.StrUtil; import cn.hutool.db.sql.SqlBuilder; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; +import java.util.stream.Collectors; @Data @EqualsAndHashCode(callSuper = true) @@ -32,17 +34,41 @@ public class SelectSegment extends Segment { private String tableName; private String tableAlias; private List joinSegments; - private List arguments; + private List argSegments; private String groupBy; private String orderBy; private String limit; - @Override - public String toString() { + public SqlBuilder createBuilder() { SqlBuilder sqlBuilder = SqlBuilder.create(); sqlBuilder.select(distinct, columns); sqlBuilder.from(tableName + " " + tableAlias); - return sqlBuilder.toString(); + 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.where(StrUtil.join(" AND ", argSegments)); + if (groupBy != null) { + sqlBuilder.append(" ").append(groupBy); + } + if (orderBy != null) { + sqlBuilder.append(" ").append(orderBy); + } + if (limit != null) { + sqlBuilder.append(" ").append(limit); + } + return sqlBuilder; + } + + @Override + public String toString() { + return createBuilder().toString(); } } 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 3d45f032..728e6476 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 @@ -17,13 +17,9 @@ package com.gitee.dorive.spring.boot.starter.impl; -import java.util.HashSet; - -import com.gitee.dorive.spring.boot.starter.entity.OnSegment; - import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; +import cn.hutool.db.sql.SqlBuilder; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; import com.gitee.dorive.api.constant.Operator; @@ -45,14 +41,18 @@ import com.gitee.dorive.core.repository.CommonRepository; import com.gitee.dorive.core.util.CriterionUtils; import com.gitee.dorive.core.util.SqlUtils; import com.gitee.dorive.spring.boot.starter.api.Keys; -import com.gitee.dorive.spring.boot.starter.entity.Argument; +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.SelectSegment; import com.gitee.dorive.spring.boot.starter.impl.executor.AliasExecutor; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; public class SQLExampleBuilder implements ExampleBuilder { @@ -75,6 +75,8 @@ public class SQLExampleBuilder implements ExampleBuilder { SelectSegment selectSegment = null; char letter = 'a'; boolean anyDirtyQuery = false; + List argSegments = new ArrayList<>(); + List args = new ArrayList<>(); for (PropertyRepository propertyRepository : propertyRepositories) { MergedRepository mergedRepository = propertyRepository.getMergedRepository(); @@ -100,35 +102,34 @@ public class SQLExampleBuilder implements ExampleBuilder { boolean dirtyQuery = example.isDirtyQuery(); anyDirtyQuery = anyDirtyQuery || dirtyQuery; + appendArguments(argSegments, args, tableAlias, example); if ("/".equals(relativeAccessPath)) { selectSegment = new SelectSegment(); selectSegment.setReachable(true); - selectSegment.setDirtyQuery(false); - selectSegment.setDirectJoinPaths(new LinkedHashSet<>(8)); + selectSegment.setDirtyQuery(dirtyQuery); + selectSegment.setDirectedSegments(new ArrayList<>(8)); selectSegment.setDistinct(true); selectSegment.setColumns(Collections.singletonList(tableAlias + ".id")); selectSegment.setTableName(tableName); selectSegment.setTableAlias(tableAlias); + selectSegment.setJoinSegments(new ArrayList<>()); + selectSegment.setArgSegments(argSegments); segmentMap.put(relativeAccessPath, selectSegment); } else { JoinSegment joinSegment = new JoinSegment(); joinSegment.setReachable(false); - joinSegment.setDirtyQuery(false); - joinSegment.setDirectJoinPaths(new LinkedHashSet<>(8)); + joinSegment.setDirtyQuery(dirtyQuery); + joinSegment.setDirectedSegments(new ArrayList<>(4)); joinSegment.setTableName(tableName); joinSegment.setTableAlias(tableAlias); - List onSegments = newOnSegments(segmentMap, lastAccessPath, relativeAccessPath, binderResolver, tableAlias); + List onSegments = newOnSegments(segmentMap, lastAccessPath, binderResolver, tableAlias, joinSegment); joinSegment.setOnSegments(onSegments); if (selectSegment != null) { List joinSegments = selectSegment.getJoinSegments(); - if (joinSegments == null) { - joinSegments = new ArrayList<>(); - selectSegment.setJoinSegments(joinSegments); - } joinSegments.add(joinSegment); } @@ -144,23 +145,24 @@ public class SQLExampleBuilder implements ExampleBuilder { example.setOrderBy(orderBy); example.setPage(page); - if (rootSqlSegment == null) { + if (selectSegment == null) { throw new RuntimeException("Unable to build SQL statement!"); } + if (!anyDirtyQuery) { return example; } - markReachableAndDirty(segmentMap, rootSqlSegment); - if (!rootSqlSegment.isDirtyQuery()) { + + markReachableAndDirty(selectSegment); + + if (!selectSegment.isDirtyQuery()) { return example; } - StringBuilder sqlBuilder = new StringBuilder(); - List args = new ArrayList<>(); + SqlBuilder builder = selectSegment.createBuilder(); - buildSQL(sqlBuilder, args, segmentMap); if (page != null) { - long count = SqlRunner.db().selectCount("SELECT COUNT(1) FROM (" + sqlBuilder + ") " + letter, args.toArray()); + long count = SqlRunner.db().selectCount("SELECT COUNT(1) FROM (" + builder + ") " + letter, args.toArray()); page.setTotal(count); example.setCountQueried(true); if (count == 0) { @@ -169,8 +171,14 @@ public class SQLExampleBuilder implements ExampleBuilder { } } - buildSQL(sqlBuilder, orderBy, page); - List> resultMaps = SqlRunner.db().selectList(sqlBuilder.toString(), args.toArray()); + if (orderBy != null) { + builder.append(" ").append(orderBy.toString()); + } + if (page != null) { + builder.append(" ").append(page.toString()); + } + + List> resultMaps = SqlRunner.db().selectList(builder.toString(), args.toArray()); List primaryKeys = CollUtil.map(resultMaps, map -> map.get("id"), true); if (!primaryKeys.isEmpty()) { example.eq("id", primaryKeys); @@ -181,11 +189,32 @@ public class SQLExampleBuilder implements ExampleBuilder { return example; } + private void appendArguments(List argSegments, List args, String tableAlias, Example example) { + List criteria = example.getCriteria(); + for (Criterion criterion : criteria) { + String property = criterion.getProperty(); + String operator = CriterionUtils.getOperator(criterion); + Object value = criterion.getValue(); + if (operator.endsWith(Operator.LIKE)) { + value = SqlUtils.toLike(value); + } + if (!operator.startsWith("IS")) { + args.add(value); + int index = args.size() - 1; + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, "{" + index + "}"); + argSegments.add(argSegment); + } else { + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, null); + argSegments.add(argSegment); + } + } + } + private List newOnSegments(Map segmentMap, String lastAccessPath, - String relativeAccessPath, BinderResolver binderResolver, - String tableAlias) { + String tableAlias, + JoinSegment joinSegment) { List propertyBinders = binderResolver.getPropertyBinders(); List onSegments = new ArrayList<>(propertyBinders.size()); @@ -195,93 +224,34 @@ public class SQLExampleBuilder implements ExampleBuilder { Segment segment = segmentMap.get(targetAccessPath); if (segment != null) { - Set directJoinPaths = segment.getDirectJoinPaths(); - directJoinPaths.add(relativeAccessPath); - 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); - } - } - return onSegments; - } - private void markReachableAndDirty(Map segmentMap, Segment lastSegment) { - Set directJoinPaths = lastSegment.getDirectJoinPaths(); - for (String directJoinPath : directJoinPaths) { - Segment joinSegment = segmentMap.get(directJoinPath); - if (joinSegment != null) { - joinSegment.setReachable(true); - markReachableAndDirty(segmentMap, joinSegment); - if (joinSegment.isDirtyQuery()) { - lastSegment.setDirtyQuery(true); - } + List directedSegments = segment.getDirectedSegments(); + directedSegments.add(joinSegment); } } + return onSegments; } - private void buildSQL(StringBuilder sqlBuilder, List args, Map sqlSegmentMap) { - List sqlCriteria = new ArrayList<>(sqlSegmentMap.size()); - - for (SelectSegment sqlSegment : sqlSegmentMap.values()) { - if (sqlSegment.isRootReachable() && sqlSegment.isDirtyQuery()) { - sqlBuilder.append(sqlSegment); - - List joinSegments = sqlSegment.getJoinSegments(); - joinSegments = joinSegments.stream().filter(joinSegment -> { - SelectSegment joinSqlSegment = sqlSegmentMap.get(joinSegment.getTargetAccessPath()); - return joinSqlSegment.isRootReachable() && joinSqlSegment.isDirtyQuery(); - }).collect(Collectors.toList()); - - if (!joinSegments.isEmpty()) { - sqlBuilder.append(StrUtil.join(" AND ", joinSegments)).append(" "); - } - - String tableAlias = sqlSegment.getTableAlias(); - Example sqlExample = sqlSegment.getExample(); - if (sqlExample != null && sqlExample.isDirtyQuery()) { - List criteria = sqlExample.getCriteria(); - List arguments = new ArrayList<>(criteria.size()); - for (Criterion criterion : criteria) { - String property = criterion.getProperty(); - String operator = CriterionUtils.getOperator(criterion); - Object value = criterion.getValue(); - if (operator.endsWith(Operator.LIKE)) { - value = SqlUtils.toLike(value); - } - if (!operator.startsWith("IS")) { - args.add(value); - int index = args.size() - 1; - Argument argument = new Argument(property, operator, index); - arguments.add(argument); - } else { - Argument argument = new Argument(property, operator, null); - arguments.add(argument); - } - } - String sqlCriterion = CollUtil.join(arguments, " AND ", tableAlias + ".", null); - sqlCriteria.add(sqlCriterion); - } + private void markReachableAndDirty(Segment lastSegment) { + List directedSegments = lastSegment.getDirectedSegments(); + for (Segment directedSegment : directedSegments) { + directedSegment.setReachable(true); + markReachableAndDirty(directedSegment); + if (directedSegment.isDirtyQuery()) { + lastSegment.setDirtyQuery(true); } } - - sqlBuilder.append("WHERE ").append(StrUtil.join(" AND ", sqlCriteria)); - } - - private void buildSQL(StringBuilder sqlBuilder, OrderBy orderBy, Page page) { - if (orderBy != null) { - sqlBuilder.append(" ").append(orderBy); - } - if (page != null) { - sqlBuilder.append(" ").append(page); - } } } -- Gitee From 0f89007fc4fe8a985a1e519d47132255c8ff2cbe Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 20 Apr 2023 13:49:57 +0800 Subject: [PATCH 7/8] =?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/SQLExampleBuilder.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) 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 728e6476..fa98f3e6 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 @@ -72,9 +72,8 @@ public class SQLExampleBuilder implements ExampleBuilder { List propertyRepositories = coatingRepositories.getPropertyRepositories(); Map segmentMap = new LinkedHashMap<>(propertyRepositories.size() * 4 / 3 + 1); - SelectSegment selectSegment = null; char letter = 'a'; - boolean anyDirtyQuery = false; + SelectSegment selectSegment = null; List argSegments = new ArrayList<>(); List args = new ArrayList<>(); @@ -99,15 +98,12 @@ public class SQLExampleBuilder implements ExampleBuilder { Example example = propertyRepository.newExampleByCoating(coating); aliasExecutor.convert(example); - boolean dirtyQuery = example.isDirtyQuery(); - anyDirtyQuery = anyDirtyQuery || dirtyQuery; - appendArguments(argSegments, args, tableAlias, example); if ("/".equals(relativeAccessPath)) { selectSegment = new SelectSegment(); selectSegment.setReachable(true); - selectSegment.setDirtyQuery(dirtyQuery); + selectSegment.setDirtyQuery(example.isDirtyQuery()); selectSegment.setDirectedSegments(new ArrayList<>(8)); selectSegment.setDistinct(true); selectSegment.setColumns(Collections.singletonList(tableAlias + ".id")); @@ -120,7 +116,7 @@ public class SQLExampleBuilder implements ExampleBuilder { } else { JoinSegment joinSegment = new JoinSegment(); joinSegment.setReachable(false); - joinSegment.setDirtyQuery(dirtyQuery); + joinSegment.setDirtyQuery(example.isDirtyQuery()); joinSegment.setDirectedSegments(new ArrayList<>(4)); joinSegment.setTableName(tableName); joinSegment.setTableAlias(tableAlias); @@ -149,7 +145,7 @@ public class SQLExampleBuilder implements ExampleBuilder { throw new RuntimeException("Unable to build SQL statement!"); } - if (!anyDirtyQuery) { + if (argSegments.isEmpty()) { return example; } @@ -235,9 +231,11 @@ public class SQLExampleBuilder implements ExampleBuilder { onSegment.setJoinTableAlias(joinTableAlias); onSegment.setJoinColumn(bindAlias); onSegments.add(onSegment); - + List directedSegments = segment.getDirectedSegments(); - directedSegments.add(joinSegment); + if (!directedSegments.contains(joinSegment)) { + directedSegments.add(joinSegment); + } } } return onSegments; -- Gitee From dd51f49a0af4483d775d8ea2768071034bc5dc63 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 20 Apr 2023 14:31:23 +0800 Subject: [PATCH 8/8] =?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/entity/SegmentResult.java | 35 ++++ .../boot/starter/impl/SQLExampleBuilder.java | 170 ++------------- .../boot/starter/impl/SegmentBuilder.java | 196 ++++++++++++++++++ 3 files changed, 243 insertions(+), 158 deletions(-) create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SegmentResult.java create mode 100644 dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java 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/SegmentResult.java new file mode 100644 index 00000000..231e3da7 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/entity/SegmentResult.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.entity; + +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.List; + +@Data +@AllArgsConstructor +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/SQLExampleBuilder.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java index fa98f3e6..26279003 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SQLExampleBuilder.java @@ -20,46 +20,31 @@ package com.gitee.dorive.spring.boot.starter.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.db.sql.SqlBuilder; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.toolkit.SqlRunner; -import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.coating.api.ExampleBuilder; import com.gitee.dorive.coating.entity.CoatingRepositories; -import com.gitee.dorive.coating.entity.MergedRepository; -import com.gitee.dorive.coating.entity.PropertyRepository; -import com.gitee.dorive.coating.entity.SpecificProperties; import com.gitee.dorive.coating.impl.resolver.CoatingRepositoriesResolver; import com.gitee.dorive.coating.repository.AbstractCoatingRepository; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.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.core.util.CriterionUtils; -import com.gitee.dorive.core.util.SqlUtils; -import com.gitee.dorive.spring.boot.starter.api.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.impl.executor.AliasExecutor; +import lombok.Data; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +@Data public class SQLExampleBuilder implements ExampleBuilder { private final AbstractCoatingRepository repository; + private final SegmentBuilder segmentBuilder; public SQLExampleBuilder(AbstractCoatingRepository repository) { this.repository = repository; + this.segmentBuilder = new SegmentBuilder(); } @Override @@ -69,73 +54,13 @@ public class SQLExampleBuilder implements ExampleBuilder { CoatingRepositories coatingRepositories = nameCoatingRepositoriesMap.get(coating.getClass().getName()); Assert.notNull(coatingRepositories, "No coating definition found!"); - List propertyRepositories = coatingRepositories.getPropertyRepositories(); - - Map segmentMap = new LinkedHashMap<>(propertyRepositories.size() * 4 / 3 + 1); - char letter = 'a'; - SelectSegment selectSegment = null; - List argSegments = new ArrayList<>(); - List args = new ArrayList<>(); - - for (PropertyRepository propertyRepository : propertyRepositories) { - MergedRepository mergedRepository = propertyRepository.getMergedRepository(); - String lastAccessPath = mergedRepository.getLastAccessPath(); - String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - - String relativeAccessPath = mergedRepository.isMerged() ? absoluteAccessPath + "/" : absoluteAccessPath; - BinderResolver binderResolver = definedRepository.getBinderResolver(); - - Map attachments = executedRepository.getAttachments(); - TableInfo tableInfo = (TableInfo) attachments.get(Keys.TABLE_INFO); - AliasExecutor aliasExecutor = (AliasExecutor) attachments.get(Keys.ALIAS_EXECUTOR); - - String tableName = tableInfo.getTableName(); - String tableAlias = String.valueOf(letter); - letter = (char) (letter + 1); - - Example example = propertyRepository.newExampleByCoating(coating); - aliasExecutor.convert(example); - - appendArguments(argSegments, args, tableAlias, example); - - if ("/".equals(relativeAccessPath)) { - selectSegment = new SelectSegment(); - selectSegment.setReachable(true); - selectSegment.setDirtyQuery(example.isDirtyQuery()); - selectSegment.setDirectedSegments(new ArrayList<>(8)); - selectSegment.setDistinct(true); - selectSegment.setColumns(Collections.singletonList(tableAlias + ".id")); - selectSegment.setTableName(tableName); - selectSegment.setTableAlias(tableAlias); - selectSegment.setJoinSegments(new ArrayList<>()); - selectSegment.setArgSegments(argSegments); - segmentMap.put(relativeAccessPath, selectSegment); - - } else { - JoinSegment joinSegment = new JoinSegment(); - joinSegment.setReachable(false); - joinSegment.setDirtyQuery(example.isDirtyQuery()); - 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); - } - - segmentMap.put(relativeAccessPath, joinSegment); - } - } - SpecificProperties properties = coatingRepositories.getSpecificProperties(); - OrderBy orderBy = properties.newOrderBy(coating); - Page page = properties.newPage(coating); + SegmentResult segmentResult = segmentBuilder.buildSegment(coatingRepositories, coating); + char letter = segmentResult.getLetter(); + SelectSegment selectSegment = segmentResult.getSelectSegment(); + List args = segmentResult.getArgs(); + OrderBy orderBy = segmentResult.getOrderBy(); + Page page = segmentResult.getPage(); Example example = new Example(); example.setOrderBy(orderBy); @@ -144,13 +69,9 @@ public class SQLExampleBuilder implements ExampleBuilder { if (selectSegment == null) { throw new RuntimeException("Unable to build SQL statement!"); } - - if (argSegments.isEmpty()) { + if (selectSegment.getArgSegments().isEmpty()) { return example; } - - markReachableAndDirty(selectSegment); - if (!selectSegment.isDirtyQuery()) { return example; } @@ -185,71 +106,4 @@ public class SQLExampleBuilder implements ExampleBuilder { return example; } - private void appendArguments(List argSegments, List args, String tableAlias, Example example) { - List criteria = example.getCriteria(); - for (Criterion criterion : criteria) { - String property = criterion.getProperty(); - String operator = CriterionUtils.getOperator(criterion); - Object value = criterion.getValue(); - if (operator.endsWith(Operator.LIKE)) { - value = SqlUtils.toLike(value); - } - if (!operator.startsWith("IS")) { - args.add(value); - int index = args.size() - 1; - ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, "{" + index + "}"); - argSegments.add(argSegment); - } else { - ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, null); - argSegments.add(argSegment); - } - } - } - - 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 belongAccessPath = propertyBinder.getBelongAccessPath(); - String targetAccessPath = lastAccessPath + belongAccessPath; - - Segment segment = segmentMap.get(targetAccessPath); - 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); - } - } - } - 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); - } - } - } - } 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 new file mode 100644 index 00000000..5e685af0 --- /dev/null +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/SegmentBuilder.java @@ -0,0 +1,196 @@ +/* + * 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.metadata.TableInfo; +import com.gitee.dorive.api.constant.Operator; +import com.gitee.dorive.coating.entity.CoatingRepositories; +import com.gitee.dorive.coating.entity.MergedRepository; +import com.gitee.dorive.coating.entity.PropertyRepository; +import com.gitee.dorive.coating.entity.SpecificProperties; +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.impl.binder.PropertyBinder; +import com.gitee.dorive.core.impl.resolver.BinderResolver; +import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.util.CriterionUtils; +import com.gitee.dorive.core.util.SqlUtils; +import com.gitee.dorive.spring.boot.starter.api.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.impl.executor.AliasExecutor; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Data +public class SegmentBuilder { + + public SegmentResult buildSegment(CoatingRepositories coatingRepositories, Object coating) { + List propertyRepositories = coatingRepositories.getPropertyRepositories(); + Map segmentMap = new LinkedHashMap<>(propertyRepositories.size() * 4 / 3 + 1); + char letter = 'a'; + SelectSegment selectSegment = null; + List argSegments = new ArrayList<>(); + List args = new ArrayList<>(); + + for (PropertyRepository propertyRepository : propertyRepositories) { + MergedRepository mergedRepository = propertyRepository.getMergedRepository(); + String lastAccessPath = mergedRepository.getLastAccessPath(); + String absoluteAccessPath = mergedRepository.getAbsoluteAccessPath(); + CommonRepository definedRepository = mergedRepository.getDefinedRepository(); + CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + + String relativeAccessPath = mergedRepository.isMerged() ? absoluteAccessPath + "/" : absoluteAccessPath; + BinderResolver binderResolver = definedRepository.getBinderResolver(); + + Map attachments = executedRepository.getAttachments(); + TableInfo tableInfo = (TableInfo) attachments.get(Keys.TABLE_INFO); + AliasExecutor aliasExecutor = (AliasExecutor) attachments.get(Keys.ALIAS_EXECUTOR); + + String tableName = tableInfo.getTableName(); + String tableAlias = String.valueOf(letter); + letter = (char) (letter + 1); + + Example example = propertyRepository.newExampleByCoating(coating); + aliasExecutor.convert(example); + + appendArguments(argSegments, args, tableAlias, example); + + if ("/".equals(relativeAccessPath)) { + selectSegment = new SelectSegment(); + selectSegment.setReachable(true); + selectSegment.setDirtyQuery(example.isDirtyQuery()); + selectSegment.setDirectedSegments(new ArrayList<>(8)); + selectSegment.setDistinct(true); + selectSegment.setColumns(Collections.singletonList(tableAlias + ".id")); + selectSegment.setTableName(tableName); + selectSegment.setTableAlias(tableAlias); + selectSegment.setJoinSegments(new ArrayList<>()); + selectSegment.setArgSegments(argSegments); + segmentMap.put(relativeAccessPath, selectSegment); + + } else { + JoinSegment joinSegment = new JoinSegment(); + joinSegment.setReachable(false); + joinSegment.setDirtyQuery(example.isDirtyQuery()); + 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); + } + + segmentMap.put(relativeAccessPath, joinSegment); + } + } + + if (selectSegment != null) { + markReachableAndDirty(selectSegment); + } + + SpecificProperties properties = coatingRepositories.getSpecificProperties(); + OrderBy orderBy = properties.newOrderBy(coating); + Page page = properties.newPage(coating); + + return new SegmentResult(letter, selectSegment, args, orderBy, page); + } + + private void appendArguments(List argSegments, List args, String tableAlias, Example example) { + List criteria = example.getCriteria(); + for (Criterion criterion : criteria) { + String property = criterion.getProperty(); + String operator = CriterionUtils.getOperator(criterion); + Object value = criterion.getValue(); + if (operator.endsWith(Operator.LIKE)) { + value = SqlUtils.toLike(value); + } + if (!operator.startsWith("IS")) { + args.add(value); + int index = args.size() - 1; + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, "{" + index + "}"); + argSegments.add(argSegment); + } else { + ArgSegment argSegment = new ArgSegment(tableAlias + "." + property, operator, null); + argSegments.add(argSegment); + } + } + } + + 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 belongAccessPath = propertyBinder.getBelongAccessPath(); + String targetAccessPath = lastAccessPath + belongAccessPath; + + Segment segment = segmentMap.get(targetAccessPath); + 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); + } + } + } + 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); + } + } + } + +} -- Gitee