From 58f10be6b4a245e1263de6f87b3322bee9a8c3e5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 10 Apr 2024 18:25:50 +0800 Subject: [PATCH 01/49] =?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 --- .../core/entity/operation/Condition.java | 12 +- .../core/entity/operation/ConditionOp.java | 39 +++ .../core/entity/operation/EntityOp.java | 35 +++ .../core/entity/operation/Operation.java | 11 +- .../dorive/core/entity/operation/Query.java | 9 +- .../entity/operation/ext/ConditionDelete.java | 33 +++ .../entity/operation/ext/ConditionUpdate.java | 33 +++ .../entity/operation/{ => ext}/Delete.java | 11 +- .../entity/operation/{ => ext}/Insert.java | 11 +- .../operation/{ => ext}/InsertOrUpdate.java | 11 +- .../entity/operation/{ => ext}/Update.java | 10 +- .../core/entity/option/RootControl.java | 24 ++ .../core/impl/executor/ContextExecutor.java | 222 +++++++----------- .../core/impl/executor/ExampleExecutor.java | 2 +- .../core/impl/executor/FactoryExecutor.java | 2 +- .../core/impl/factory/OperationFactory.java | 61 ++--- .../core/impl/resolver/DerivedResolver.java | 24 +- .../repository/AbstractGenericRepository.java | 5 +- .../core/repository/AbstractRepository.java | 27 +-- .../core/repository/CommonRepository.java | 29 +++ .../dorive/core/util/CollectionUtils.java | 16 +- .../dorive/event/entity/OperationType.java | 1 + .../event/impl/ExecutorEventListener.java | 6 +- .../plus/impl/MybatisPlusExecutor.java | 6 +- 24 files changed, 398 insertions(+), 242 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ => ext}/Delete.java (78%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ => ext}/Insert.java (78%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ => ext}/InsertOrUpdate.java (77%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ => ext}/Update.java (80%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java index d16fd4b4..9574fffe 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Condition.java @@ -28,8 +28,16 @@ public class Condition extends Operation { private Object primaryKey; private Example example; - public Condition(Object entity) { - super(entity); + public Condition(Object primaryKey) { + this.primaryKey = primaryKey; + } + + public Condition(Example example) { + this.example = example; + } + + public boolean isEmpty() { + return primaryKey == null && example == null; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java new file mode 100644 index 00000000..85453957 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConditionOp extends Operation { + + private Object entity; + private Condition condition; + + public ConditionOp(Condition condition) { + this.condition = condition; + } + + public ConditionOp(Object entity, Condition condition) { + this.entity = entity; + this.condition = condition; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java new file mode 100644 index 00000000..9c399677 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/EntityOp.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class EntityOp extends Operation { + + private List entities; + + public EntityOp(List entities) { + this.entities = entities; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index f7bb315f..c1cd4338 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -17,19 +17,16 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.core.entity.option.RootControl; import lombok.Data; +/** + * 操作 = 操作类型 + (实体 || 实体 + 主键 || 实体 + 条件 || 主键 || 条件) + */ @Data public class Operation { - public enum RootControl {NONE, INCLUDE_ROOT, IGNORE_ROOT} - private RootControl rootControl = RootControl.NONE; - private Object entity; - - public Operation(Object entity) { - this.entity = entity; - } public void includeRoot() { rootControl = RootControl.INCLUDE_ROOT; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java index c679a77d..58e9c876 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.core.entity.executor.Example; import lombok.Getter; import lombok.Setter; @@ -24,12 +25,12 @@ import lombok.Setter; @Setter public class Query extends Condition { - public Query(Object entity) { - super(entity); + public Query(Object primaryKey) { + super(primaryKey); } - public boolean isEmpty() { - return getPrimaryKey() == null && getExample() == null; + public Query(Example example) { + super(example); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java new file mode 100644 index 00000000..a43542f5 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation.ext; + +import com.gitee.dorive.core.entity.operation.Condition; +import com.gitee.dorive.core.entity.operation.ConditionOp; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConditionDelete extends ConditionOp { + + public ConditionDelete(Condition condition) { + super(condition); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java new file mode 100644 index 00000000..57c2ec19 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.operation.ext; + +import com.gitee.dorive.core.entity.operation.Condition; +import com.gitee.dorive.core.entity.operation.ConditionOp; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ConditionUpdate extends ConditionOp { + + public ConditionUpdate(Object entity, Condition condition) { + super(entity, condition); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java similarity index 78% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java index 5731ab56..6f120be4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java @@ -15,17 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.ext; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class Delete extends Condition { +public class Delete extends EntityOp { - public Delete(Object entity) { - super(entity); + public Delete(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java similarity index 78% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java index 60a5e0c1..54b37447 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java @@ -15,17 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.ext; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class Insert extends Operation { +public class Insert extends EntityOp { - public Insert(Object entity) { - super(entity); + public Insert(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java similarity index 77% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java index 70d02527..442bca9e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/InsertOrUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java @@ -15,17 +15,20 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.ext; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter -public class InsertOrUpdate extends Operation { +public class InsertOrUpdate extends EntityOp { - public InsertOrUpdate(Object entity) { - super(entity); + public InsertOrUpdate(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java similarity index 80% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java index bd514cd6..25008b4b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java @@ -15,22 +15,24 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.ext; +import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; import lombok.Setter; import java.util.Collections; +import java.util.List; import java.util.Set; @Getter @Setter -public class Update extends Condition { +public class Update extends EntityOp { private Set nullableProps = Collections.emptySet(); - public Update(Object entity) { - super(entity); + public Update(List entities) { + super(entities); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java new file mode 100644 index 00000000..27f8351a --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.option; + +public enum RootControl { + NONE, + INCLUDE_ROOT, + IGNORE_ROOT +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 40af2f63..20203fc5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -18,19 +18,19 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Pair; import com.gitee.dorive.api.entity.PropChain; -import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; -import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.entity.operation.ext.Delete; +import com.gitee.dorive.core.entity.operation.ext.Insert; +import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.ext.Update; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -38,9 +38,7 @@ import com.gitee.dorive.core.util.CollectionUtils; import lombok.Getter; import lombok.Setter; -import java.util.Collection; import java.util.List; -import java.util.Map; @Getter @Setter @@ -74,18 +72,17 @@ public class ContextExecutor extends AbstractExecutor { if (!derivedResolver.hasDerived()) { entityHandler.handle(context, entities); } else { - Map, List> repositoryEntitiesMap = derivedResolver.distribute(entities); - repositoryEntitiesMap.forEach((repository, partEntities) -> { - if (repository == this.repository) { // 避免自循环 - entityHandler.handle(context, partEntities); + for (Pair, List> pair : repository.getDerivedResolver().distribute(entities)) { + if (pair.getKey() == this.repository) { // 避免自循环 + entityHandler.handle(context, pair.getValue()); } else { Executor executor = repository.getExecutor(); if (executor instanceof ContextExecutor) { ContextExecutor contextExecutor = (ContextExecutor) executor; - contextExecutor.populate(context, partEntities); + contextExecutor.populate(context, pair.getValue()); } } - }); + } } } @@ -96,38 +93,40 @@ public class ContextExecutor extends AbstractExecutor { @Override public int execute(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); - Assert.notNull(rootEntity, "The root entity cannot be null!"); - - DerivedResolver derivedResolver = repository.getDerivedResolver(); - AbstractContextRepository repository = derivedResolver.distribute(rootEntity); + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + Assert.notEmpty(entities, "The entities cannot be empty!"); - Executor executor = repository.getExecutor(); - if (executor instanceof ContextExecutor) { - ContextExecutor contextExecutor = (ContextExecutor) executor; + int totalCount = 0; + for (Pair, List> pair : repository.getDerivedResolver().distribute(entities)) { + ContextExecutor contextExecutor = (ContextExecutor) pair.getKey().getExecutor(); if (operation instanceof Insert) { - return contextExecutor.executeInsert(context, operation); + Insert insert = new Insert(pair.getValue()); + totalCount += contextExecutor.executeInsert(context, insert); + + } else if (operation instanceof Update) { + Update update = new Update(pair.getValue()); + totalCount += contextExecutor.executeUpdateOrDelete(context, update); - } else if (operation instanceof Update || operation instanceof Delete) { - return contextExecutor.executeUpdateOrDelete(context, operation); + } else if (operation instanceof Delete) { + Delete delete = new Delete(pair.getValue()); + totalCount += contextExecutor.executeUpdateOrDelete(context, delete); } else if (operation instanceof InsertOrUpdate) { - return contextExecutor.executeInsertOrUpdate(context, operation); + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(pair.getValue()); + totalCount += contextExecutor.executeInsertOrUpdate(context, insertOrUpdate); } } - return 0; + return totalCount; } - public int executeInsert(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeInsert(Context context, Insert insert) { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { - if (!operation.isIgnoreRoot()) { - if (repository.matches(context) || operation.isIncludeRoot()) { - getBoundValue(context, rootEntity, repository, rootEntity); - totalCount += repository.execute(context, operation); - setBoundId(context, rootEntity, repository, rootEntity); + if (!insert.isIgnoreRoot()) { + if (repository.matches(context) || insert.isIncludeRoot()) { + totalCount += repository.execute(context, insert); } } } else { @@ -136,85 +135,66 @@ public class ContextExecutor extends AbstractExecutor { if (!isMatch && !isAggregated) { continue; } - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - OperationFactory operationFactory = repository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { + List rootEntities = insert.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + List entities = CollectionUtils.toList(targetEntity); if (isMatch) { - getBoundValue(context, rootEntity, repository, entity); + repository.getBoundValue(context, rootEntity, entities); + } + Operation operation = new Insert(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); + if (entities.size() == 1) { + repository.setBoundId(context, rootEntity, entities.iterator().next()); } - Operation newOperation = operationFactory.buildInsert(entity); - newOperation.switchRoot(isMatch); - totalCount += repository.execute(context, newOperation); - } - if (collection.size() == 1) { - setBoundId(context, rootEntity, repository, collection.iterator().next()); } } } return totalCount; } - public int executeUpdateOrDelete(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeUpdateOrDelete(Context context, EntityOp entityOp) { int totalCount = 0; - if (!operation.isIgnoreRoot()) { - CommonRepository rootRepository = this.repository.getRootRepository(); - if (rootRepository.matches(context) || operation.isIncludeRoot()) { - Object primaryKey = rootRepository.getPrimaryKey(rootEntity); - if (primaryKey != null) { - totalCount += rootRepository.execute(context, operation); - } + if (!entityOp.isIgnoreRoot()) { + CommonRepository repository = this.repository.getRootRepository(); + if (repository.matches(context) || entityOp.isIncludeRoot()) { + totalCount += repository.execute(context, entityOp); } } - for (CommonRepository subRepository : this.repository.getSubRepositories()) { - boolean isMatch = subRepository.matches(context); - boolean isAggregated = subRepository.isAggregated(); + for (CommonRepository repository : this.repository.getSubRepositories()) { + boolean isMatch = repository.matches(context); + boolean isAggregated = repository.isAggregated(); if (!isMatch && !isAggregated) { continue; } - PropChain anchorPoint = subRepository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - OperationFactory operationFactory = subRepository.getOperationFactory(); - Collection collection = CollectionUtils.toCollection(targetEntity); - for (Object entity : collection) { - Object primaryKey = subRepository.getPrimaryKey(entity); - Operation newOperation = null; - if ((isMatch && primaryKey != null) || isAggregated) { - newOperation = operation instanceof Update ? operationFactory.buildUpdate(entity) : operationFactory.buildDelete(entity); - } - if (newOperation != null) { - newOperation.switchRoot(isMatch); - totalCount += subRepository.execute(context, newOperation); + List rootEntities = entityOp.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; } + List entities = CollectionUtils.toList(targetEntity); + Operation operation = entityOp instanceof Update ? new Update(entities) : new Delete(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); } } return totalCount; } - public int executeInsertOrUpdate(Context context, Operation operation) { - Object rootEntity = operation.getEntity(); + public int executeInsertOrUpdate(Context context, InsertOrUpdate insertOrUpdate) { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { - OperationFactory operationFactory = repository.getOperationFactory(); if (repository.isRoot()) { - if (!operation.isIgnoreRoot()) { - if (repository.matches(context) || operation.isIncludeRoot()) { - Operation newOperation = operationFactory.buildInsertOrUpdate(rootEntity); - if (newOperation instanceof Insert) { - getBoundValue(context, rootEntity, repository, rootEntity); - totalCount += repository.execute(context, newOperation); - setBoundId(context, rootEntity, repository, rootEntity); - } else { - totalCount += repository.execute(context, newOperation); - } + if (!insertOrUpdate.isIgnoreRoot()) { + if (repository.matches(context) || insertOrUpdate.isIncludeRoot()) { + totalCount += repository.execute(context, insertOrUpdate); } } } else { @@ -223,59 +203,27 @@ public class ContextExecutor extends AbstractExecutor { if (!isMatch && !isAggregated) { continue; } - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { - continue; - } - Collection collection = CollectionUtils.toCollection(targetEntity); - Object onlyOne = collection.size() == 1 ? collection.iterator().next() : null; - boolean isOnlyOneInsert = onlyOne != null && repository.getPrimaryKey(onlyOne) == null; - for (Object entity : collection) { - Object primaryKey = repository.getPrimaryKey(entity); - if (isMatch && primaryKey == null) { - getBoundValue(context, rootEntity, repository, entity); + List rootEntities = insertOrUpdate.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; } - Operation newOperation; - if (isAggregated) { - newOperation = new InsertOrUpdate(entity); - } else { - newOperation = primaryKey == null ? operationFactory.buildInsert(entity) : operationFactory.buildUpdate(entity); + List entities = CollectionUtils.toList(targetEntity); + if (isMatch) { + repository.getBoundValue(context, rootEntity, entities); + } + Operation operation = new InsertOrUpdate(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); + if (entities.size() == 1) { + repository.setBoundId(context, rootEntity, entities.iterator().next()); } - newOperation.switchRoot(isMatch); - totalCount += repository.execute(context, newOperation); - } - if (isOnlyOneInsert) { - setBoundId(context, rootEntity, repository, onlyOne); } } } return totalCount; } - private void getBoundValue(Context context, Object rootEntity, CommonRepository repository, Object entity) { - for (Binder binder : repository.getBinderResolver().getStrongBinders()) { - Object fieldValue = binder.getFieldValue(context, entity); - if (fieldValue == null) { - Object boundValue = binder.getBoundValue(context, rootEntity); - if (boundValue != null) { - binder.setFieldValue(context, entity, boundValue); - } - } - } - } - - private void setBoundId(Context context, Object rootEntity, CommonRepository repository, Object entity) { - Binder binder = repository.getBinderResolver().getBoundIdBinder(); - if (binder != null) { - Object boundValue = binder.getBoundValue(context, rootEntity); - if (boundValue == null) { - Object primaryKey = binder.getFieldValue(context, entity); - if (primaryKey != null) { - binder.setBoundValue(context, rootEntity, primaryKey); - } - } - } - } - } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 3e06d377..03e75f6d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -30,7 +30,7 @@ import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.ext.Update; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 33d14a0d..cc2b8b21 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -27,7 +27,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.ext.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import lombok.Getter; 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 53915888..21bb550c 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 @@ -19,10 +19,19 @@ package com.gitee.dorive.core.impl.factory; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.*; +import com.gitee.dorive.core.entity.operation.Condition; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.ext.ConditionDelete; +import com.gitee.dorive.core.entity.operation.ext.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.ext.Delete; +import com.gitee.dorive.core.entity.operation.ext.Insert; +import com.gitee.dorive.core.entity.operation.ext.Update; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.Collections; + @Data @AllArgsConstructor public class OperationFactory { @@ -30,62 +39,44 @@ public class OperationFactory { private EntityEle entityEle; public Query buildQueryByPK(Object primaryKey) { - Query query = new Query(null); - query.setPrimaryKey(primaryKey); - return query; + return new Query(primaryKey); } public Query buildQueryByExample(Example example) { - Query query = new Query(null); - query.setExample(example); - return query; + return new Query(example); } - public Insert buildInsert(Object entity) { - return new Insert(entity); + public Operation buildInsert(Object entity) { + return new Insert(Collections.singletonList(entity)); } - public Update buildUpdate(Object entity) { - Update update = new Update(entity); - Object primaryKey = entityEle.getIdProxy().getValue(entity); - update.setPrimaryKey(primaryKey); - return update; + public Operation buildUpdate(Object entity) { + return new Update(Collections.singletonList(entity)); } - public Update buildUpdateByExample(Object entity, Example example) { - Update update = new Update(entity); - update.setExample(example); - return update; + public Operation buildUpdateByExample(Object entity, Example example) { + return new ConditionUpdate(entity, new Condition(example)); } public Operation buildInsertOrUpdate(Object entity) { Object primaryKey = entityEle.getIdProxy().getValue(entity); if (primaryKey == null) { - return new Insert(entity); + return buildInsert(entity); } else { - Update update = new Update(entity); - update.setPrimaryKey(primaryKey); - return update; + return buildUpdate(entity); } } - public Delete buildDelete(Object entity) { - Delete delete = new Delete(entity); - Object primaryKey = entityEle.getIdProxy().getValue(entity); - delete.setPrimaryKey(primaryKey); - return delete; + public Operation buildDelete(Object entity) { + return new Delete(Collections.singletonList(entity)); } - public Delete buildDeleteByPK(Object primaryKey) { - Delete delete = new Delete(null); - delete.setPrimaryKey(primaryKey); - return delete; + public Operation buildDeleteByPK(Object primaryKey) { + return new ConditionDelete(new Condition(primaryKey)); } - public Delete buildDeleteByExample(Example example) { - Delete delete = new Delete(null); - delete.setExample(example); - return delete; + public Operation buildDeleteByExample(Example example) { + return new ConditionDelete(new Condition(example)); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java index 4a788e29..76432c75 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/DerivedResolver.java @@ -17,12 +17,15 @@ package com.gitee.dorive.core.impl.resolver; +import cn.hutool.core.lang.Pair; import com.gitee.dorive.core.repository.AbstractContextRepository; import lombok.Data; import org.springframework.context.ApplicationContext; import org.springframework.util.ReflectionUtils; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -57,19 +60,20 @@ public class DerivedResolver { return !classRepositoryMap.isEmpty(); } - public AbstractContextRepository distribute(Object entity) { - return classRepositoryMap.getOrDefault(entity.getClass(), repository); - } - - public Map, List> distribute(List entities) { + public Collection, List>> distribute(List entities) { int size = classRepositoryMap.size() + 1; - Map, List> repositoryEntitiesMap = new LinkedHashMap<>(size * 4 / 3 + 1); + Map, Pair, List>> classRepoEntitiesPairMap = new HashMap<>(size * 4 / 3 + 1); for (Object entity : entities) { - AbstractContextRepository repository = distribute(entity); - List existEntities = repositoryEntitiesMap.computeIfAbsent(repository, key -> new ArrayList<>(entities.size())); - existEntities.add(entity); + Class clazz = entity.getClass(); + Pair, List> repoEntitiesPair = classRepoEntitiesPairMap.computeIfAbsent(clazz, key -> { + AbstractContextRepository repository = classRepositoryMap.getOrDefault(key, this.repository); + List partEntities = new ArrayList<>(entities.size()); + return new Pair<>(repository, partEntities); + }); + List partEntities = repoEntitiesPair.getValue(); + partEntities.add(entity); } - return repositoryEntitiesMap; + return classRepoEntitiesPairMap.values(); } } 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 dc12acfc..8c5eb27f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,10 +22,11 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.util.ExampleUtils; +import java.util.Collections; import java.util.List; public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @@ -53,7 +54,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertOrUpdate(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new InsertOrUpdate(entity); + Operation operation = new InsertOrUpdate(Collections.singletonList(entity)); return execute((Context) options, operation); } 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 146d4047..2b02c707 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 @@ -28,11 +28,8 @@ import com.gitee.dorive.core.api.repository.Repository; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.factory.OperationFactory; import lombok.Getter; import lombok.Setter; @@ -97,23 +94,23 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int insert(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Insert insert = operationFactory.buildInsert(entity); - return execute((Context) options, insert); + Operation operation = operationFactory.buildInsert(entity); + return execute((Context) options, operation); } @Override public int update(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Update update = operationFactory.buildUpdate(entity); - return execute((Context) options, update); + Operation operation = operationFactory.buildUpdate(entity); + return execute((Context) options, operation); } @Override public int updateByExample(Options options, Object entity, Example example) { Assert.notNull(entity, "The entity cannot be null!"); Assert.notNull(example, "The example cannot be null!"); - Update update = operationFactory.buildUpdateByExample(entity, example); - return execute((Context) options, update); + Operation operation = operationFactory.buildUpdateByExample(entity, example); + return execute((Context) options, operation); } @Override @@ -126,22 +123,22 @@ public abstract class AbstractRepository implements Repository, Ex @Override public int delete(Options options, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Delete delete = operationFactory.buildDelete(entity); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDelete(entity); + return execute((Context) options, operation); } @Override public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); - Delete delete = operationFactory.buildDeleteByPK(primaryKey); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDeleteByPK(primaryKey); + return execute((Context) options, operation); } @Override public int deleteByExample(Options options, Example example) { Assert.notNull(example, "The example cannot be null!"); - Delete delete = operationFactory.buildDeleteByExample(example); - return execute((Context) options, delete); + Operation operation = operationFactory.buildDeleteByExample(example); + return execute((Context) options, operation); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 75ddbb5e..747d96e1 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.core.repository; import com.gitee.dorive.api.entity.PropChain; +import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; @@ -34,6 +35,7 @@ import com.gitee.dorive.core.util.ExampleUtils; import lombok.Getter; import lombok.Setter; +import java.util.Collection; import java.util.List; @Getter @@ -105,4 +107,31 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return super.executeQuery(context, query); } + public void getBoundValue(Context context, Object rootEntity, Collection entities) { + for (Object entity : entities) { + for (Binder binder : binderResolver.getStrongBinders()) { + Object fieldValue = binder.getFieldValue(context, entity); + if (fieldValue == null) { + Object boundValue = binder.getBoundValue(context, rootEntity); + if (boundValue != null) { + binder.setFieldValue(context, entity, boundValue); + } + } + } + } + } + + public void setBoundId(Context context, Object rootEntity, Object entity) { + Binder binder = binderResolver.getBoundIdBinder(); + if (binder != null) { + Object boundValue = binder.getBoundValue(context, rootEntity); + if (boundValue == null) { + Object primaryKey = binder.getFieldValue(context, entity); + if (primaryKey != null) { + binder.setBoundValue(context, rootEntity, primaryKey); + } + } + } + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java index 7ae87692..ca16d4b5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/util/CollectionUtils.java @@ -17,19 +17,23 @@ package com.gitee.dorive.core.util; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; public class CollectionUtils { - public static Collection toCollection(Object object) { - Collection collection; - if (object instanceof Collection) { - collection = (Collection) object; + public static List toList(Object object) { + if (object instanceof List) { + return (List) object; + + } else if (object instanceof Collection) { + return new ArrayList<>((Collection) object); + } else { - collection = Collections.singletonList(object); + return Collections.singletonList(object); } - return collection; } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java index a4f85947..e45002c2 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java @@ -22,4 +22,5 @@ public enum OperationType { INSERT, UPDATE, DELETE, + INSERT_OR_UPDATE } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index dd22a9a9..ca05525d 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -20,10 +20,10 @@ package com.gitee.dorive.event.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.ext.Delete; +import com.gitee.dorive.core.entity.operation.ext.Insert; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.ext.Update; import com.gitee.dorive.event.api.EntityEventListener; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 30705b4f..0b478f9f 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -31,11 +31,11 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; +import com.gitee.dorive.core.entity.operation.ext.Delete; +import com.gitee.dorive.core.entity.operation.ext.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.operation.ext.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import lombok.Getter; import lombok.Setter; -- Gitee From c51e582506b99df377728ea323f560d13d301462 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 10 Apr 2024 22:58:41 +0800 Subject: [PATCH 02/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/operation/Operation.java | 2 +- .../core/impl/executor/ContextExecutor.java | 2 +- .../core/impl/executor/FactoryExecutor.java | 51 ++++++++++++++----- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index c1cd4338..d9be12f6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.entity.option.RootControl; import lombok.Data; /** - * 操作 = 操作类型 + (实体 || 实体 + 主键 || 实体 + 条件 || 主键 || 条件) + * 操作 */ @Data public class Operation { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 20203fc5..c161c289 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -72,7 +72,7 @@ public class ContextExecutor extends AbstractExecutor { if (!derivedResolver.hasDerived()) { entityHandler.handle(context, entities); } else { - for (Pair, List> pair : repository.getDerivedResolver().distribute(entities)) { + for (Pair, List> pair : derivedResolver.distribute(entities)) { if (pair.getKey() == this.repository) { // 避免自循环 entityHandler.handle(context, pair.getValue()); } else { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index cc2b8b21..29069551 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -27,9 +27,12 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.operation.ConditionOp; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.ext.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; import lombok.Getter; import lombok.Setter; @@ -91,21 +94,43 @@ public class FactoryExecutor extends AbstractProxyExecutor { @Override public int execute(Context context, Operation operation) { - Object entity = operation.getEntity(); - if (entity != null) { - Object persistent = entityFactory.deconstruct(context, entity); - operation.setEntity(persistent); - } - int totalCount = super.execute(context, operation); - if (operation instanceof Insert) { - Object persistent = operation.getEntity(); - Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); - if (primaryKey != null) { - entityEle.getIdProxy().setValue(entity, primaryKey); + if (operation instanceof EntityOp) { + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + List newEntities = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object persistent = entityFactory.deconstruct(context, entity); + newEntities.add(persistent); + } + + entityOp.setEntities(newEntities); + int totalCount = super.execute(context, operation); + entityOp.setEntities(entities); + + if (operation instanceof Insert || operation instanceof InsertOrUpdate) { + for (int index = 0; index < entities.size(); index++) { + Object entity = entities.get(index); + Object persistent = newEntities.get(index); + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + if (primaryKey != null) { + entityEle.getIdProxy().setValue(entity, primaryKey); + } + } + } + return totalCount; + + } else if (operation instanceof ConditionOp) { + ConditionOp conditionOp = (ConditionOp) operation; + Object entity = conditionOp.getEntity(); + if (entity != null) { + Object persistent = entityFactory.deconstruct(context, entity); + conditionOp.setEntity(persistent); + int totalCount = super.execute(context, operation); + conditionOp.setEntity(entity); + return totalCount; } } - operation.setEntity(entity); - return totalCount; + return super.execute(context, operation); } } -- Gitee From 0a7433cfa59e634ad77ec21f5fd0c205fd1176ef Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 10 Apr 2024 23:10:59 +0800 Subject: [PATCH 03/49] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/executor/Executor.java | 2 +- .../dorive/core/entity/executor/Result.java | 2 +- .../core/entity/operation/ConditionOp.java | 39 ------------------- .../{ext => cop}/ConditionDelete.java | 5 +-- .../{ext => cop}/ConditionUpdate.java | 10 +++-- .../entity/operation/{ => cop}/Query.java | 3 +- .../entity/operation/{ext => eop}/Delete.java | 2 +- .../entity/operation/{ext => eop}/Insert.java | 2 +- .../{ext => eop}/InsertOrUpdate.java | 2 +- .../entity/operation/{ext => eop}/Update.java | 2 +- .../impl/executor/AbstractProxyExecutor.java | 2 +- .../core/impl/executor/ContextExecutor.java | 10 ++--- .../core/impl/executor/ExampleExecutor.java | 4 +- .../core/impl/executor/FactoryExecutor.java | 7 ++-- .../core/impl/factory/OperationFactory.java | 12 +++--- .../core/impl/handler/BatchEntityHandler.java | 2 +- .../repository/AbstractGenericRepository.java | 2 +- .../repository/AbstractProxyRepository.java | 2 +- .../core/repository/AbstractRepository.java | 2 +- .../core/repository/CommonRepository.java | 2 +- .../event/impl/ExecutorEventListener.java | 6 +-- .../plus/impl/MybatisPlusExecutor.java | 8 ++-- .../sql/impl/executor/UnionExecutor.java | 2 +- 23 files changed, 46 insertions(+), 84 deletions(-) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => cop}/ConditionDelete.java (86%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => cop}/ConditionUpdate.java (83%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ => cop}/Query.java (90%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => eop}/Delete.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => eop}/Insert.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => eop}/InsertOrUpdate.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/{ext => eop}/Update.java (95%) 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 8ec59a6b..d19da832 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 @@ -20,7 +20,7 @@ package com.gitee.dorive.core.api.executor; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; public interface Executor { 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 1b35bcd8..f0539660 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 @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.executor; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java deleted file mode 100644 index 85453957..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ConditionOp.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.core.entity.operation; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class ConditionOp extends Operation { - - private Object entity; - private Condition condition; - - public ConditionOp(Condition condition) { - this.condition = condition; - } - - public ConditionOp(Object entity, Condition condition) { - this.entity = entity; - this.condition = condition; - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java similarity index 86% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java index a43542f5..cf46f5e5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionDelete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java @@ -15,16 +15,15 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.cop; import com.gitee.dorive.core.entity.operation.Condition; -import com.gitee.dorive.core.entity.operation.ConditionOp; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class ConditionDelete extends ConditionOp { +public class ConditionDelete extends Condition { public ConditionDelete(Condition condition) { super(condition); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java similarity index 83% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java index 57c2ec19..ee0661d7 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/ConditionUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java @@ -15,19 +15,21 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.cop; import com.gitee.dorive.core.entity.operation.Condition; -import com.gitee.dorive.core.entity.operation.ConditionOp; import lombok.Getter; import lombok.Setter; @Getter @Setter -public class ConditionUpdate extends ConditionOp { +public class ConditionUpdate extends Condition { + + private Object entity; public ConditionUpdate(Object entity, Condition condition) { - super(entity, condition); + super(condition); + this.entity = entity; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java similarity index 90% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java index 58e9c876..66fac2fc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Query.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/Query.java @@ -15,9 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation; +package com.gitee.dorive.core.entity.operation.cop; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.Condition; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java index 6f120be4..c12f5d84 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Delete.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.eop; import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java index 54b37447..e42d7526 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Insert.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.eop; import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java index 442bca9e..cd420bee 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/InsertOrUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.eop; import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java index 25008b4b..f534ff99 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/ext/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/Update.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.operation.ext; +package com.gitee.dorive.core.entity.operation.eop; import com.gitee.dorive.core.entity.operation.EntityOp; import lombok.Getter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java index 45ee4fda..43d99ae8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/AbstractProxyExecutor.java @@ -21,7 +21,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index c161c289..f2ccadf6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -26,11 +26,11 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.ext.Delete; -import com.gitee.dorive.core.entity.operation.ext.Insert; -import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; -import com.gitee.dorive.core.entity.operation.ext.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 03e75f6d..efa90a41 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -29,8 +29,8 @@ import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.ext.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 29069551..f27f48bb 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -27,12 +27,11 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.ConditionOp; import com.gitee.dorive.core.entity.operation.EntityOp; -import com.gitee.dorive.core.entity.operation.ext.Insert; +import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import lombok.Getter; import lombok.Setter; 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 21bb550c..48c59a99 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 @@ -21,12 +21,12 @@ import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.ext.ConditionDelete; -import com.gitee.dorive.core.entity.operation.ext.ConditionUpdate; -import com.gitee.dorive.core.entity.operation.ext.Delete; -import com.gitee.dorive.core.entity.operation.ext.Insert; -import com.gitee.dorive.core.entity.operation.ext.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.AllArgsConstructor; import lombok.Data; 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 4a690ef8..9a0c3ff6 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 @@ -22,7 +22,7 @@ import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.option.JoinType; import com.gitee.dorive.core.impl.binder.ValueBinder; import com.gitee.dorive.core.impl.factory.OperationFactory; 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 8c5eb27f..f9f42d95 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,7 +22,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.ext.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.util.ExampleUtils; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java index f13a3b5e..1bdf7abb 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractProxyRepository.java @@ -23,7 +23,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; 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 2b02c707..a1cf2361 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 @@ -29,7 +29,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.factory.OperationFactory; import lombok.Getter; import lombok.Setter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 747d96e1..948aa318 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -27,7 +27,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.option.JoinType; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index ca05525d..edef410d 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -20,10 +20,10 @@ package com.gitee.dorive.event.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.ext.Delete; -import com.gitee.dorive.core.entity.operation.ext.Insert; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.ext.Update; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.event.api.EntityEventListener; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 0b478f9f..805edcb2 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -31,11 +31,11 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.operation.ext.Delete; -import com.gitee.dorive.core.entity.operation.ext.Insert; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.ext.Update; +import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import lombok.Getter; import lombok.Setter; diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java index a6122243..26f4ef3b 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/executor/UnionExecutor.java @@ -28,7 +28,7 @@ import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; import com.gitee.dorive.sql.api.SqlRunner; import lombok.Getter; -- Gitee From 7e64ff890794c2e5822f6b08bb85b77313a61b45 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 10 Apr 2024 23:17:33 +0800 Subject: [PATCH 04/49] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/operation/cop/ConditionDelete.java | 9 +++++++-- .../core/entity/operation/cop/ConditionUpdate.java | 10 ++++++++-- .../dorive/core/impl/factory/OperationFactory.java | 9 ++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java index cf46f5e5..c085316e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionDelete.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.operation.cop; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Condition; import lombok.Getter; import lombok.Setter; @@ -25,8 +26,12 @@ import lombok.Setter; @Setter public class ConditionDelete extends Condition { - public ConditionDelete(Condition condition) { - super(condition); + public ConditionDelete(Object primaryKey) { + super(primaryKey); + } + + public ConditionDelete(Example example) { + super(example); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java index ee0661d7..6e7c8692 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/cop/ConditionUpdate.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.operation.cop; +import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Condition; import lombok.Getter; import lombok.Setter; @@ -27,8 +28,13 @@ public class ConditionUpdate extends Condition { private Object entity; - public ConditionUpdate(Object entity, Condition condition) { - super(condition); + public ConditionUpdate(Object entity, Object primaryKey) { + super(primaryKey); + this.entity = entity; + } + + public ConditionUpdate(Object entity, Example example) { + super(example); this.entity = entity; } 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 48c59a99..c7e55935 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 @@ -19,11 +19,10 @@ package com.gitee.dorive.core.impl.factory; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; +import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.Update; @@ -55,7 +54,7 @@ public class OperationFactory { } public Operation buildUpdateByExample(Object entity, Example example) { - return new ConditionUpdate(entity, new Condition(example)); + return new ConditionUpdate(entity, example); } public Operation buildInsertOrUpdate(Object entity) { @@ -72,11 +71,11 @@ public class OperationFactory { } public Operation buildDeleteByPK(Object primaryKey) { - return new ConditionDelete(new Condition(primaryKey)); + return new ConditionDelete(primaryKey); } public Operation buildDeleteByExample(Example example) { - return new ConditionDelete(new Condition(example)); + return new ConditionDelete(example); } } -- Gitee From 7b00c4635ee5b0444f8a59e3a18eb5b7f17912bd Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 10 Apr 2024 23:19:42 +0800 Subject: [PATCH 05/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/impl/executor/FactoryExecutor.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index f27f48bb..64fd6c9c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -28,6 +28,7 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.EntityOp; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; @@ -118,14 +119,14 @@ public class FactoryExecutor extends AbstractProxyExecutor { } return totalCount; - } else if (operation instanceof ConditionOp) { - ConditionOp conditionOp = (ConditionOp) operation; - Object entity = conditionOp.getEntity(); + } else if (operation instanceof ConditionUpdate) { + ConditionUpdate conditionUpdate = (ConditionUpdate) operation; + Object entity = conditionUpdate.getEntity(); if (entity != null) { Object persistent = entityFactory.deconstruct(context, entity); - conditionOp.setEntity(persistent); + conditionUpdate.setEntity(persistent); int totalCount = super.execute(context, operation); - conditionOp.setEntity(entity); + conditionUpdate.setEntity(entity); return totalCount; } } -- Gitee From 4b5f5134d7ac77aae1bdc83e3099191e873dd141 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 11 Apr 2024 00:07:30 +0800 Subject: [PATCH 06/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plus/impl/MybatisPlusExecutor.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 805edcb2..442bc55e 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -18,6 +18,7 @@ package com.gitee.dorive.mybatis.plus.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ReflectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -31,6 +32,7 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; @@ -141,6 +143,31 @@ public class MybatisPlusExecutor extends AbstractExecutor { @Override public int execute(Context context, Operation operation) { + int totalCount = 0; + if (operation instanceof EntityOp) { + EntityOp entityOp = (EntityOp) operation; + List persistentObjs = entityOp.getEntities(); + if (entityOp instanceof Insert) { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.insert(persistent); + } + + } else if (operation instanceof Update) { + Update update = (Update) operation; + Set nullableProps = update.getNullableProps(); + for (Object persistent : persistentObjs) { + if (nullableProps != null && !nullableProps.isEmpty()) { + Object primaryKey = ReflectUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey, null); + totalCount += baseMapper.update(null, updateWrapper); + } else { + totalCount += baseMapper.updateById(persistent); + } + } + } + } + return totalCount; + Object persistent = operation.getEntity(); if (operation instanceof Insert) { -- Gitee From 108f346cfb144d5deecc4146783f069099bf854d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 09:41:53 +0800 Subject: [PATCH 07/49] =?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 --- .../gitee/dorive/core/impl/executor/FactoryExecutor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 64fd6c9c..03d1dde8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -97,20 +97,20 @@ public class FactoryExecutor extends AbstractProxyExecutor { if (operation instanceof EntityOp) { EntityOp entityOp = (EntityOp) operation; List entities = entityOp.getEntities(); - List newEntities = new ArrayList<>(entities.size()); + List persistentObjs = new ArrayList<>(entities.size()); for (Object entity : entities) { Object persistent = entityFactory.deconstruct(context, entity); - newEntities.add(persistent); + persistentObjs.add(persistent); } - entityOp.setEntities(newEntities); + entityOp.setEntities(persistentObjs); int totalCount = super.execute(context, operation); entityOp.setEntities(entities); if (operation instanceof Insert || operation instanceof InsertOrUpdate) { for (int index = 0; index < entities.size(); index++) { Object entity = entities.get(index); - Object persistent = newEntities.get(index); + Object persistent = persistentObjs.get(index); Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); if (primaryKey != null) { entityEle.getIdProxy().setValue(entity, primaryKey); -- Gitee From 8413d7a4e13357d1bb5d1181e3d49c1eb6f84cad Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 10:35:51 +0800 Subject: [PATCH 08/49] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=95=E5=B1=82?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plus/impl/MybatisPlusExecutor.java | 109 +++++++++--------- 1 file changed, 57 insertions(+), 52 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 442bc55e..4eb7d0f4 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -18,7 +18,6 @@ package com.gitee.dorive.mybatis.plus.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ReflectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -32,11 +31,15 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.EntityOp; -import com.gitee.dorive.core.entity.operation.eop.Delete; -import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.cop.ConditionDelete; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import lombok.Getter; @@ -155,66 +158,60 @@ public class MybatisPlusExecutor extends AbstractExecutor { } else if (operation instanceof Update) { Update update = (Update) operation; Set nullableProps = update.getNullableProps(); - for (Object persistent : persistentObjs) { - if (nullableProps != null && !nullableProps.isEmpty()) { - Object primaryKey = ReflectUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey, null); + if (nullableProps != null && !nullableProps.isEmpty()) { + for (Object persistent : persistentObjs) { + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey); totalCount += baseMapper.update(null, updateWrapper); - } else { + } + } else { + for (Object persistent : persistentObjs) { totalCount += baseMapper.updateById(persistent); } } - } - } - return totalCount; - - Object persistent = operation.getEntity(); - - if (operation instanceof Insert) { - return baseMapper.insert(persistent); - } else if (operation instanceof Update) { - Update update = (Update) operation; - Object primaryKey = update.getPrimaryKey(); - Example example = update.getExample(); - - Set nullableProps = update.getNullableProps(); - if (nullableProps != null && !nullableProps.isEmpty()) { - UpdateWrapper updateWrapper = buildUpdateWrapper(persistent, nullableProps, primaryKey, example); - return baseMapper.update(null, updateWrapper); - } - - if (primaryKey != null) { - return baseMapper.updateById(persistent); + } else if (operation instanceof Delete) { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.deleteById(persistent); + } - } else if (example != null) { - return baseMapper.update(persistent, buildUpdateWrapper(example)); + } else if (operation instanceof InsertOrUpdate) { + for (Object persistent : persistentObjs) { + Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); + totalCount += primaryKey == null ? baseMapper.insert(persistent) : baseMapper.updateById(persistent); + } } - } else if (operation instanceof Delete) { - Delete delete = (Delete) operation; - Object primaryKey = delete.getPrimaryKey(); - Example example = delete.getExample(); + } else if (operation instanceof Condition) { + if (operation instanceof ConditionUpdate) { + ConditionUpdate conditionUpdate = (ConditionUpdate) operation; + Object entity = conditionUpdate.getEntity(); + Object primaryKey = conditionUpdate.getPrimaryKey(); + Example example = conditionUpdate.getExample(); + if (primaryKey != null) { + totalCount += baseMapper.update(entity, buildUpdateWrapper(primaryKey)); + + } else if (example != null) { + totalCount += baseMapper.update(entity, buildUpdateWrapper(example)); + } - if (primaryKey != null) { - return baseMapper.deleteById((Serializable) primaryKey); + } else if (operation instanceof ConditionDelete) { + ConditionDelete conditionDelete = (ConditionDelete) operation; + Object primaryKey = conditionDelete.getPrimaryKey(); + Example example = conditionDelete.getExample(); + if (primaryKey != null) { + totalCount += baseMapper.deleteById((Serializable) primaryKey); - } else if (example != null) { - return baseMapper.delete(buildUpdateWrapper(example)); + } else if (example != null) { + totalCount += baseMapper.delete(buildUpdateWrapper(example)); + } } } - return 0; - } - - private UpdateWrapper buildUpdateWrapper(Example example) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - AppenderContext.appendCriterion(updateWrapper, example); - return updateWrapper; + return totalCount; } - private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableProps, Object primaryKey, Example example) { + private UpdateWrapper buildUpdateWrapper(Object persistent, Set nullableProps, Object primaryKey) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - Map propAliasMappingWithoutPk = entityStoreInfo.getPropAliasMappingWithoutPk(); propAliasMappingWithoutPk.forEach((prop, alias) -> { Object value = BeanUtil.getFieldValue(persistent, prop); @@ -222,13 +219,21 @@ public class MybatisPlusExecutor extends AbstractExecutor { updateWrapper.set(true, alias, value); } }); - if (primaryKey != null) { updateWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); } - if (example != null) { - AppenderContext.appendCriterion(updateWrapper, example); - } + return updateWrapper; + } + + private UpdateWrapper buildUpdateWrapper(Object primaryKey) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq(entityStoreInfo.getIdColumn(), primaryKey); + return updateWrapper; + } + + private UpdateWrapper buildUpdateWrapper(Example example) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + AppenderContext.appendCriterion(updateWrapper, example); return updateWrapper; } -- Gitee From b642f6c51dc0a7f209d1ec697338bc19dba18441 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 10:43:09 +0800 Subject: [PATCH 09/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/factory/OperationFactory.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 c7e55935..1c3fef36 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 @@ -25,6 +25,7 @@ import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.AllArgsConstructor; import lombok.Data; @@ -58,12 +59,7 @@ public class OperationFactory { } public Operation buildInsertOrUpdate(Object entity) { - Object primaryKey = entityEle.getIdProxy().getValue(entity); - if (primaryKey == null) { - return buildInsert(entity); - } else { - return buildUpdate(entity); - } + return new InsertOrUpdate(Collections.singletonList(entity)); } public Operation buildDelete(Object entity) { -- Gitee From ef7d18158e40e854601967af6c17798d71640aa4 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:08:25 +0800 Subject: [PATCH 10/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=99=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/event/api/EntityEventListener.java | 8 ++++ .../event/impl/ExecutorEventListener.java | 43 +++++++++++++------ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java index fb6116ce..b6df2388 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java @@ -19,8 +19,16 @@ package com.gitee.dorive.event.api; import com.gitee.dorive.event.entity.EntityEvent; +import java.util.List; + public interface EntityEventListener { + default void onEntityEvents(List entityEvents) { + for (EntityEvent entityEvent : entityEvents) { + onEntityEvent(entityEvent); + } + } + void onEntityEvent(EntityEvent entityEvent); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index edef410d..4e698ff7 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -20,9 +20,11 @@ package com.gitee.dorive.event.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.event.api.EntityEventListener; import com.gitee.dorive.event.entity.EntityEvent; @@ -39,6 +41,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.OrderUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -116,28 +119,44 @@ public class ExecutorEventListener implements ApplicationListener Class entityClass = entityEle.getGenericType(); List entityEventListeners = classEntityEventListenersMap.get(entityClass); if (entityEventListeners != null && !entityEventListeners.isEmpty()) { - EntityEvent entityEvent = newEntityEvent(executorEvent); + List entityEvents = newEntityEvents(executorEvent); for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityEvent(entityEvent); + entityEventListener.onEntityEvents(entityEvents); } } } - private EntityEvent newEntityEvent(ExecutorEvent executorEvent) { + private List newEntityEvents(ExecutorEvent executorEvent) { Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); - OperationType operationType = OperationType.UNKNOWN; - if (operation instanceof Insert) { - operationType = OperationType.INSERT; - } else if (operation instanceof Update) { - operationType = OperationType.UPDATE; + if (operation instanceof EntityOp) { + EntityOp entityOp = (EntityOp) operation; - } else if (operation instanceof Delete) { - operationType = OperationType.DELETE; + OperationType operationType = OperationType.UNKNOWN; + if (operation instanceof Insert) { + operationType = OperationType.INSERT; + + } else if (operation instanceof Update) { + operationType = OperationType.UPDATE; + + } else if (operation instanceof Delete) { + operationType = OperationType.DELETE; + + } else if (operation instanceof InsertOrUpdate) { + operationType = OperationType.INSERT_OR_UPDATE; + } + + List entities = entityOp.getEntities(); + List entityEvents = new ArrayList<>(entities.size()); + for (Object entity : entities) { + EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); + entityEvents.add(entityEvent); + } + return entityEvents; } - Object entity = operation.getEntity(); - return new EntityEvent(executorEvent, context, operationType, entity); + + return Collections.emptyList(); } } -- Gitee From befb19c7c0a5c96e157ec70b6f8ef209ba3b18b7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:09:21 +0800 Subject: [PATCH 11/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=99=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/event/impl/ExecutorEventListener.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 4e698ff7..4753b79c 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -120,8 +120,10 @@ public class ExecutorEventListener implements ApplicationListener List entityEventListeners = classEntityEventListenersMap.get(entityClass); if (entityEventListeners != null && !entityEventListeners.isEmpty()) { List entityEvents = newEntityEvents(executorEvent); - for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityEvents(entityEvents); + if (!entityEvents.isEmpty()) { + for (EntityEventListener entityEventListener : entityEventListeners) { + entityEventListener.onEntityEvents(entityEvents); + } } } } -- Gitee From 6bc1bbb806484dddd1e7a588e02f5770afe25520 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:15:32 +0800 Subject: [PATCH 12/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AbstractGenericRepository.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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 f9f42d95..77096a19 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,8 +22,11 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.util.ExampleUtils; import java.util.Collections; @@ -79,22 +82,30 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertList(Options options, List entities) { - return entities.stream().mapToInt(entity -> insert(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Insert insert = new Insert(entities); + return execute((Context) options, insert); } @Override public int updateList(Options options, List entities) { - return entities.stream().mapToInt(entity -> update(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Update update = new Update(entities); + return execute((Context) options, update); } @Override public int insertOrUpdateList(Options options, List entities) { - return entities.stream().mapToInt(entity -> insertOrUpdate(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); + return execute((Context) options, insertOrUpdate); } @Override public int deleteList(Options options, List entities) { - return entities.stream().mapToInt(entity -> delete(options, entity)).sum(); + Assert.notEmpty(entities, "The entities cannot be empty!"); + Delete delete = new Delete(entities); + return execute((Context) options, delete); } } -- Gitee From 1f1854c7100b8681c4497bbf21a13ccd340f0bc3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:19:07 +0800 Subject: [PATCH 13/49] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=AF=B9=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=93=8D=E4=BD=9C=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=9A=84=E5=88=86=E7=B1=BB=E6=9B=B4=E6=B8=85?= =?UTF-8?q?=E6=99=B0=EF=BC=8C=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=8E=A8=E9=80=81=E6=89=B9=E9=87=8F=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-proxy/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 9755bd70..0d58bd76 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 83b29400..a612a0b4 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index 64f097ee..20666fd6 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 297735c6..9bfea969 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index b46ff43d..31be841c 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index 49c9b84a..ddb5edde 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-mybatis-plus diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index 52aebc36..6f6acb1e 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-proxy diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 9da0aa6d..a82d94c1 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index 8281b7dd..f2515785 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 6605196a..e8ef45fc 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index 73926587..52670242 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index e0ee277b..a36d2e39 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 dorive-web diff --git a/pom.xml b/pom.xml index 0ab8cb4c..030ee870 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.4.3.4 + 3.4.3.5 pom -- Gitee From 3d554ed40f91e15b32a6c54ae978f7471f45789d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:28:40 +0800 Subject: [PATCH 14/49] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/impl/executor/ContextExecutor.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index f2ccadf6..4b4b330f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -22,7 +22,6 @@ import cn.hutool.core.lang.Pair; import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; @@ -76,11 +75,8 @@ public class ContextExecutor extends AbstractExecutor { if (pair.getKey() == this.repository) { // 避免自循环 entityHandler.handle(context, pair.getValue()); } else { - Executor executor = repository.getExecutor(); - if (executor instanceof ContextExecutor) { - ContextExecutor contextExecutor = (ContextExecutor) executor; - contextExecutor.populate(context, pair.getValue()); - } + ContextExecutor contextExecutor = (ContextExecutor) pair.getKey().getExecutor(); + contextExecutor.populate(context, pair.getValue()); } } } -- Gitee From e5dca663d9a59b9a23eee885421db312d66f7138 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 11:51:39 +0800 Subject: [PATCH 15/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/impl/ExecutorEventListener.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 4753b79c..0b5e11a9 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -129,6 +129,9 @@ public class ExecutorEventListener implements ApplicationListener } private List newEntityEvents(ExecutorEvent executorEvent) { + EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); + EntityEle entityEle = eventExecutor.getEntityEle(); + Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); @@ -151,9 +154,18 @@ public class ExecutorEventListener implements ApplicationListener List entities = entityOp.getEntities(); List entityEvents = new ArrayList<>(entities.size()); - for (Object entity : entities) { - EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); - entityEvents.add(entityEvent); + if (operationType == OperationType.INSERT_OR_UPDATE) { + for (Object entity : entities) { + Object primaryKey = entityEle.getIdProxy().getValue(entity); + OperationType newOperationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE; + EntityEvent entityEvent = new EntityEvent(executorEvent, context, newOperationType, entity); + entityEvents.add(entityEvent); + } + } else { + for (Object entity : entities) { + EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); + entityEvents.add(entityEvent); + } } return entityEvents; } -- Gitee From c4bac4906917331585e172d78f8852900683f57d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 12:38:54 +0800 Subject: [PATCH 16/49] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/repository/AbstractGenericRepository.java | 9 --------- 1 file changed, 9 deletions(-) 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 77096a19..77e5f10d 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 @@ -25,11 +25,9 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; -import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.util.ExampleUtils; -import java.util.Collections; import java.util.List; public abstract class AbstractGenericRepository extends AbstractContextRepository implements ListableRepository { @@ -54,13 +52,6 @@ public abstract class AbstractGenericRepository extends AbstractContextRe return totalCount; } - @Override - public int insertOrUpdate(Options options, E entity) { - Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new InsertOrUpdate(Collections.singletonList(entity)); - return execute((Context) options, operation); - } - @Override public int deleteByPrimaryKey(Options options, PK primaryKey) { Assert.notNull(primaryKey, "The primary key cannot be null!"); -- Gitee From 65fd57cf762177c2c4a856f8c6120e73de973618 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 13:53:19 +0800 Subject: [PATCH 17/49] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AbstractGenericRepository.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) 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 77e5f10d..6a47ce6e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -22,6 +22,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.repository.ListableRepository; import com.gitee.dorive.core.entity.executor.Example; +import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; @@ -74,29 +75,29 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertList(Options options, List entities) { Assert.notEmpty(entities, "The entities cannot be empty!"); - Insert insert = new Insert(entities); - return execute((Context) options, insert); + Operation operation = new Insert(entities); + return execute((Context) options, operation); } @Override public int updateList(Options options, List entities) { Assert.notEmpty(entities, "The entities cannot be empty!"); - Update update = new Update(entities); - return execute((Context) options, update); + Operation operation = new Update(entities); + return execute((Context) options, operation); } @Override public int insertOrUpdateList(Options options, List entities) { Assert.notEmpty(entities, "The entities cannot be empty!"); - InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); - return execute((Context) options, insertOrUpdate); + Operation operation = new InsertOrUpdate(entities); + return execute((Context) options, operation); } @Override public int deleteList(Options options, List entities) { Assert.notEmpty(entities, "The entities cannot be empty!"); - Delete delete = new Delete(entities); - return execute((Context) options, delete); + Operation operation = new Delete(entities); + return execute((Context) options, operation); } } -- Gitee From 5d1a0e6d04d6efe57556d14b281b8e763e5080ba Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 14:17:59 +0800 Subject: [PATCH 18/49] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86inser?= =?UTF-8?q?tOrUpdate=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/executor/FactoryExecutor.java | 7 ++-- .../core/repository/CommonRepository.java | 32 +++++++++++++++++++ .../dorive/event/entity/OperationType.java | 3 +- .../event/impl/ExecutorEventListener.java | 24 +++----------- .../plus/impl/MybatisPlusExecutor.java | 7 ---- 5 files changed, 40 insertions(+), 33 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index 03d1dde8..b40ad645 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -28,11 +28,10 @@ import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.EntityOp; -import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; -import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.cop.Query; -import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Insert; import lombok.Getter; import lombok.Setter; @@ -107,7 +106,7 @@ public class FactoryExecutor extends AbstractProxyExecutor { int totalCount = super.execute(context, operation); entityOp.setEntities(entities); - if (operation instanceof Insert || operation instanceof InsertOrUpdate) { + if (operation instanceof Insert) { for (int index = 0; index < entities.size(); index++) { Object entity = entities.get(index); Object persistent = persistentObjs.get(index); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 948aa318..8e17ea5b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -27,7 +27,11 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.entity.option.JoinType; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; @@ -35,6 +39,7 @@ import com.gitee.dorive.core.util.ExampleUtils; import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -107,6 +112,33 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher return super.executeQuery(context, query); } + @Override + public int execute(Context context, Operation operation) { + if (!isAggregated() && operation instanceof InsertOrUpdate) { + InsertOrUpdate insertOrUpdate = (InsertOrUpdate) operation; + List entities = insertOrUpdate.getEntities(); + List insertList = new ArrayList<>(entities.size()); + List updateList = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object primaryKey = getPrimaryKey(entity); + if (primaryKey == null) { + insertList.add(entity); + } else { + updateList.add(entity); + } + } + int totalCount = 0; + if (!insertList.isEmpty()) { + totalCount += super.execute(context, new Insert(insertList)); + } + if (!updateList.isEmpty()) { + totalCount += super.execute(context, new Update(updateList)); + } + return totalCount; + } + return super.execute(context, operation); + } + public void getBoundValue(Context context, Object rootEntity, Collection entities) { for (Object entity : entities) { for (Binder binder : binderResolver.getStrongBinders()) { diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java index e45002c2..84a694a1 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java @@ -21,6 +21,5 @@ public enum OperationType { UNKNOWN, INSERT, UPDATE, - DELETE, - INSERT_OR_UPDATE + DELETE } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 0b5e11a9..ec72d6bf 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -21,10 +21,9 @@ import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.operation.EntityOp; +import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.event.api.EntityEventListener; import com.gitee.dorive.event.entity.EntityEvent; @@ -129,9 +128,6 @@ public class ExecutorEventListener implements ApplicationListener } private List newEntityEvents(ExecutorEvent executorEvent) { - EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); - EntityEle entityEle = eventExecutor.getEntityEle(); - Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); @@ -147,25 +143,13 @@ public class ExecutorEventListener implements ApplicationListener } else if (operation instanceof Delete) { operationType = OperationType.DELETE; - - } else if (operation instanceof InsertOrUpdate) { - operationType = OperationType.INSERT_OR_UPDATE; } List entities = entityOp.getEntities(); List entityEvents = new ArrayList<>(entities.size()); - if (operationType == OperationType.INSERT_OR_UPDATE) { - for (Object entity : entities) { - Object primaryKey = entityEle.getIdProxy().getValue(entity); - OperationType newOperationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE; - EntityEvent entityEvent = new EntityEvent(executorEvent, context, newOperationType, entity); - entityEvents.add(entityEvent); - } - } else { - for (Object entity : entities) { - EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); - entityEvents.add(entityEvent); - } + for (Object entity : entities) { + EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); + entityEvents.add(entityEvent); } return entityEvents; } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java index 4eb7d0f4..3dd19d43 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java @@ -39,7 +39,6 @@ import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; -import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import lombok.Getter; @@ -174,12 +173,6 @@ public class MybatisPlusExecutor extends AbstractExecutor { for (Object persistent : persistentObjs) { totalCount += baseMapper.deleteById(persistent); } - - } else if (operation instanceof InsertOrUpdate) { - for (Object persistent : persistentObjs) { - Object primaryKey = BeanUtil.getFieldValue(persistent, entityStoreInfo.getIdProperty()); - totalCount += primaryKey == null ? baseMapper.insert(persistent) : baseMapper.updateById(persistent); - } } } else if (operation instanceof Condition) { -- Gitee From 50d2c9a1d408115945a6d9da9232107b93e98e88 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 14:36:03 +0800 Subject: [PATCH 19/49] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/core/api/context/Options.java | 2 +- .../dorive/core/entity/{option => enums}/BindingType.java | 2 +- .../gitee/dorive/core/entity/{option => enums}/JoinType.java | 2 +- .../dorive/core/entity/{option => enums}/QueryMethod.java | 2 +- .../dorive/core/entity/{option => enums}/RootControl.java | 2 +- .../dorive/core/entity/{option => enums}/SelectType.java | 2 +- .../com/gitee/dorive/core/entity/operation/Operation.java | 2 +- .../com/gitee/dorive/core/impl/context/AbstractSelector.java | 2 +- .../com/gitee/dorive/core/impl/context/SelectTypeMatcher.java | 2 +- .../gitee/dorive/core/impl/handler/BatchEntityHandler.java | 2 +- .../com/gitee/dorive/core/impl/resolver/BinderResolver.java | 4 ++-- .../com/gitee/dorive/core/repository/CommonRepository.java | 2 +- .../dorive/mybatis/plus/repository/MybatisPlusRepository.java | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{option => enums}/BindingType.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{option => enums}/JoinType.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{option => enums}/QueryMethod.java (94%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{option => enums}/RootControl.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{option => enums}/SelectType.java (95%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java index 545275e7..2cd88402 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.api.context; import com.gitee.dorive.core.entity.context.EnumOptions; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import java.util.Map; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java index 89ea6fc6..0c614e8c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/BindingType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/BindingType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum BindingType { STRONG, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java index 0be2334a..47e31d0e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/JoinType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/JoinType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum JoinType { UNKNOWN, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java similarity index 94% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java index 3f94c7f9..ff60dc27 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/QueryMethod.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/QueryMethod.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum QueryMethod { DEFAULT, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java index 27f8351a..de283018 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/RootControl.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum RootControl { NONE, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java index 46827789..e96e7bac 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/option/SelectType.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/SelectType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.option; +package com.gitee.dorive.core.entity.enums; public enum SelectType { NONE, diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index d9be12f6..3c921259 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -17,7 +17,7 @@ package com.gitee.dorive.core.entity.operation; -import com.gitee.dorive.core.entity.option.RootControl; +import com.gitee.dorive.core.entity.enums.RootControl; import lombok.Data; /** diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java index ce1407e8..e4e6eae6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import java.util.LinkedHashMap; import java.util.Map; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index 965dda7d..d19e0885 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.option.SelectType; +import com.gitee.dorive.core.entity.enums.SelectType; import com.gitee.dorive.core.repository.CommonRepository; import lombok.Getter; import lombok.Setter; 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 9a0c3ff6..1b4f30f7 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 @@ -23,7 +23,7 @@ import com.gitee.dorive.core.api.executor.EntityJoiner; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.cop.Query; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.ValueBinder; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.joiner.MultiEntityJoiner; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java index f9551a96..f353efe9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/BinderResolver.java @@ -30,8 +30,8 @@ import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.api.resolver.PropChainResolver; import com.gitee.dorive.core.api.binder.Binder; import com.gitee.dorive.core.api.binder.Processor; -import com.gitee.dorive.core.entity.option.BindingType; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.enums.BindingType; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.BoundBinder; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueBinder; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 8e17ea5b..fe6e0edd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -32,7 +32,7 @@ import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; -import com.gitee.dorive.core.entity.option.JoinType; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.util.ExampleUtils; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index b9a9375d..94d2bce6 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -28,7 +28,7 @@ import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.option.QueryMethod; +import com.gitee.dorive.core.entity.enums.QueryMethod; import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.QueryContext; -- Gitee From 7142ecc87775d7a4c3777d3fc6ac65d60932efb9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 14:43:07 +0800 Subject: [PATCH 20/49] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/event/impl/ExecutorEventListener.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index ec72d6bf..c9ec6edc 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -132,8 +132,6 @@ public class ExecutorEventListener implements ApplicationListener Operation operation = executorEvent.getOperation(); if (operation instanceof EntityOp) { - EntityOp entityOp = (EntityOp) operation; - OperationType operationType = OperationType.UNKNOWN; if (operation instanceof Insert) { operationType = OperationType.INSERT; @@ -145,6 +143,7 @@ public class ExecutorEventListener implements ApplicationListener operationType = OperationType.DELETE; } + EntityOp entityOp = (EntityOp) operation; List entities = entityOp.getEntities(); List entityEvents = new ArrayList<>(entities.size()); for (Object entity : entities) { -- Gitee From 14c96a88924b60d8c30c094e812e815bc619331c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 14:58:41 +0800 Subject: [PATCH 21/49] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/event/api/EntityEventListener.java | 2 +- .../java/com/gitee/dorive/event/impl/ExecutorEventListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java index b6df2388..d5e1dda9 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java @@ -23,7 +23,7 @@ import java.util.List; public interface EntityEventListener { - default void onEntityEvents(List entityEvents) { + default void onEntityEvents(Class entityClass, List entityEvents) { for (EntityEvent entityEvent : entityEvents) { onEntityEvent(entityEvent); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index c9ec6edc..3f7c1d17 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -121,7 +121,7 @@ public class ExecutorEventListener implements ApplicationListener List entityEvents = newEntityEvents(executorEvent); if (!entityEvents.isEmpty()) { for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityEvents(entityEvents); + entityEventListener.onEntityEvents(entityClass, entityEvents); } } } -- Gitee From 210e923cd379c8e22b5f5ded7342d2e79dd5d65e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 15:02:14 +0800 Subject: [PATCH 22/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/event/impl/EventExecutor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 2188f3f5..84c6678e 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 @@ -42,14 +42,14 @@ public class EventExecutor extends AbstractProxyExecutor { @Override public int execute(Context context, Operation operation) { - int count = super.execute(context, operation); - if (count != 0) { + int totalCount = super.execute(context, operation); + if (totalCount != 0) { ExecutorEvent executorEvent = new ExecutorEvent(this); executorEvent.setContext(context); executorEvent.setOperation(operation); applicationContext.publishEvent(executorEvent); } - return count; + return totalCount; } } -- Gitee From 774fab24de69ab95b1719a983d3b212cb17b6df8 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 15:23:53 +0800 Subject: [PATCH 23/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/event/api/EntityEventListener.java | 4 ++- .../dorive/event/entity/EntityBatchEvent.java | 36 +++++++++++++++++++ .../event/impl/ExecutorEventListener.java | 14 ++++---- 3 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java index d5e1dda9..6fb84bac 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java @@ -17,13 +17,15 @@ package com.gitee.dorive.event.api; +import com.gitee.dorive.event.entity.EntityBatchEvent; import com.gitee.dorive.event.entity.EntityEvent; import java.util.List; public interface EntityEventListener { - default void onEntityEvents(Class entityClass, List entityEvents) { + default void onEntityBatchEvent(EntityBatchEvent entityBatchEvent) { + List entityEvents = entityBatchEvent.getEntityEvents(); for (EntityEvent entityEvent : entityEvents) { onEntityEvent(entityEvent); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java new file mode 100644 index 00000000..897940f9 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.core.api.context.Context; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EntityBatchEvent { + private ExecutorEvent executorEvent; + private Context context; + private OperationType operationType; + private Class entityClass; + private List entityEvents; +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 3f7c1d17..7aea7142 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -26,6 +26,7 @@ import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.entity.EntityBatchEvent; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; import com.gitee.dorive.event.entity.ExecutorEvent; @@ -40,7 +41,6 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.OrderUtils; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -118,16 +118,16 @@ public class ExecutorEventListener implements ApplicationListener Class entityClass = entityEle.getGenericType(); List entityEventListeners = classEntityEventListenersMap.get(entityClass); if (entityEventListeners != null && !entityEventListeners.isEmpty()) { - List entityEvents = newEntityEvents(executorEvent); - if (!entityEvents.isEmpty()) { + EntityBatchEvent entityBatchEvent = newEntityBatchEvent(executorEvent, entityClass); + if (entityBatchEvent != null) { for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityEvents(entityClass, entityEvents); + entityEventListener.onEntityBatchEvent(entityBatchEvent); } } } } - private List newEntityEvents(ExecutorEvent executorEvent) { + private EntityBatchEvent newEntityBatchEvent(ExecutorEvent executorEvent, Class entityClass) { Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); @@ -150,10 +150,10 @@ public class ExecutorEventListener implements ApplicationListener EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); entityEvents.add(entityEvent); } - return entityEvents; + return new EntityBatchEvent(executorEvent, context, operationType, entityClass, entityEvents); } - return Collections.emptyList(); + return null; } } -- Gitee From 4011f3c520b57ad99124f3aff95c724536ac68ee Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 11 Apr 2024 17:43:51 +0800 Subject: [PATCH 24/49] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=95=B4=E7=90=86?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E7=9B=91=E5=90=AC=E5=92=8C=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/api/EntityBatchEventListener.java | 26 ++++ .../dorive/event/api/EntityEventListener.java | 10 -- .../dorive/event/entity/CommonEvent.java | 32 ++++ .../dorive/event/entity/EntityBatchEvent.java | 14 +- .../dorive/event/entity/EntityEvent.java | 12 +- ...dapter.java => EntityListenerAdapter.java} | 32 ++-- .../event/impl/ExecutorEventListener.java | 137 +++++++++++------- 7 files changed, 171 insertions(+), 92 deletions(-) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java rename dorive-event/src/main/java/com/gitee/dorive/event/impl/{EntityEventListenerAdapter.java => EntityListenerAdapter.java} (79%) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java new file mode 100644 index 00000000..33998172 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityBatchEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.EntityBatchEvent; + +public interface EntityBatchEventListener { + + void onEntityBatchEvent(EntityBatchEvent entityBatchEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java index 6fb84bac..fb6116ce 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityEventListener.java @@ -17,20 +17,10 @@ package com.gitee.dorive.event.api; -import com.gitee.dorive.event.entity.EntityBatchEvent; import com.gitee.dorive.event.entity.EntityEvent; -import java.util.List; - public interface EntityEventListener { - default void onEntityBatchEvent(EntityBatchEvent entityBatchEvent) { - List entityEvents = entityBatchEvent.getEntityEvents(); - for (EntityEvent entityEvent : entityEvents) { - onEntityEvent(entityEvent); - } - } - void onEntityEvent(EntityEvent entityEvent); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java new file mode 100644 index 00000000..56120abd --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.core.api.context.Context; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CommonEvent { + private ExecutorEvent executorEvent; + private Context context; + private OperationType operationType; +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java index 897940f9..3f8f2b2f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java @@ -17,20 +17,18 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.core.api.context.Context; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import java.util.List; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor -public class EntityBatchEvent { - private ExecutorEvent executorEvent; - private Context context; - private OperationType operationType; +public class EntityBatchEvent extends CommonEvent { private Class entityClass; - private List entityEvents; + private List entities; } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java index 1c080e1b..93f63480 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java @@ -17,17 +17,15 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.core.api.context.Context; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor -public class EntityEvent { - private ExecutorEvent executorEvent; - private Context context; - private OperationType operationType; +public class EntityEvent extends CommonEvent { private Object entity; } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java similarity index 79% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java rename to dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java index a403fe55..68278b2f 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityEventListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java @@ -18,8 +18,7 @@ package com.gitee.dorive.event.impl; import cn.hutool.core.util.ArrayUtil; -import com.gitee.dorive.event.api.EntityEventListener; -import com.gitee.dorive.event.entity.EntityEvent; +import com.gitee.dorive.event.entity.CommonEvent; import com.gitee.dorive.event.entity.EntityListenerDef; import lombok.AllArgsConstructor; import lombok.Data; @@ -29,32 +28,35 @@ import org.springframework.core.Ordered; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; +import java.util.function.Consumer; + @Data @Slf4j @NoArgsConstructor @AllArgsConstructor -public class EntityEventListenerAdapter implements EntityEventListener { +public class EntityListenerAdapter { private Integer order; private EntityListenerDef entityListenerDef; - private EntityEventListener entityEventListener; + private Object bean; + private Consumer consumer; - @Override - public void onEntityEvent(EntityEvent entityEvent) { - boolean isSubscribe = ArrayUtil.contains(entityListenerDef.getSubscribeTo(), entityEvent.getOperationType()); + public void onCommonEvent(CommonEvent commonEvent) { + boolean isSubscribe = ArrayUtil.contains(entityListenerDef.getSubscribeTo(), commonEvent.getOperationType()); if (isSubscribe) { boolean isTxActive = entityListenerDef.isAfterCommit() && TransactionSynchronizationManager.isActualTransactionActive(); if (!isTxActive) { - handleEntityEvent(entityEvent, true); + handleEntityEvent(commonEvent, true); } else { - handleEntityEventWhenTxActive(entityEvent); + handleEntityEventWhenTxActive(commonEvent); } } } - private void handleEntityEvent(EntityEvent entityEvent, boolean canRollback) { + private void handleEntityEvent(CommonEvent commonEvent, boolean canRollback) { try { - entityEventListener.onEntityEvent(entityEvent); + consumer.accept(commonEvent); + } catch (Throwable throwable) { if (canRollback && matchRollbackFor(throwable)) { throw throwable; @@ -76,9 +78,9 @@ public class EntityEventListenerAdapter implements EntityEventListener { return false; } - private void handleEntityEventWhenTxActive(EntityEvent entityEvent) { + private void handleEntityEventWhenTxActive(CommonEvent commonEvent) { try { - TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(entityEvent)); + TransactionSynchronizationManager.registerSynchronization(new TransactionInvoker(commonEvent)); } catch (Exception e) { log.error("Transaction registration failed: " + e.getMessage(), e); } @@ -90,7 +92,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @AllArgsConstructor private class TransactionInvoker implements TransactionSynchronization, Ordered { - private final EntityEvent entityEvent; + private final CommonEvent commonEvent; @Override public int getOrder() { @@ -99,7 +101,7 @@ public class EntityEventListenerAdapter implements EntityEventListener { @Override public void afterCommit() { - handleEntityEvent(entityEvent, false); + handleEntityEvent(commonEvent, false); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index 7aea7142..cee270c2 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -17,6 +17,7 @@ package com.gitee.dorive.event.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; @@ -25,7 +26,10 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.event.annotation.EntityListener; +import com.gitee.dorive.event.api.EntityBatchEventListener; import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.entity.CommonEvent; import com.gitee.dorive.event.entity.EntityBatchEvent; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; @@ -41,6 +45,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.OrderUtils; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -51,7 +56,7 @@ import static org.springframework.core.Ordered.LOWEST_PRECEDENCE; public class ExecutorEventListener implements ApplicationListener, ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; - private final Map, List> classEntityEventListenersMap = new ConcurrentHashMap<>(); + private final Map, List> classEntityListenerAdaptersMap = new ConcurrentHashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { @@ -60,19 +65,24 @@ public class ExecutorEventListener implements ApplicationListener @Override public void afterPropertiesSet() { - Map entityEventListenerMap = applicationContext.getBeansOfType(EntityEventListener.class); - List entityEventListeners = new ArrayList<>(entityEventListenerMap.values()); - AnnotationAwareOrderComparator.sort(entityEventListeners); - - for (EntityEventListener entityEventListener : entityEventListeners) { - Class listenerType = entityEventListener.getClass(); - Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); - EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); - registry(order, entityListenerDef, entityEventListener); + Map beanMap = applicationContext.getBeansWithAnnotation(EntityListener.class); + List beans = new ArrayList<>(beanMap.values()); + AnnotationAwareOrderComparator.sort(beans); + for (Object bean : beans) { + if (checkBeanType(bean)) { + Class listenerType = bean.getClass(); + Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); + EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); + registry(order, entityListenerDef, bean); + } } } - public void registry(Integer order, EntityListenerDef entityListenerDef, EntityEventListener entityEventListener) { + private boolean checkBeanType(Object bean) { + return bean instanceof EntityBatchEventListener || bean instanceof EntityEventListener; + } + + public void registry(Integer order, EntityListenerDef entityListenerDef, Object bean) { if (entityListenerDef == null) { return; } @@ -80,35 +90,35 @@ public class ExecutorEventListener implements ApplicationListener if (entityClass == null) { return; } - if (entityEventListener instanceof EntityEventListenerAdapter) { - EntityEventListenerAdapter entityEventListenerAdapter = (EntityEventListenerAdapter) entityEventListener; - entityEventListenerAdapter.setOrder(order); - entityEventListenerAdapter.setEntityListenerDef(entityListenerDef); - - } else { - entityEventListener = new EntityEventListenerAdapter(order, entityListenerDef, entityEventListener); + if (bean instanceof EntityBatchEventListener) { + EntityBatchEventListener listener = (EntityBatchEventListener) bean; + EntityListenerAdapter adapter = new EntityListenerAdapter(order, entityListenerDef, bean, event -> + listener.onEntityBatchEvent(newEntityBatchEvent(event))); + List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); + existAdapters.add(adapter); + } + if (bean instanceof EntityEventListener) { + EntityEventListener listener = (EntityEventListener) bean; + EntityListenerAdapter adapter = new EntityListenerAdapter(order, entityListenerDef, bean, event -> { + List entityEvents = newEntityEvents(event); + for (EntityEvent entityEvent : entityEvents) { + listener.onEntityEvent(entityEvent); + } + }); + List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); + existAdapters.add(adapter); } - List existEntityEventListeners = classEntityEventListenersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); - existEntityEventListeners.add(entityEventListener); } - public void cancel(Class entityClass, EntityEventListener entityEventListener) { - List existEntityEventListeners = classEntityEventListenersMap.get(entityClass); - if (existEntityEventListeners == null) { + public void cancel(Class entityClass, Object bean) { + List existAdapters = classEntityListenerAdaptersMap.get(entityClass); + if (existAdapters == null) { return; } - EntityEventListener existEntityEventListener = CollUtil.findOne(existEntityEventListeners, - listener -> entityEventListener == getRealListener(listener)); - if (existEntityEventListener != null) { - existEntityEventListeners.remove(existEntityEventListener); - } - } - - private EntityEventListener getRealListener(EntityEventListener entityEventListener) { - if (entityEventListener instanceof EntityEventListenerAdapter) { - return ((EntityEventListenerAdapter) entityEventListener).getEntityEventListener(); + Collection filterAdapters = CollUtil.filterNew(existAdapters, adapter -> adapter.getBean() == bean); + if (filterAdapters != null && !filterAdapters.isEmpty()) { + existAdapters.removeAll(filterAdapters); } - return entityEventListener; } @Override @@ -116,21 +126,20 @@ public class ExecutorEventListener implements ApplicationListener EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); EntityEle entityEle = eventExecutor.getEntityEle(); Class entityClass = entityEle.getGenericType(); - List entityEventListeners = classEntityEventListenersMap.get(entityClass); - if (entityEventListeners != null && !entityEventListeners.isEmpty()) { - EntityBatchEvent entityBatchEvent = newEntityBatchEvent(executorEvent, entityClass); - if (entityBatchEvent != null) { - for (EntityEventListener entityEventListener : entityEventListeners) { - entityEventListener.onEntityBatchEvent(entityBatchEvent); + List existAdapters = classEntityListenerAdaptersMap.get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = newCommonEvent(executorEvent); + if (commonEvent != null) { + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); } } } } - private EntityBatchEvent newEntityBatchEvent(ExecutorEvent executorEvent, Class entityClass) { + private CommonEvent newCommonEvent(ExecutorEvent executorEvent) { Context context = executorEvent.getContext(); Operation operation = executorEvent.getOperation(); - if (operation instanceof EntityOp) { OperationType operationType = OperationType.UNKNOWN; if (operation instanceof Insert) { @@ -142,18 +151,42 @@ public class ExecutorEventListener implements ApplicationListener } else if (operation instanceof Delete) { operationType = OperationType.DELETE; } - - EntityOp entityOp = (EntityOp) operation; - List entities = entityOp.getEntities(); - List entityEvents = new ArrayList<>(entities.size()); - for (Object entity : entities) { - EntityEvent entityEvent = new EntityEvent(executorEvent, context, operationType, entity); - entityEvents.add(entityEvent); - } - return new EntityBatchEvent(executorEvent, context, operationType, entityClass, entityEvents); + return new CommonEvent(executorEvent, context, operationType); } - return null; } + private EntityBatchEvent newEntityBatchEvent(CommonEvent commonEvent) { + ExecutorEvent executorEvent = commonEvent.getExecutorEvent(); + EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); + Operation operation = executorEvent.getOperation(); + + EntityEle entityEle = eventExecutor.getEntityEle(); + Class entityClass = entityEle.getGenericType(); + + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + + EntityBatchEvent entityBatchEvent = BeanUtil.copyProperties(commonEvent, EntityBatchEvent.class); + entityBatchEvent.setEntityClass(entityClass); + entityBatchEvent.setEntities(entities); + return entityBatchEvent; + } + + private List newEntityEvents(CommonEvent commonEvent) { + ExecutorEvent executorEvent = commonEvent.getExecutorEvent(); + Operation operation = executorEvent.getOperation(); + + EntityOp entityOp = (EntityOp) operation; + List entities = entityOp.getEntities(); + + List entityEvents = new ArrayList<>(entities.size()); + for (Object entity : entities) { + EntityEvent entityEvent = BeanUtil.copyProperties(commonEvent, EntityEvent.class); + entityEvent.setEntity(entity); + entityEvents.add(entityEvent); + } + return entityEvents; + } + } -- Gitee From 4cfb93ecaa8aa6012d93fb886a14e823c9f46a8f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Apr 2024 11:33:05 +0800 Subject: [PATCH 25/49] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/executor/ContextExecutor.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 4b4b330f..f104e15e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -156,29 +156,31 @@ public class ContextExecutor extends AbstractExecutor { public int executeUpdateOrDelete(Context context, EntityOp entityOp) { int totalCount = 0; - if (!entityOp.isIgnoreRoot()) { - CommonRepository repository = this.repository.getRootRepository(); - if (repository.matches(context) || entityOp.isIncludeRoot()) { - totalCount += repository.execute(context, entityOp); - } - } - for (CommonRepository repository : this.repository.getSubRepositories()) { - boolean isMatch = repository.matches(context); - boolean isAggregated = repository.isAggregated(); - if (!isMatch && !isAggregated) { - continue; - } - List rootEntities = entityOp.getEntities(); - for (Object rootEntity : rootEntities) { - PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint.getValue(rootEntity); - if (targetEntity == null) { + for (CommonRepository repository : this.repository.getOrderedRepositories()) { + if (repository.isRoot()) { + if (!entityOp.isIgnoreRoot()) { + if (repository.matches(context) || entityOp.isIncludeRoot()) { + totalCount += repository.execute(context, entityOp); + } + } + } else { + boolean isMatch = repository.matches(context); + boolean isAggregated = repository.isAggregated(); + if (!isMatch && !isAggregated) { continue; } - List entities = CollectionUtils.toList(targetEntity); - Operation operation = entityOp instanceof Update ? new Update(entities) : new Delete(entities); - operation.switchRoot(isMatch); - totalCount += repository.execute(context, operation); + List rootEntities = entityOp.getEntities(); + for (Object rootEntity : rootEntities) { + PropChain anchorPoint = repository.getAnchorPoint(); + Object targetEntity = anchorPoint.getValue(rootEntity); + if (targetEntity == null) { + continue; + } + List entities = CollectionUtils.toList(targetEntity); + Operation operation = entityOp instanceof Update ? new Update(entities) : new Delete(entities); + operation.switchRoot(isMatch); + totalCount += repository.execute(context, operation); + } } } return totalCount; -- Gitee From d13576d98861c4f56bd114968f186f2aa1124613 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Apr 2024 12:27:02 +0800 Subject: [PATCH 26/49] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/event/annotation/EntityListener.java | 8 ++++---- .../java/com/gitee/dorive/event/entity/CommonEvent.java | 1 + .../com/gitee/dorive/event/entity/EntityListenerDef.java | 1 + .../dorive/event/{entity => enums}/OperationType.java | 2 +- .../gitee/dorive/event/impl/ExecutorEventListener.java | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) rename dorive-event/src/main/java/com/gitee/dorive/event/{entity => enums}/OperationType.java (95%) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java index 249fae23..631ff539 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/annotation/EntityListener.java @@ -17,7 +17,7 @@ package com.gitee.dorive.event.annotation; -import com.gitee.dorive.event.entity.OperationType; +import com.gitee.dorive.event.enums.OperationType; import org.springframework.stereotype.Component; import java.lang.annotation.Documented; @@ -27,9 +27,9 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import static com.gitee.dorive.event.entity.OperationType.DELETE; -import static com.gitee.dorive.event.entity.OperationType.INSERT; -import static com.gitee.dorive.event.entity.OperationType.UPDATE; +import static com.gitee.dorive.event.enums.OperationType.DELETE; +import static com.gitee.dorive.event.enums.OperationType.INSERT; +import static com.gitee.dorive.event.enums.OperationType.UPDATE; @Component @Inherited diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java index 56120abd..6e4c17ca 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java @@ -18,6 +18,7 @@ package com.gitee.dorive.event.entity; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.event.enums.OperationType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java index c87d14ca..f4de33f3 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java @@ -19,6 +19,7 @@ package com.gitee.dorive.event.entity; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.event.annotation.EntityListener; +import com.gitee.dorive.event.enums.OperationType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java b/dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java similarity index 95% rename from dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java rename to dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java index 84a694a1..aa71e6d6 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/OperationType.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/enums/OperationType.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.event.entity; +package com.gitee.dorive.event.enums; public enum OperationType { UNKNOWN, diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java index cee270c2..d7a7f469 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java @@ -34,7 +34,7 @@ import com.gitee.dorive.event.entity.EntityBatchEvent; import com.gitee.dorive.event.entity.EntityEvent; import com.gitee.dorive.event.entity.EntityListenerDef; import com.gitee.dorive.event.entity.ExecutorEvent; -import com.gitee.dorive.event.entity.OperationType; +import com.gitee.dorive.event.enums.OperationType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; -- Gitee From 1e8a7da8acd7fa349b2edef8b144d3ae480f5c62 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Apr 2024 16:30:36 +0800 Subject: [PATCH 27/49] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=9C=A8=E8=81=9A?= =?UTF-8?q?=E5=90=88=E6=93=8D=E4=BD=9C=E5=AE=8C=E6=88=90=E5=90=8E=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/api/AggregateEventListener.java | 26 ++++ .../config/DoriveEventConfiguration.java | 14 +- .../{entity => def}/EntityListenerDef.java | 2 +- .../dorive/event/entity/AggregateEvent.java | 36 +++++ .../dorive/event/entity/CommonEvent.java | 51 +++++-- .../dorive/event/entity/EntityBatchEvent.java | 14 +- .../dorive/event/entity/EntityEvent.java | 13 +- .../dorive/event/entity/ExecutorEvent.java | 17 ++- .../dorive/event/entity/RepositoryEvent.java | 39 +++++ .../{impl => executor}/EventExecutor.java | 2 +- .../AbstractEventListener.java} | 137 +++--------------- .../EntityListenerAdapter.java | 4 +- .../listener/ExecutorBatchEventListener.java | 65 +++++++++ .../event/listener/ExecutorEventListener.java | 73 ++++++++++ .../listener/RepositoryEventListener.java | 65 +++++++++ .../repository/AbstractEventRepository.java | 17 ++- 16 files changed, 425 insertions(+), 150 deletions(-) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java rename dorive-event/src/main/java/com/gitee/dorive/event/{entity => def}/EntityListenerDef.java (97%) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java rename dorive-event/src/main/java/com/gitee/dorive/event/{impl => executor}/EventExecutor.java (98%) rename dorive-event/src/main/java/com/gitee/dorive/event/{impl/ExecutorEventListener.java => listener/AbstractEventListener.java} (31%) rename dorive-event/src/main/java/com/gitee/dorive/event/{impl => listener}/EntityListenerAdapter.java (97%) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java new file mode 100644 index 00000000..f265c71c --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.AggregateEvent; + +public interface AggregateEventListener { + + void onAggregateEvent(AggregateEvent aggregateEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java index 722cbf93..93eea3a5 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java @@ -17,7 +17,9 @@ package com.gitee.dorive.event.config; -import com.gitee.dorive.event.impl.ExecutorEventListener; +import com.gitee.dorive.event.listener.ExecutorBatchEventListener; +import com.gitee.dorive.event.listener.ExecutorEventListener; +import com.gitee.dorive.event.listener.RepositoryEventListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -31,4 +33,14 @@ public class DoriveEventConfiguration { return new ExecutorEventListener(); } + @Bean("executorBatchEventListenerV3") + public ExecutorBatchEventListener executorBatchEventListener() { + return new ExecutorBatchEventListener(); + } + + @Bean("repositoryEventListenerV3") + public RepositoryEventListener repositoryEventListener() { + return new RepositoryEventListener(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java similarity index 97% rename from dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java rename to dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java index f4de33f3..323bacbd 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityListenerDef.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/def/EntityListenerDef.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.event.entity; +package com.gitee.dorive.event.def; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.event.annotation.EntityListener; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java new file mode 100644 index 00000000..0b9f8582 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateEvent.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class AggregateEvent extends RepositoryEvent { + + private List entities; + + public AggregateEvent(AbstractEventRepository repository) { + super(repository); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java index 6e4c17ca..653f2ba5 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/CommonEvent.java @@ -18,16 +18,49 @@ package com.gitee.dorive.event.entity; import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.entity.operation.EntityOp; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Delete; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.event.enums.OperationType; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class CommonEvent { - private ExecutorEvent executorEvent; +import lombok.Getter; +import lombok.Setter; +import org.springframework.context.ApplicationEvent; + +import java.util.List; + +@Getter +@Setter +public class CommonEvent extends ApplicationEvent { + private Context context; + private Operation operation; private OperationType operationType; + + public CommonEvent(Object source) { + super(source); + } + + public void setOperation(Operation operation) { + this.operation = operation; + if (operation instanceof EntityOp) { + this.operationType = OperationType.UNKNOWN; + if (operation instanceof Insert) { + this.operationType = OperationType.INSERT; + + } else if (operation instanceof Update) { + this.operationType = OperationType.UPDATE; + + } else if (operation instanceof Delete) { + this.operationType = OperationType.DELETE; + } + } + } + + public List getEntities() { + EntityOp entityOp = (EntityOp) operation; + return entityOp.getEntities(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java index 3f8f2b2f..4e153276 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityBatchEvent.java @@ -17,18 +17,20 @@ package com.gitee.dorive.event.entity; -import lombok.AllArgsConstructor; +import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import java.util.List; @Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -public class EntityBatchEvent extends CommonEvent { - private Class entityClass; +public class EntityBatchEvent extends ExecutorEvent { + private List entities; + + public EntityBatchEvent(EventExecutor eventExecutor) { + super(eventExecutor); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java index 93f63480..24616308 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/EntityEvent.java @@ -17,15 +17,18 @@ package com.gitee.dorive.event.entity; -import lombok.AllArgsConstructor; +import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -public class EntityEvent extends CommonEvent { +public class EntityEvent extends ExecutorEvent { + private Object entity; + + public EntityEvent(EventExecutor eventExecutor) { + super(eventExecutor); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 09185077..9a0da497 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -17,22 +17,23 @@ package com.gitee.dorive.event.entity; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.event.impl.EventExecutor; +import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.event.executor.EventExecutor; import lombok.Getter; import lombok.Setter; -import org.springframework.context.ApplicationEvent; @Getter @Setter -public class ExecutorEvent extends ApplicationEvent { - - private Context context; - private Operation operation; +public class ExecutorEvent extends CommonEvent { public ExecutorEvent(EventExecutor eventExecutor) { super(eventExecutor); } + public Class getEntityClass() { + EventExecutor eventExecutor = (EventExecutor) getSource(); + EntityEle entityEle = eventExecutor.getEntityEle(); + return entityEle.getGenericType(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java new file mode 100644 index 00000000..bceb1182 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RepositoryEvent extends CommonEvent { + + public RepositoryEvent(AbstractEventRepository repository) { + super(repository); + } + + public Class getEntityClass() { + AbstractEventRepository repository = (AbstractEventRepository) getSource(); + EntityEle entityEle = repository.getEntityEle(); + return entityEle.getGenericType(); + } + +} 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/executor/EventExecutor.java similarity index 98% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java rename to dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java index 84c6678e..2c68b996 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.executor; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java similarity index 31% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java rename to dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java index d7a7f469..d1a26fb4 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/ExecutorEventListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/AbstractEventListener.java @@ -15,45 +15,30 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.listener; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import com.gitee.dorive.api.entity.EntityEle; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.eop.Delete; -import com.gitee.dorive.core.entity.operation.eop.Insert; -import com.gitee.dorive.core.entity.operation.eop.Update; -import com.gitee.dorive.event.annotation.EntityListener; -import com.gitee.dorive.event.api.EntityBatchEventListener; -import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; import com.gitee.dorive.event.entity.CommonEvent; -import com.gitee.dorive.event.entity.EntityBatchEvent; -import com.gitee.dorive.event.entity.EntityEvent; -import com.gitee.dorive.event.entity.EntityListenerDef; -import com.gitee.dorive.event.entity.ExecutorEvent; -import com.gitee.dorive.event.enums.OperationType; -import lombok.extern.slf4j.Slf4j; +import lombok.Data; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationListener; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.OrderUtils; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import static org.springframework.core.Ordered.LOWEST_PRECEDENCE; -@Slf4j -public class ExecutorEventListener implements ApplicationListener, ApplicationContextAware, InitializingBean { +@Data +public abstract class AbstractEventListener implements ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; private final Map, List> classEntityListenerAdaptersMap = new ConcurrentHashMap<>(); @@ -65,23 +50,17 @@ public class ExecutorEventListener implements ApplicationListener @Override public void afterPropertiesSet() { - Map beanMap = applicationContext.getBeansWithAnnotation(EntityListener.class); + Map beanMap = applicationContext.getBeansOfType(getBeanType()); List beans = new ArrayList<>(beanMap.values()); AnnotationAwareOrderComparator.sort(beans); for (Object bean : beans) { - if (checkBeanType(bean)) { - Class listenerType = bean.getClass(); - Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); - EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); - registry(order, entityListenerDef, bean); - } + Class listenerType = bean.getClass(); + Integer order = OrderUtils.getOrder(listenerType, LOWEST_PRECEDENCE); + EntityListenerDef entityListenerDef = EntityListenerDef.fromElement(listenerType); + registry(order, entityListenerDef, bean); } } - private boolean checkBeanType(Object bean) { - return bean instanceof EntityBatchEventListener || bean instanceof EntityEventListener; - } - public void registry(Integer order, EntityListenerDef entityListenerDef, Object bean) { if (entityListenerDef == null) { return; @@ -90,24 +69,9 @@ public class ExecutorEventListener implements ApplicationListener if (entityClass == null) { return; } - if (bean instanceof EntityBatchEventListener) { - EntityBatchEventListener listener = (EntityBatchEventListener) bean; - EntityListenerAdapter adapter = new EntityListenerAdapter(order, entityListenerDef, bean, event -> - listener.onEntityBatchEvent(newEntityBatchEvent(event))); - List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); - existAdapters.add(adapter); - } - if (bean instanceof EntityEventListener) { - EntityEventListener listener = (EntityEventListener) bean; - EntityListenerAdapter adapter = new EntityListenerAdapter(order, entityListenerDef, bean, event -> { - List entityEvents = newEntityEvents(event); - for (EntityEvent entityEvent : entityEvents) { - listener.onEntityEvent(entityEvent); - } - }); - List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); - existAdapters.add(adapter); - } + EntityListenerAdapter adapter = newAdapter(order, entityListenerDef, bean); + List existAdapters = classEntityListenerAdaptersMap.computeIfAbsent(entityClass, key -> new ArrayList<>(4)); + existAdapters.add(adapter); } public void cancel(Class entityClass, Object bean) { @@ -115,78 +79,19 @@ public class ExecutorEventListener implements ApplicationListener if (existAdapters == null) { return; } - Collection filterAdapters = CollUtil.filterNew(existAdapters, adapter -> adapter.getBean() == bean); - if (filterAdapters != null && !filterAdapters.isEmpty()) { - existAdapters.removeAll(filterAdapters); - } - } - - @Override - public void onApplicationEvent(ExecutorEvent executorEvent) { - EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); - EntityEle entityEle = eventExecutor.getEntityEle(); - Class entityClass = entityEle.getGenericType(); - List existAdapters = classEntityListenerAdaptersMap.get(entityClass); - if (existAdapters != null && !existAdapters.isEmpty()) { - CommonEvent commonEvent = newCommonEvent(executorEvent); - if (commonEvent != null) { - for (EntityListenerAdapter adapter : existAdapters) { - adapter.onCommonEvent(commonEvent); - } - } - } - } - - private CommonEvent newCommonEvent(ExecutorEvent executorEvent) { - Context context = executorEvent.getContext(); - Operation operation = executorEvent.getOperation(); - if (operation instanceof EntityOp) { - OperationType operationType = OperationType.UNKNOWN; - if (operation instanceof Insert) { - operationType = OperationType.INSERT; - - } else if (operation instanceof Update) { - operationType = OperationType.UPDATE; - - } else if (operation instanceof Delete) { - operationType = OperationType.DELETE; - } - return new CommonEvent(executorEvent, context, operationType); + EntityListenerAdapter adapter = CollUtil.findOne(existAdapters, a -> a.getBean() == bean); + if (adapter != null) { + existAdapters.remove(adapter); } - return null; } - private EntityBatchEvent newEntityBatchEvent(CommonEvent commonEvent) { - ExecutorEvent executorEvent = commonEvent.getExecutorEvent(); - EventExecutor eventExecutor = (EventExecutor) executorEvent.getSource(); - Operation operation = executorEvent.getOperation(); - - EntityEle entityEle = eventExecutor.getEntityEle(); - Class entityClass = entityEle.getGenericType(); - - EntityOp entityOp = (EntityOp) operation; - List entities = entityOp.getEntities(); - - EntityBatchEvent entityBatchEvent = BeanUtil.copyProperties(commonEvent, EntityBatchEvent.class); - entityBatchEvent.setEntityClass(entityClass); - entityBatchEvent.setEntities(entities); - return entityBatchEvent; + public boolean isHandle(CommonEvent commonEvent) { + Operation operation = commonEvent.getOperation(); + return operation instanceof EntityOp; } - private List newEntityEvents(CommonEvent commonEvent) { - ExecutorEvent executorEvent = commonEvent.getExecutorEvent(); - Operation operation = executorEvent.getOperation(); - - EntityOp entityOp = (EntityOp) operation; - List entities = entityOp.getEntities(); + protected abstract Class getBeanType(); - List entityEvents = new ArrayList<>(entities.size()); - for (Object entity : entities) { - EntityEvent entityEvent = BeanUtil.copyProperties(commonEvent, EntityEvent.class); - entityEvent.setEntity(entity); - entityEvents.add(entityEvent); - } - return entityEvents; - } + protected abstract EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java similarity index 97% rename from dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java rename to dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java index 68278b2f..6c4a048a 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/EntityListenerAdapter.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/EntityListenerAdapter.java @@ -15,11 +15,11 @@ * limitations under the License. */ -package com.gitee.dorive.event.impl; +package com.gitee.dorive.event.listener; import cn.hutool.core.util.ArrayUtil; import com.gitee.dorive.event.entity.CommonEvent; -import com.gitee.dorive.event.entity.EntityListenerDef; +import com.gitee.dorive.event.def.EntityListenerDef; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java new file mode 100644 index 00000000..cd1729bc --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorBatchEventListener.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.EntityBatchEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.EntityBatchEvent; +import com.gitee.dorive.event.entity.ExecutorEvent; +import com.gitee.dorive.event.executor.EventExecutor; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class ExecutorBatchEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return EntityBatchEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + EntityBatchEventListener listener = (EntityBatchEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onEntityBatchEvent((EntityBatchEvent) event)); + } + + @Override + public void onApplicationEvent(ExecutorEvent executorEvent) { + if (isHandle(executorEvent)) { + Class entityClass = executorEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(executorEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + private CommonEvent convert(ExecutorEvent executorEvent) { + EntityBatchEvent entityBatchEvent = new EntityBatchEvent((EventExecutor) executorEvent.getSource()); + BeanUtil.copyProperties(executorEvent, entityBatchEvent); + entityBatchEvent.setEntities(executorEvent.getEntities()); + return entityBatchEvent; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java new file mode 100644 index 00000000..73796c49 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/ExecutorEventListener.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.EntityEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.EntityEvent; +import com.gitee.dorive.event.entity.ExecutorEvent; +import com.gitee.dorive.event.executor.EventExecutor; +import org.springframework.context.ApplicationListener; + +import java.util.ArrayList; +import java.util.List; + +public class ExecutorEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return EntityEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + EntityEventListener listener = (EntityEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onEntityEvent((EntityEvent) event)); + } + + @Override + public void onApplicationEvent(ExecutorEvent executorEvent) { + if (isHandle(executorEvent)) { + Class entityClass = executorEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + List commonEvents = convert(executorEvent); + for (EntityListenerAdapter adapter : existAdapters) { + for (CommonEvent commonEvent : commonEvents) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + } + + private List convert(ExecutorEvent executorEvent) { + List entities = executorEvent.getEntities(); + List commonEvents = new ArrayList<>(entities.size()); + for (Object entity : entities) { + EntityEvent entityEvent = new EntityEvent((EventExecutor) executorEvent.getSource()); + BeanUtil.copyProperties(executorEvent, entityEvent); + entityEvent.setEntity(entity); + commonEvents.add(entityEvent); + } + return commonEvents; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java new file mode 100644 index 00000000..f1f9dcdd --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryEventListener.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.event.api.AggregateEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.AggregateEvent; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class RepositoryEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return AggregateEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + AggregateEventListener listener = (AggregateEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onAggregateEvent((AggregateEvent) event)); + } + + @Override + public void onApplicationEvent(RepositoryEvent repositoryEvent) { + if (isHandle(repositoryEvent)) { + Class entityClass = repositoryEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(repositoryEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + private CommonEvent convert(RepositoryEvent repositoryEvent) { + AggregateEvent aggregateEvent = new AggregateEvent((AbstractEventRepository) repositoryEvent.getSource()); + BeanUtil.copyProperties(repositoryEvent, aggregateEvent); + aggregateEvent.setEntities(repositoryEvent.getEntities()); + return aggregateEvent; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java index d8935998..af4e6b07 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -18,13 +18,16 @@ package com.gitee.dorive.event.repository; import com.gitee.dorive.api.entity.EntityEle; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.repository.AbstractGenericRepository; import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.DefaultRepository; import com.gitee.dorive.event.annotation.EnableEvent; -import com.gitee.dorive.event.impl.EventExecutor; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.executor.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; public abstract class AbstractEventRepository extends AbstractGenericRepository { @@ -56,4 +59,16 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo return repository; } + @Override + public int execute(Context context, Operation operation) { + int totalCount = super.execute(context, operation); + if (enableEvent && totalCount != 0) { + RepositoryEvent repositoryEvent = new RepositoryEvent(this); + repositoryEvent.setContext(context); + repositoryEvent.setOperation(operation); + getApplicationContext().publishEvent(repositoryEvent); + } + return totalCount; + } + } -- Gitee From d7900382839447fc78f67e932747515b6f206f8c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Apr 2024 17:18:34 +0800 Subject: [PATCH 28/49] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=87=BA=E7=8E=B0=E6=A0=88=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/event/executor/EventExecutor.java | 8 ++++---- .../mybatis/plus/repository/MybatisPlusRepository.java | 8 ++++---- .../dorive/query/repository/AbstractQueryRepository.java | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java index 2c68b996..e04bdada 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/executor/EventExecutor.java @@ -23,12 +23,12 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.impl.executor.AbstractProxyExecutor; import com.gitee.dorive.event.entity.ExecutorEvent; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.springframework.context.ApplicationContext; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class EventExecutor extends AbstractProxyExecutor { private ApplicationContext applicationContext; diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index 94d2bce6..ed38d9ff 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -40,8 +40,8 @@ import com.gitee.dorive.sql.entity.common.CountQuery; import com.gitee.dorive.sql.impl.count.DefaultCountQuerier; import com.gitee.dorive.sql.impl.executor.SqlQueryExecutor; import com.gitee.dorive.sql.impl.executor.UnionExecutor; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.ParameterizedType; @@ -51,8 +51,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public class MybatisPlusRepository extends AbstractRefRepository implements CountQuerier { private SqlRunner sqlRunner; diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java index ea1784a8..f598e634 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/repository/AbstractQueryRepository.java @@ -36,8 +36,8 @@ import com.gitee.dorive.query.impl.executor.StepwiseQueryExecutor; import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; import com.gitee.dorive.query.impl.resolver.QueryResolver; import com.gitee.dorive.query.impl.resolver.QueryTypeResolver; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotatedElementUtils; @@ -45,8 +45,8 @@ import org.springframework.core.annotation.AnnotatedElementUtils; import java.util.List; import java.util.Map; -@Data -@EqualsAndHashCode(callSuper = false) +@Getter +@Setter public abstract class AbstractQueryRepository extends AbstractEventRepository implements QueryRepository, QueryExecutor { private QueryScanDef queryScanDef; -- Gitee From 9f226c420b0b23849be1a8a966a0e92e62178e42 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 12 Apr 2024 17:36:45 +0800 Subject: [PATCH 29/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=85=B3=E9=94=AE=E5=AD=97=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/plus/repository/MybatisPlusRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index ed38d9ff..c0748772 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -97,13 +97,13 @@ public class MybatisPlusRepository extends AbstractRefRepository i private EntityStoreInfo newEntityStoreInfo(Class mapperClass, Object mapper, Class pojoClass, TableInfo tableInfo) { String tableName = tableInfo.getTableName(); String keyProperty = tableInfo.getKeyProperty(); - String keyColumn = tableInfo.getKeyColumn(); + String keyColumn = clearColumn(tableInfo.getKeyColumn()); List tableFieldInfos = tableInfo.getFieldList(); int size = tableFieldInfos.size() + 1; Map propAliasMappingWithoutPk = new LinkedHashMap<>(size * 4 / 3 + 1); for (TableFieldInfo tableFieldInfo : tableFieldInfos) { - propAliasMappingWithoutPk.put(tableFieldInfo.getProperty(), tableFieldInfo.getColumn()); + propAliasMappingWithoutPk.put(tableFieldInfo.getProperty(), clearColumn(tableFieldInfo.getColumn())); } Map propAliasMapping = new LinkedHashMap<>(size * 4 / 3 + 1); @@ -119,6 +119,10 @@ public class MybatisPlusRepository extends AbstractRefRepository i tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, selectColumns); } + private String clearColumn(String column) { + return StrUtil.removeAll(column, "`").trim(); + } + @Override protected Executor newExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { Executor executor = new MybatisPlusExecutor(entityDef, entityEle, entityStoreInfo); -- Gitee From 8445ee054069996f1977d23d3b3499b21a92f5a2 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 12 Apr 2024 22:56:11 +0800 Subject: [PATCH 30/49] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=81=9A=E5=90=88?= =?UTF-8?q?=E6=A0=B9=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/entity/enums/RootControl.java | 2 +- .../core/entity/operation/Operation.java | 6 +- .../event/api/AggregateRootEventListener.java | 26 +++++++ .../config/DoriveEventConfiguration.java | 6 ++ .../event/entity/AggregateRootEvent.java | 32 +++++++++ .../listener/RepositoryRootEventListener.java | 72 +++++++++++++++++++ 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java create mode 100644 dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java index de283018..a4cf1a4b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/RootControl.java @@ -18,7 +18,7 @@ package com.gitee.dorive.core.entity.enums; public enum RootControl { - NONE, + UNCONTROLLED, INCLUDE_ROOT, IGNORE_ROOT } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index 3c921259..44fc82e6 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -26,7 +26,7 @@ import lombok.Data; @Data public class Operation { - private RootControl rootControl = RootControl.NONE; + private RootControl rootControl = RootControl.UNCONTROLLED; public void includeRoot() { rootControl = RootControl.INCLUDE_ROOT; @@ -36,6 +36,10 @@ public class Operation { rootControl = RootControl.IGNORE_ROOT; } + public boolean isUncontrolled() { + return rootControl == RootControl.UNCONTROLLED; + } + public boolean isIncludeRoot() { return rootControl == RootControl.INCLUDE_ROOT; } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java new file mode 100644 index 00000000..dd76ee6b --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/AggregateRootEventListener.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.api; + +import com.gitee.dorive.event.entity.AggregateRootEvent; + +public interface AggregateRootEventListener { + + void onAggregateRootEvent(AggregateRootEvent aggregateRootEvent); + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java index 93eea3a5..61480008 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/config/DoriveEventConfiguration.java @@ -20,6 +20,7 @@ package com.gitee.dorive.event.config; import com.gitee.dorive.event.listener.ExecutorBatchEventListener; import com.gitee.dorive.event.listener.ExecutorEventListener; import com.gitee.dorive.event.listener.RepositoryEventListener; +import com.gitee.dorive.event.listener.RepositoryRootEventListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -43,4 +44,9 @@ public class DoriveEventConfiguration { return new RepositoryEventListener(); } + @Bean("repositoryRootEventListenerV3") + public RepositoryRootEventListener repositoryRootEventListener() { + return new RepositoryRootEventListener(); + } + } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java new file mode 100644 index 00000000..89421f70 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/AggregateRootEvent.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.entity; + +import com.gitee.dorive.event.repository.AbstractEventRepository; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AggregateRootEvent extends AggregateEvent { + + public AggregateRootEvent(AbstractEventRepository repository) { + super(repository); + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java new file mode 100644 index 00000000..d29e2323 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/listener/RepositoryRootEventListener.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.listener; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.event.api.AggregateRootEventListener; +import com.gitee.dorive.event.def.EntityListenerDef; +import com.gitee.dorive.event.entity.AggregateRootEvent; +import com.gitee.dorive.event.entity.CommonEvent; +import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.repository.AbstractEventRepository; +import org.springframework.context.ApplicationListener; + +import java.util.List; + +public class RepositoryRootEventListener extends AbstractEventListener implements ApplicationListener { + + @Override + protected Class getBeanType() { + return AggregateRootEventListener.class; + } + + @Override + protected EntityListenerAdapter newAdapter(Integer order, EntityListenerDef entityListenerDef, Object bean) { + AggregateRootEventListener listener = (AggregateRootEventListener) bean; + return new EntityListenerAdapter(order, entityListenerDef, bean, event -> listener.onAggregateRootEvent((AggregateRootEvent) event)); + } + + @Override + public void onApplicationEvent(RepositoryEvent repositoryEvent) { + if (isHandle(repositoryEvent)) { + Class entityClass = repositoryEvent.getEntityClass(); + List existAdapters = getClassEntityListenerAdaptersMap().get(entityClass); + if (existAdapters != null && !existAdapters.isEmpty()) { + CommonEvent commonEvent = convert(repositoryEvent); + for (EntityListenerAdapter adapter : existAdapters) { + adapter.onCommonEvent(commonEvent); + } + } + } + } + + @Override + public boolean isHandle(CommonEvent commonEvent) { + Operation operation = commonEvent.getOperation(); + return super.isHandle(commonEvent) && operation.isUncontrolled(); + } + + private CommonEvent convert(RepositoryEvent repositoryEvent) { + AggregateRootEvent aggregateRootEvent = new AggregateRootEvent((AbstractEventRepository) repositoryEvent.getSource()); + BeanUtil.copyProperties(repositoryEvent, aggregateRootEvent); + aggregateRootEvent.setEntities(repositoryEvent.getEntities()); + return aggregateRootEvent; + } + +} -- Gitee From 335bdfaad159cbc1d34a383cdc5122f0ff9c77a4 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 12 Apr 2024 23:32:50 +0800 Subject: [PATCH 31/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/core/impl/executor/ContextExecutor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index f104e15e..c4a014cf 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -146,7 +146,7 @@ public class ContextExecutor extends AbstractExecutor { operation.switchRoot(isMatch); totalCount += repository.execute(context, operation); if (entities.size() == 1) { - repository.setBoundId(context, rootEntity, entities.iterator().next()); + repository.setBoundId(context, rootEntity, entities.get(0)); } } } @@ -216,7 +216,7 @@ public class ContextExecutor extends AbstractExecutor { operation.switchRoot(isMatch); totalCount += repository.execute(context, operation); if (entities.size() == 1) { - repository.setBoundId(context, rootEntity, entities.iterator().next()); + repository.setBoundId(context, rootEntity, entities.get(0)); } } } -- Gitee From 1edc7fb7bbce704d948ba6cb0e1b9c587d493ba3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sun, 14 Apr 2024 00:11:03 +0800 Subject: [PATCH 32/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=81=9A=E5=90=88?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/operation/eop/InsertOrUpdate.java | 3 ++ .../core/impl/executor/ContextExecutor.java | 7 ++-- .../core/impl/factory/OperationFactory.java | 33 ++++++++++++++++++- .../repository/AbstractGenericRepository.java | 5 +-- .../core/repository/CommonRepository.java | 24 ++++---------- .../repository/AbstractEventRepository.java | 27 ++++++++++++--- 6 files changed, 73 insertions(+), 26 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java index cd420bee..80030348 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java @@ -27,6 +27,9 @@ import java.util.List; @Setter public class InsertOrUpdate extends EntityOp { + private Insert insert; + private Update update; + public InsertOrUpdate(List entities) { super(entities); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index c4a014cf..59c67158 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -30,6 +30,7 @@ import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.DerivedResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -109,7 +110,8 @@ public class ContextExecutor extends AbstractExecutor { totalCount += contextExecutor.executeUpdateOrDelete(context, delete); } else if (operation instanceof InsertOrUpdate) { - InsertOrUpdate insertOrUpdate = new InsertOrUpdate(pair.getValue()); + OperationFactory operationFactory = repository.getOperationFactory(); + InsertOrUpdate insertOrUpdate = operationFactory.buildInsertOrUpdate(pair.getValue()); totalCount += contextExecutor.executeInsertOrUpdate(context, insertOrUpdate); } } @@ -212,7 +214,8 @@ public class ContextExecutor extends AbstractExecutor { if (isMatch) { repository.getBoundValue(context, rootEntity, entities); } - Operation operation = new InsertOrUpdate(entities); + OperationFactory operationFactory = repository.getOperationFactory(); + Operation operation = operationFactory.buildInsertOrUpdate(entities); operation.switchRoot(isMatch); totalCount += repository.execute(context, operation); if (entities.size() == 1) { 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 1c3fef36..01c3b233 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 @@ -30,7 +30,9 @@ import com.gitee.dorive.core.entity.operation.eop.Update; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; @Data @AllArgsConstructor @@ -59,7 +61,36 @@ public class OperationFactory { } public Operation buildInsertOrUpdate(Object entity) { - return new InsertOrUpdate(Collections.singletonList(entity)); + List entities = Collections.singletonList(entity); + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); + Object primaryKey = entityEle.getIdProxy().getValue(entity); + if (primaryKey == null) { + insertOrUpdate.setInsert(new Insert(entities)); + } else { + insertOrUpdate.setUpdate(new Update(entities)); + } + return insertOrUpdate; + } + + public InsertOrUpdate buildInsertOrUpdate(List entities) { + InsertOrUpdate insertOrUpdate = new InsertOrUpdate(entities); + List insertList = new ArrayList<>(entities.size()); + List updateList = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object primaryKey = entityEle.getIdProxy().getValue(entity); + if (primaryKey == null) { + insertList.add(entity); + } else { + updateList.add(entity); + } + } + if (!insertList.isEmpty()) { + insertOrUpdate.setInsert(new Insert(insertList)); + } + if (!updateList.isEmpty()) { + insertOrUpdate.setUpdate(new Update(updateList)); + } + return insertOrUpdate; } public Operation buildDelete(Object entity) { 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 6a47ce6e..7dbbfa90 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 @@ -25,8 +25,8 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; -import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; +import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.util.ExampleUtils; import java.util.List; @@ -89,7 +89,8 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertOrUpdateList(Options options, List entities) { Assert.notEmpty(entities, "The entities cannot be empty!"); - Operation operation = new InsertOrUpdate(entities); + OperationFactory operationFactory = getOperationFactory(); + Operation operation = operationFactory.buildInsertOrUpdate(entities); return execute((Context) options, operation); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index fe6e0edd..3cf09665 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -23,6 +23,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Matcher; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -32,14 +33,12 @@ import com.gitee.dorive.core.entity.operation.cop.Query; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; import com.gitee.dorive.core.entity.operation.eop.Update; -import com.gitee.dorive.core.entity.enums.JoinType; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.util.ExampleUtils; import lombok.Getter; import lombok.Setter; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -116,23 +115,14 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher public int execute(Context context, Operation operation) { if (!isAggregated() && operation instanceof InsertOrUpdate) { InsertOrUpdate insertOrUpdate = (InsertOrUpdate) operation; - List entities = insertOrUpdate.getEntities(); - List insertList = new ArrayList<>(entities.size()); - List updateList = new ArrayList<>(entities.size()); - for (Object entity : entities) { - Object primaryKey = getPrimaryKey(entity); - if (primaryKey == null) { - insertList.add(entity); - } else { - updateList.add(entity); - } - } + Insert insert = insertOrUpdate.getInsert(); + Update update = insertOrUpdate.getUpdate(); int totalCount = 0; - if (!insertList.isEmpty()) { - totalCount += super.execute(context, new Insert(insertList)); + if (insert != null) { + totalCount += super.execute(context, insert); } - if (!updateList.isEmpty()) { - totalCount += super.execute(context, new Update(updateList)); + if (update != null) { + totalCount += super.execute(context, update); } return totalCount; } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java index af4e6b07..5d76d38e 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -21,6 +21,9 @@ import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.eop.Insert; +import com.gitee.dorive.core.entity.operation.eop.InsertOrUpdate; +import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.repository.AbstractGenericRepository; import com.gitee.dorive.core.repository.AbstractProxyRepository; import com.gitee.dorive.core.repository.AbstractRepository; @@ -63,12 +66,28 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo public int execute(Context context, Operation operation) { int totalCount = super.execute(context, operation); if (enableEvent && totalCount != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setContext(context); - repositoryEvent.setOperation(operation); - getApplicationContext().publishEvent(repositoryEvent); + if (operation instanceof InsertOrUpdate) { + InsertOrUpdate insertOrUpdate = (InsertOrUpdate) operation; + Insert insert = insertOrUpdate.getInsert(); + Update update = insertOrUpdate.getUpdate(); + if (insert != null) { + publishEvent(context, insert); + } + if (update != null) { + publishEvent(context, update); + } + } else { + publishEvent(context, operation); + } } return totalCount; } + private void publishEvent(Context context, Operation operation) { + RepositoryEvent repositoryEvent = new RepositoryEvent(this); + repositoryEvent.setContext(context); + repositoryEvent.setOperation(operation); + getApplicationContext().publishEvent(repositoryEvent); + } + } -- Gitee From f36f1edb3f7aa9c2c73a2499de748da978cc07fe Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sun, 14 Apr 2024 11:13:47 +0800 Subject: [PATCH 33/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/operation/Operation.java | 18 +++++------------- .../entity/operation/eop/InsertOrUpdate.java | 11 +++++++++++ .../core/impl/executor/ContextExecutor.java | 6 +++--- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index 44fc82e6..c153db5a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java @@ -29,11 +29,11 @@ public class Operation { private RootControl rootControl = RootControl.UNCONTROLLED; public void includeRoot() { - rootControl = RootControl.INCLUDE_ROOT; + this.rootControl = RootControl.INCLUDE_ROOT; } - public void ignoreRoot() { - rootControl = RootControl.IGNORE_ROOT; + public void switchRoot(boolean flag) { + this.rootControl = flag ? RootControl.INCLUDE_ROOT : RootControl.IGNORE_ROOT; } public boolean isUncontrolled() { @@ -44,16 +44,8 @@ public class Operation { return rootControl == RootControl.INCLUDE_ROOT; } - public boolean isIgnoreRoot() { - return rootControl == RootControl.IGNORE_ROOT; - } - - public void switchRoot(boolean flag) { - if (flag) { - includeRoot(); - } else { - ignoreRoot(); - } + public boolean isNotIgnoreRoot() { + return rootControl != RootControl.IGNORE_ROOT; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java index 80030348..b6e8bcc2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/eop/InsertOrUpdate.java @@ -34,4 +34,15 @@ public class InsertOrUpdate extends EntityOp { super(entities); } + @Override + public void switchRoot(boolean flag) { + super.switchRoot(flag); + if (insert != null) { + insert.switchRoot(flag); + } + if (update != null) { + update.switchRoot(flag); + } + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java index 59c67158..23830d4f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ContextExecutor.java @@ -122,7 +122,7 @@ public class ContextExecutor extends AbstractExecutor { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { - if (!insert.isIgnoreRoot()) { + if (insert.isNotIgnoreRoot()) { if (repository.matches(context) || insert.isIncludeRoot()) { totalCount += repository.execute(context, insert); } @@ -160,7 +160,7 @@ public class ContextExecutor extends AbstractExecutor { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { - if (!entityOp.isIgnoreRoot()) { + if (entityOp.isNotIgnoreRoot()) { if (repository.matches(context) || entityOp.isIncludeRoot()) { totalCount += repository.execute(context, entityOp); } @@ -192,7 +192,7 @@ public class ContextExecutor extends AbstractExecutor { int totalCount = 0; for (CommonRepository repository : this.repository.getOrderedRepositories()) { if (repository.isRoot()) { - if (!insertOrUpdate.isIgnoreRoot()) { + if (insertOrUpdate.isNotIgnoreRoot()) { if (repository.matches(context) || insertOrUpdate.isIncludeRoot()) { totalCount += repository.execute(context, insertOrUpdate); } -- Gitee From 0d5d50383c416e8607c2946e1608837c47502e5a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Apr 2024 13:07:25 +0800 Subject: [PATCH 34/49] =?UTF-8?q?=E5=BA=95=E5=B1=82=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/context/Options.java | 4 +-- .../core/entity/context/AbstractContext.java | 7 +++-- .../core/entity/context/EnumOptions.java | 7 +++-- .../core/impl/context/AbstractSelector.java | 7 +++-- .../core/impl/context/SelectTypeMatcher.java | 4 +-- .../core/repository/CommonRepository.java | 2 +- .../mybatis/plus/api/EasyBaseMapper.java | 28 +++++++++++++++++++ .../plus/config/MybatisPlusConfiguration.java | 17 ++++++++--- .../mybatis/plus/enums/InsertMethod.java | 22 +++++++++++++++ .../MybatisPlusExecutor.java | 19 +++++++++++-- .../plus/injector/EasySqlInjector.java | 20 +++++++++++++ .../repository/MybatisPlusRepository.java | 4 +-- 12 files changed, 118 insertions(+), 23 deletions(-) create mode 100644 dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java create mode 100644 dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java rename dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/{impl => executor}/MybatisPlusExecutor.java (91%) create mode 100644 dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java index 2cd88402..87fb517b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/context/Options.java @@ -29,9 +29,9 @@ public interface Options { Map, Object> getOptions(); - void setOption(Class type, Object value); + void setOption(Class type, T value); - Object getOption(Class type); + T getOption(Class type); void removeOption(Class type); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java index 82f782a4..9f9e444d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/AbstractContext.java @@ -47,13 +47,14 @@ public abstract class AbstractContext extends LinkedHashMap impl } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { options.put(type, value); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java index 205c5001..d27af132 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/EnumOptions.java @@ -36,13 +36,14 @@ public class EnumOptions implements Options { } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { throw new UnsupportedOperationException(); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java index e4e6eae6..9b6bff63 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/AbstractSelector.java @@ -38,13 +38,14 @@ public abstract class AbstractSelector implements Selector { } @Override - public void setOption(Class type, Object value) { + public void setOption(Class type, T value) { throw new UnsupportedOperationException(); } @Override - public Object getOption(Class type) { - return options.get(type); + @SuppressWarnings("unchecked") + public T getOption(Class type) { + return (T) options.get(type); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java index d19e0885..cd22d00c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/context/SelectTypeMatcher.java @@ -49,7 +49,7 @@ public class SelectTypeMatcher implements Matcher { @Override public boolean matches(Options options) { - SelectType selectType = (SelectType) options.getOption(SelectType.class); + SelectType selectType = options.getOption(SelectType.class); if (selectType != null) { Matcher matcher = matcherMap.get(selectType); if (matcher != null) { @@ -62,7 +62,7 @@ public class SelectTypeMatcher implements Matcher { private class SelectorMatcher implements Matcher { @Override public boolean matches(Options options) { - Selector selector = (Selector) options.getOption(Selector.class); + Selector selector = options.getOption(Selector.class); if (selector != null) { Set names = selector.getNames(); String name = repository.getName(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java index 3cf09665..81260c3e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/CommonRepository.java @@ -86,7 +86,7 @@ public class CommonRepository extends AbstractProxyRepository implements Matcher @Override public Result executeQuery(Context context, Query query) { - Selector selector = (Selector) context.getOption(Selector.class); + Selector selector = context.getOption(Selector.class); if (selector != null) { List properties = selector.select(getName()); if (properties != null && !properties.isEmpty()) { diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java new file mode 100644 index 00000000..7e9db1e3 --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/api/EasyBaseMapper.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.mybatis.plus.api; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.Collection; + +public interface EasyBaseMapper extends BaseMapper { + + Integer insertBatchSomeColumn(Collection entityList); + +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java index 43f64b04..43e23e94 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/config/MybatisPlusConfiguration.java @@ -23,16 +23,18 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept import com.gitee.dorive.env.annotation.Key; import com.gitee.dorive.env.annotation.Value; import com.gitee.dorive.env.spring.DynamicConfiguration; -import lombok.Data; -import lombok.EqualsAndHashCode; +import com.gitee.dorive.mybatis.plus.injector.EasySqlInjector; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -@Data +@Getter +@Setter @Order(-100) @Configuration -@EqualsAndHashCode(callSuper = false) public class MybatisPlusConfiguration extends DynamicConfiguration { @Key("mybatis-plus.global-config.enable-sql-runner") @@ -40,10 +42,17 @@ public class MybatisPlusConfiguration extends DynamicConfiguration { private Boolean enableSqlRunner; @Bean + @ConditionalOnMissingBean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } + @Bean + @ConditionalOnMissingBean + public EasySqlInjector easySqlInjector() { + return new EasySqlInjector(); + } + } diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java new file mode 100644 index 00000000..e1a8ca62 --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/enums/InsertMethod.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.mybatis.plus.enums; + +public enum InsertMethod { + BATCH +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java similarity index 91% rename from dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java rename to dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java index 3dd19d43..c0a017c3 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/impl/MybatisPlusExecutor.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/executor/MybatisPlusExecutor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.mybatis.plus.impl; +package com.gitee.dorive.mybatis.plus.executor; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -41,12 +41,16 @@ import com.gitee.dorive.core.entity.operation.eop.Delete; import com.gitee.dorive.core.entity.operation.eop.Insert; import com.gitee.dorive.core.entity.operation.eop.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; +import com.gitee.dorive.mybatis.plus.api.EasyBaseMapper; +import com.gitee.dorive.mybatis.plus.enums.InsertMethod; +import com.gitee.dorive.mybatis.plus.impl.AppenderContext; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -62,6 +66,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { private EntityStoreInfo entityStoreInfo; private BaseMapper baseMapper; private Class pojoClass; + private boolean canInsertBatch; @SuppressWarnings("unchecked") public MybatisPlusExecutor(EntityDef entityDef, EntityEle entityEle, EntityStoreInfo entityStoreInfo) { @@ -70,6 +75,7 @@ public class MybatisPlusExecutor extends AbstractExecutor { this.entityStoreInfo = entityStoreInfo; this.baseMapper = (BaseMapper) entityStoreInfo.getMapper(); this.pojoClass = (Class) entityStoreInfo.getPojoClass(); + this.canInsertBatch = baseMapper instanceof EasyBaseMapper; } @Override @@ -144,14 +150,21 @@ public class MybatisPlusExecutor extends AbstractExecutor { } @Override + @SuppressWarnings("unchecked") public int execute(Context context, Operation operation) { int totalCount = 0; if (operation instanceof EntityOp) { EntityOp entityOp = (EntityOp) operation; List persistentObjs = entityOp.getEntities(); if (entityOp instanceof Insert) { - for (Object persistent : persistentObjs) { - totalCount += baseMapper.insert(persistent); + InsertMethod insertMethod = context.getOption(InsertMethod.class); + boolean isBatch = insertMethod == null ? persistentObjs.size() >= 100 : insertMethod == InsertMethod.BATCH; + if (canInsertBatch && isBatch) { + totalCount += ((EasyBaseMapper) baseMapper).insertBatchSomeColumn((Collection) persistentObjs); + } else { + for (Object persistent : persistentObjs) { + totalCount += baseMapper.insert(persistent); + } } } else if (operation instanceof Update) { diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java new file mode 100644 index 00000000..20b3b9bf --- /dev/null +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/injector/EasySqlInjector.java @@ -0,0 +1,20 @@ +package com.gitee.dorive.mybatis.plus.injector; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; + +import java.util.List; + +public class EasySqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); + return methodList; + } + +} diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index c0748772..f7825494 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -29,7 +29,7 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.QueryMethod; -import com.gitee.dorive.mybatis.plus.impl.MybatisPlusExecutor; +import com.gitee.dorive.mybatis.plus.executor.MybatisPlusExecutor; import com.gitee.dorive.query.api.QueryExecutor; import com.gitee.dorive.query.entity.QueryContext; import com.gitee.dorive.query.entity.QueryWrapper; @@ -132,7 +132,7 @@ public class MybatisPlusRepository extends AbstractRefRepository i @Override protected QueryExecutor adaptiveQueryExecutor(QueryContext queryContext, QueryWrapper queryWrapper) { Context context = queryContext.getContext(); - QueryMethod queryMethod = (QueryMethod) context.getOption(QueryMethod.class); + QueryMethod queryMethod = context.getOption(QueryMethod.class); if (queryMethod == null || queryMethod == QueryMethod.SQL) { return sqlQueryExecutor; } -- Gitee From fde40cb8ba8f3ced0a85f766cf415e589bcdd66e Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Apr 2024 14:40:19 +0800 Subject: [PATCH 35/49] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/{converter => factory}/Converter.java | 2 +- .../core/api/{converter => factory}/EntityFactory.java | 2 +- .../core/api/{converter => factory}/EntityMapper.java | 2 +- .../gitee/dorive/core/impl/executor/ExampleExecutor.java | 2 +- .../gitee/dorive/core/impl/executor/FactoryExecutor.java | 2 +- .../impl/{converter => factory}/DefaultConverter.java | 4 ++-- .../impl/{converter => factory}/DefaultEntityFactory.java | 6 +++--- .../impl/{converter => factory}/DefaultEntityMapper.java | 6 +++--- .../dorive/core/impl/resolver/EntityMapperResolver.java | 8 ++++---- .../dorive/core/repository/AbstractContextRepository.java | 6 +++--- 10 files changed, 20 insertions(+), 20 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{converter => factory}/Converter.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{converter => factory}/EntityFactory.java (95%) rename dorive-core/src/main/java/com/gitee/dorive/core/api/{converter => factory}/EntityMapper.java (96%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{converter => factory}/DefaultConverter.java (96%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{converter => factory}/DefaultEntityFactory.java (94%) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{converter => factory}/DefaultEntityMapper.java (95%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java index 6f85ca0b..d539e91e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/Converter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/Converter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; public interface Converter { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java index 465ed494..3b93dc9b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; import com.gitee.dorive.core.api.context.Context; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 79799913..06717a03 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/converter/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.gitee.dorive.core.api.converter; +package com.gitee.dorive.core.api.factory; public interface EntityMapper { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index efa90a41..b61e7973 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.executor; import com.gitee.dorive.api.constant.Operator; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index b40ad645..3a2788ce 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -20,7 +20,7 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Example; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java similarity index 96% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java index 666807e2..a7a0e1be 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.factory; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.def.FieldDef; import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.core.api.converter.Converter; +import com.gitee.dorive.core.api.factory.Converter; import lombok.Data; import org.apache.commons.lang3.StringUtils; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java similarity index 94% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index baf37f87..f7af0589 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.converter.EntityFactory; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java similarity index 95% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java index a453e573..2b6b5519 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/DefaultEntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java @@ -15,10 +15,10 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.converter; +package com.gitee.dorive.core.impl.factory; -import com.gitee.dorive.core.api.converter.Converter; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.factory.EntityMapper; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 96754476..6a9c4bf4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -21,11 +21,11 @@ import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.api.def.FieldDef; import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.api.entity.EntityField; -import com.gitee.dorive.core.api.converter.Converter; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.Converter; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.impl.converter.DefaultConverter; -import com.gitee.dorive.core.impl.converter.DefaultEntityMapper; +import com.gitee.dorive.core.impl.factory.DefaultConverter; +import com.gitee.dorive.core.impl.factory.DefaultEntityMapper; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.commons.lang3.StringUtils; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index e5d66442..7de313ef 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -28,15 +28,15 @@ import com.gitee.dorive.api.entity.EntityType; import com.gitee.dorive.api.entity.PropChain; import com.gitee.dorive.api.resolver.PropChainResolver; import com.gitee.dorive.api.util.ReflectUtils; -import com.gitee.dorive.core.api.converter.EntityFactory; -import com.gitee.dorive.core.api.converter.EntityMapper; +import com.gitee.dorive.core.api.factory.EntityFactory; +import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.impl.context.SelectTypeMatcher; -import com.gitee.dorive.core.impl.converter.DefaultEntityFactory; +import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; -- Gitee From 0a1744629675ddef66859893a8e701f0286c9b65 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 17 Apr 2024 17:45:05 +0800 Subject: [PATCH 36/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/factory/EntityMapper.java | 16 +-- .../core/entity/common/EntityStoreInfo.java | 1 + .../dorive/core/entity/enums/Domain.java | 24 ++++ .../dorive/core/entity/factory/AliasInfo.java | 32 ++++++ .../factory/FieldInfo.java} | 86 +++++---------- .../core/impl/executor/ExampleExecutor.java | 19 ++-- .../impl/factory/DefaultEntityFactory.java | 26 +++-- .../impl/resolver/EntityMapperResolver.java | 104 ++++++++---------- .../repository/AbstractContextRepository.java | 2 +- .../repository/MybatisPlusRepository.java | 7 +- 10 files changed, 164 insertions(+), 153 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java rename dorive-core/src/main/java/com/gitee/dorive/core/{impl/factory/DefaultEntityMapper.java => entity/factory/FieldInfo.java} (31%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 06717a03..05ac17c8 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -17,20 +17,10 @@ package com.gitee.dorive.core.api.factory; -public interface EntityMapper { - - String fieldToAlias(String field); - - String aliasToField(String alias); - - String fieldToProp(String field); +import com.gitee.dorive.core.entity.factory.FieldInfo; - boolean hasConverter(); - - Object fieldToAlias(String alias, Object value); - - Object aliasToField(String field, Object value); +public interface EntityMapper { - Object fieldToProp(String prop, Object value); + FieldInfo findField(String domain, String name); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java index 62c7b7cf..4942b0ab 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/EntityStoreInfo.java @@ -33,5 +33,6 @@ public class EntityStoreInfo { private String idColumn; private Map propAliasMappingWithoutPk; private Map propAliasMapping; + private Map aliasPropMapping; private String selectColumns; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java new file mode 100644 index 00000000..06295ff3 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/enums/Domain.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.enums; + +public enum Domain { + ENTITY, + DATABASE, + POJO +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java new file mode 100644 index 00000000..5bda2cf1 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.entity.factory; + +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class AliasInfo { + private String domain; + private String name; + private Converter converter; +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java similarity index 31% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java index 2b6b5519..0d3252be 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java @@ -15,85 +15,49 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.entity.factory; import com.gitee.dorive.core.api.factory.Converter; -import com.gitee.dorive.core.api.factory.EntityMapper; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -import java.util.ArrayList; -import java.util.List; import java.util.Map; -@Data +@Getter +@Setter @AllArgsConstructor -public class DefaultEntityMapper implements EntityMapper { +public class FieldInfo { - private Map fieldAliasMapping; - private Map aliasFieldMapping; - private Map fieldPropMapping; - private Map fieldConverterMap; - private Map aliasConverterMap; - private Map propConverterMap; + private String domain; + private String name; + private Map aliasInfoMap; - @Override - public String fieldToAlias(String field) { - return fieldAliasMapping.get(field); + public void addAliasInfo(AliasInfo aliasInfo) { + aliasInfoMap.put(aliasInfo.getDomain(), aliasInfo); } - @Override - public String aliasToField(String alias) { - return aliasFieldMapping.get(alias); + public String getAlias(String domain) { + AliasInfo aliasInfo = aliasInfoMap.get(domain); + return aliasInfo.getName(); } - @Override - public String fieldToProp(String field) { - return fieldPropMapping.get(field); - } - - @Override - public boolean hasConverter() { - return fieldConverterMap != null && !fieldConverterMap.isEmpty(); - } - - @Override - public Object fieldToAlias(String alias, Object value) { - Converter converter = aliasConverterMap.get(alias); + public Object reconstitute(String domain, Object value) { + AliasInfo aliasInfo = aliasInfoMap.get(domain); + Converter converter = aliasInfo.getConverter(); if (converter != null) { - if (value instanceof List) { - List list = (List) value; - List newList = new ArrayList<>(list.size()); - for (Object item : list) { - Object mapValue = converter.deconstruct(item); - if (mapValue != null) { - newList.add(mapValue); - } else { - newList.add(item); - } - } - return newList; - - } else { - Object mapValue = converter.deconstruct(value); - if (mapValue != null) { - return mapValue; - } - } + return converter.reconstitute(value); } return value; } - @Override - public Object aliasToField(String field, Object value) { - Converter converter = fieldConverterMap.get(field); - return converter != null ? converter.reconstitute(value) : value; - } - - @Override - public Object fieldToProp(String prop, Object value) { - Converter converter = propConverterMap.get(prop); - return converter != null ? converter.deconstruct(value) : value; + public Object deconstruct(String domain, Object value) { + AliasInfo aliasInfo = aliasInfoMap.get(domain); + Converter converter = aliasInfo.getConverter(); + if (converter != null) { + return converter.deconstruct(value); + } + return value; } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index b61e7973..b1f1567e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -22,11 +22,13 @@ import com.gitee.dorive.api.entity.EntityEle; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.dorive.core.entity.factory.FieldInfo; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; @@ -134,15 +136,16 @@ public class ExampleExecutor extends AbstractProxyExecutor { private void doConvertCriteria(Criterion criterion) { String property = criterion.getProperty(); - String alias = entityMapper.fieldToAlias(property); - if (alias != null) { - criterion.setProperty(alias); - } else { - alias = property; + Object value = criterion.getValue(); + + FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), property); + if (fieldInfo == null) { + fieldInfo = entityMapper.findField(Domain.DATABASE.name(), property); } - if (entityMapper.hasConverter()) { - Object value = criterion.getValue(); - value = entityMapper.fieldToAlias(alias, value); + if (fieldInfo != null) { + property = fieldInfo.getAlias(Domain.DATABASE.name()); + value = fieldInfo.deconstruct(Domain.DATABASE.name(), value); + criterion.setProperty(property); criterion.setValue(value); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index f7af0589..55d2f82e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -24,6 +24,8 @@ import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.enums.Domain; +import com.gitee.dorive.core.entity.factory.FieldInfo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -46,17 +48,25 @@ public class DefaultEntityFactory implements EntityFactory { } private void initReCopyOptions() { - this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::aliasToField); - if (entityMapper.hasConverter()) { - this.reCopyOptions.setFieldValueEditor((field, value) -> entityMapper.aliasToField(field, value)); - } + this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { + FieldInfo fieldInfo = entityMapper.findField(Domain.DATABASE.name(), name); + return fieldInfo != null ? fieldInfo.getName() : name; + + }).setFieldValueEditor((name, value) -> { + FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), name); + return fieldInfo != null ? fieldInfo.reconstitute(Domain.DATABASE.name(), value) : value; + }); } private void initDeCopyOptions() { - this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(entityMapper::fieldToProp); - if (entityMapper.hasConverter()) { - this.deCopyOptions.setFieldValueEditor((prop, value) -> entityMapper.fieldToProp(prop, value)); - } + this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { + FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), name); + return fieldInfo != null ? fieldInfo.getAlias(Domain.POJO.name()) : name; + + }).setFieldValueEditor((name, value) -> { + FieldInfo fieldInfo = entityMapper.findField(Domain.POJO.name(), name); + return fieldInfo != null ? fieldInfo.deconstruct(Domain.POJO.name(), value) : value; + }); } @Override diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 6a9c4bf4..52388f1a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -24,8 +24,10 @@ import com.gitee.dorive.api.entity.EntityField; import com.gitee.dorive.core.api.factory.Converter; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; +import com.gitee.dorive.core.entity.enums.Domain; +import com.gitee.dorive.core.entity.factory.AliasInfo; +import com.gitee.dorive.core.entity.factory.FieldInfo; import com.gitee.dorive.core.impl.factory.DefaultConverter; -import com.gitee.dorive.core.impl.factory.DefaultEntityMapper; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.commons.lang3.StringUtils; @@ -40,78 +42,60 @@ public class EntityMapperResolver { private EntityEle entityEle; private EntityStoreInfo entityStoreInfo; - public EntityMapper resolve() { + public EntityMapper newEntityMapper() { + Map entityFieldMap = entityEle.getEntityFieldMap(); Map fieldAliasMapping = entityEle.getFieldAliasMapping(); - Map aliasFieldMapping = newAliasFieldMapping(fieldAliasMapping); - Map fieldPropMapping = newFieldPropMapping(aliasFieldMapping); + Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); - Map fieldConverterMap = newFieldConverterMap(); - Map aliasConverterMap = newAliasConverterMap(fieldAliasMapping, fieldConverterMap); - Map propConverterMap = newPropConverterMap(fieldPropMapping, fieldConverterMap); + Map fieldInfoMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); + entityFieldMap.forEach((name, field) -> { + FieldInfo fieldInfo = new FieldInfo(Domain.ENTITY.name(), name, new LinkedHashMap<>(3)); + Converter converter = newConverter(field); - return new DefaultEntityMapper(fieldAliasMapping, aliasFieldMapping, fieldPropMapping, - fieldConverterMap, aliasConverterMap, propConverterMap); - } + String alias = fieldAliasMapping.get(name); + AliasInfo databaseAliasInfo = new AliasInfo(Domain.DATABASE.name(), alias, converter); + fieldInfo.addAliasInfo(databaseAliasInfo); - private Map newAliasFieldMapping(Map fieldAliasMapping) { - Map aliasFieldMapping = new LinkedHashMap<>(); - fieldAliasMapping.forEach((field, alias) -> aliasFieldMapping.put(alias, field)); - return aliasFieldMapping; - } + String prop = aliasPropMapping.get(alias); + AliasInfo pojoAliasInfo = new AliasInfo(Domain.POJO.name(), prop, converter); + fieldInfo.addAliasInfo(pojoAliasInfo); - private Map newFieldPropMapping(Map aliasFieldMapping) { - Map fieldPropMapping = new LinkedHashMap<>(); - Map propAliasMapping = entityStoreInfo.getPropAliasMapping(); - propAliasMapping.forEach((prop, alias) -> { - String field = aliasFieldMapping.get(alias); - if (field != null) { - fieldPropMapping.put(field, prop); - } + fieldInfoMap.put(getKey(fieldInfo.getDomain(), fieldInfo.getName()), fieldInfo); + fieldInfoMap.put(getKey(databaseAliasInfo.getDomain(), databaseAliasInfo.getName()), fieldInfo); + fieldInfoMap.put(getKey(pojoAliasInfo.getDomain(), pojoAliasInfo.getName()), fieldInfo); }); - return fieldPropMapping; + + return new DefaultEntityMapper(fieldInfoMap); } - private Map newFieldConverterMap() { - Map fieldConverterMap = new LinkedHashMap<>(8); - Map entityFieldMap = entityEle.getEntityFieldMap(); - if (entityFieldMap != null) { - entityFieldMap.forEach((field, entityField) -> { - FieldDef fieldDef = entityField.getFieldDef(); - if (fieldDef != null) { - Class converterClass = fieldDef.getConverter(); - String mapExp = fieldDef.getMapExp(); - Converter converter = null; - if (converterClass != Object.class) { - converter = (Converter) ReflectUtil.newInstance(converterClass); - - } else if (StringUtils.isNotBlank(mapExp)) { - converter = new DefaultConverter(entityField); - } - if (converter != null) { - fieldConverterMap.put(field, converter); - } - } - }); + private Converter newConverter(EntityField entityField) { + FieldDef fieldDef = entityField.getFieldDef(); + if (fieldDef != null) { + Class converterClass = fieldDef.getConverter(); + if (converterClass != Object.class) { + return (Converter) ReflectUtil.newInstance(converterClass); + + } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { + return new DefaultConverter(entityField); + } } - return fieldConverterMap; + return null; } - private Map newAliasConverterMap(Map fieldAliasMapping, Map fieldConverterMap) { - Map aliasConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); - fieldConverterMap.forEach((field, converter) -> { - String alias = fieldAliasMapping.get(field); - aliasConverterMap.put(alias, converter); - }); - return aliasConverterMap; + private String getKey(String domain, String name) { + return domain + ":" + name; } - private Map newPropConverterMap(Map fieldPropMapping, Map fieldConverterMap) { - Map propConverterMap = new LinkedHashMap<>(fieldConverterMap.size()); - fieldConverterMap.forEach((field, converter) -> { - String prop = fieldPropMapping.get(field); - propConverterMap.put(prop, converter); - }); - return propConverterMap; + @AllArgsConstructor + private class DefaultEntityMapper implements EntityMapper { + + private final Map fieldInfoMap; + + @Override + public FieldInfo findField(String domain, String name) { + return fieldInfoMap.get(getKey(domain, name)); + } + } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 7de313ef..38fc8493 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -199,7 +199,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityEle); ENTITY_STORE_INFO_MAP.put(entityEle, entityStoreInfo); - EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).resolve(); + EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).newEntityMapper(); EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index f7825494..44712dff 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.mybatis.plus.repository; import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; @@ -112,11 +113,13 @@ public class MybatisPlusRepository extends AbstractRefRepository i } propAliasMapping.putAll(propAliasMappingWithoutPk); + Map aliasPropMapping = MapUtil.reverse(propAliasMapping); + List columns = new ArrayList<>(propAliasMapping.values()); String selectColumns = StrUtil.join(",", columns); - return new EntityStoreInfo(mapperClass, mapper, pojoClass, - tableName, keyProperty, keyColumn, propAliasMappingWithoutPk, propAliasMapping, selectColumns); + return new EntityStoreInfo(mapperClass, mapper, pojoClass, tableName, keyProperty, keyColumn, + propAliasMappingWithoutPk, propAliasMapping, aliasPropMapping, selectColumns); } private String clearColumn(String column) { -- Gitee From a6d978d62765cb9f4d97cca461cbf67168447ba3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Wed, 17 Apr 2024 22:20:26 +0800 Subject: [PATCH 37/49] =?UTF-8?q?=E7=AE=80=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/factory/EntityMapper.java | 4 +- .../{AliasInfo.java => FieldConverter.java} | 21 ++++++- .../dorive/core/entity/factory/FieldInfo.java | 63 ------------------- .../core/impl/executor/ExampleExecutor.java | 14 ++--- .../impl/factory/DefaultEntityFactory.java | 18 +++--- .../impl/resolver/EntityMapperResolver.java | 31 ++++----- 6 files changed, 51 insertions(+), 100 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/{AliasInfo.java => FieldConverter.java} (69%) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 05ac17c8..6fb3de28 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -17,10 +17,10 @@ package com.gitee.dorive.core.api.factory; -import com.gitee.dorive.core.entity.factory.FieldInfo; +import com.gitee.dorive.core.entity.factory.FieldConverter; public interface EntityMapper { - FieldInfo findField(String domain, String name); + FieldConverter getConverter(String domain, String name); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java similarity index 69% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java index 5bda2cf1..756b31c4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/AliasInfo.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java @@ -22,11 +22,30 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import java.util.Map; + @Getter @Setter @AllArgsConstructor -public class AliasInfo { +public class FieldConverter implements Converter { + private String domain; private String name; + private Map names; private Converter converter; + + public String getName(String domain) { + return names.get(domain); + } + + @Override + public Object reconstitute(Object value) { + return converter == null ? value : converter.reconstitute(value); + } + + @Override + public Object deconstruct(Object value) { + return converter == null ? value : converter.deconstruct(value); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java deleted file mode 100644 index 0d3252be..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.core.entity.factory; - -import com.gitee.dorive.core.api.factory.Converter; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -import java.util.Map; - -@Getter -@Setter -@AllArgsConstructor -public class FieldInfo { - - private String domain; - private String name; - private Map aliasInfoMap; - - public void addAliasInfo(AliasInfo aliasInfo) { - aliasInfoMap.put(aliasInfo.getDomain(), aliasInfo); - } - - public String getAlias(String domain) { - AliasInfo aliasInfo = aliasInfoMap.get(domain); - return aliasInfo.getName(); - } - - public Object reconstitute(String domain, Object value) { - AliasInfo aliasInfo = aliasInfoMap.get(domain); - Converter converter = aliasInfo.getConverter(); - if (converter != null) { - return converter.reconstitute(value); - } - return value; - } - - public Object deconstruct(String domain, Object value) { - AliasInfo aliasInfo = aliasInfoMap.get(domain); - Converter converter = aliasInfo.getConverter(); - if (converter != null) { - return converter.deconstruct(value); - } - return value; - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index b1f1567e..9cdb710d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -28,7 +28,7 @@ import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.factory.FieldInfo; +import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.entity.operation.Condition; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.Query; @@ -138,13 +138,13 @@ public class ExampleExecutor extends AbstractProxyExecutor { String property = criterion.getProperty(); Object value = criterion.getValue(); - FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), property); - if (fieldInfo == null) { - fieldInfo = entityMapper.findField(Domain.DATABASE.name(), property); + FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), property); + if (fieldConverter == null) { + fieldConverter = entityMapper.getConverter(Domain.DATABASE.name(), property); } - if (fieldInfo != null) { - property = fieldInfo.getAlias(Domain.DATABASE.name()); - value = fieldInfo.deconstruct(Domain.DATABASE.name(), value); + if (fieldConverter != null) { + property = fieldConverter.getName(Domain.DATABASE.name()); + value = fieldConverter.deconstruct(value); criterion.setProperty(property); criterion.setValue(value); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index 55d2f82e..9bfb3fec 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -25,7 +25,7 @@ import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; -import com.gitee.dorive.core.entity.factory.FieldInfo; +import com.gitee.dorive.core.entity.factory.FieldConverter; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -49,23 +49,23 @@ public class DefaultEntityFactory implements EntityFactory { private void initReCopyOptions() { this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldInfo fieldInfo = entityMapper.findField(Domain.DATABASE.name(), name); - return fieldInfo != null ? fieldInfo.getName() : name; + FieldConverter fieldConverter = entityMapper.getConverter(Domain.DATABASE.name(), name); + return fieldConverter != null ? fieldConverter.getName() : name; }).setFieldValueEditor((name, value) -> { - FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), name); - return fieldInfo != null ? fieldInfo.reconstitute(Domain.DATABASE.name(), value) : value; + FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), name); + return fieldConverter != null ? fieldConverter.reconstitute(value) : value; }); } private void initDeCopyOptions() { this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldInfo fieldInfo = entityMapper.findField(Domain.ENTITY.name(), name); - return fieldInfo != null ? fieldInfo.getAlias(Domain.POJO.name()) : name; + FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), name); + return fieldConverter != null ? fieldConverter.getName(Domain.POJO.name()) : name; }).setFieldValueEditor((name, value) -> { - FieldInfo fieldInfo = entityMapper.findField(Domain.POJO.name(), name); - return fieldInfo != null ? fieldInfo.deconstruct(Domain.POJO.name(), value) : value; + FieldConverter fieldConverter = entityMapper.getConverter(Domain.POJO.name(), name); + return fieldConverter != null ? fieldConverter.deconstruct(value) : value; }); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 52388f1a..cbde7142 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -25,8 +25,7 @@ import com.gitee.dorive.core.api.factory.Converter; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; -import com.gitee.dorive.core.entity.factory.AliasInfo; -import com.gitee.dorive.core.entity.factory.FieldInfo; +import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.impl.factory.DefaultConverter; import lombok.AllArgsConstructor; import lombok.Data; @@ -47,25 +46,21 @@ public class EntityMapperResolver { Map fieldAliasMapping = entityEle.getFieldAliasMapping(); Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); - Map fieldInfoMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); + Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); entityFieldMap.forEach((name, field) -> { - FieldInfo fieldInfo = new FieldInfo(Domain.ENTITY.name(), name, new LinkedHashMap<>(3)); - Converter converter = newConverter(field); - String alias = fieldAliasMapping.get(name); - AliasInfo databaseAliasInfo = new AliasInfo(Domain.DATABASE.name(), alias, converter); - fieldInfo.addAliasInfo(databaseAliasInfo); - String prop = aliasPropMapping.get(alias); - AliasInfo pojoAliasInfo = new AliasInfo(Domain.POJO.name(), prop, converter); - fieldInfo.addAliasInfo(pojoAliasInfo); - fieldInfoMap.put(getKey(fieldInfo.getDomain(), fieldInfo.getName()), fieldInfo); - fieldInfoMap.put(getKey(databaseAliasInfo.getDomain(), databaseAliasInfo.getName()), fieldInfo); - fieldInfoMap.put(getKey(pojoAliasInfo.getDomain(), pojoAliasInfo.getName()), fieldInfo); + Converter converter = newConverter(field); + FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, new LinkedHashMap<>(5), converter); + Map names = fieldConverter.getNames(); + names.put(Domain.ENTITY.name(), name); + names.put(Domain.DATABASE.name(), alias); + names.put(Domain.POJO.name(), prop); + names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); }); - return new DefaultEntityMapper(fieldInfoMap); + return new DefaultEntityMapper(fieldConverterMap); } private Converter newConverter(EntityField entityField) { @@ -89,11 +84,11 @@ public class EntityMapperResolver { @AllArgsConstructor private class DefaultEntityMapper implements EntityMapper { - private final Map fieldInfoMap; + private final Map fieldConverterMap; @Override - public FieldInfo findField(String domain, String name) { - return fieldInfoMap.get(getKey(domain, name)); + public FieldConverter getConverter(String domain, String name) { + return fieldConverterMap.get(getKey(domain, name)); } } -- Gitee From ecad67bd2272a8bf835c16ab7f10466e0e917c94 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 18 Apr 2024 18:45:02 +0800 Subject: [PATCH 38/49] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/annotation/Aggregate.java | 6 ++ .../gitee/dorive/api/annotation/Entity.java | 5 ++ .../gitee/dorive/api/annotation/Field.java | 7 +- .../com/gitee/dorive/api/annotation/Id.java | 2 +- .../gitee/dorive/api/annotation/ValueObj.java | 42 ++++++++++++ .../com/gitee/dorive/api/def/EntityDef.java | 7 +- .../com/gitee/dorive/api/def/FieldDef.java | 3 +- .../gitee/dorive/api/entity/EntityEle.java | 7 -- .../gitee/dorive/api/entity/EntityField.java | 2 +- .../dorive/core/api/factory/EntityMapper.java | 6 +- .../MapExpConverter.java} | 12 ++-- .../impl/converter/ValueObjConverter.java | 57 ++++++++++++++++ .../core/impl/executor/ExampleExecutor.java | 4 +- .../impl/factory/DefaultEntityFactory.java | 14 ++-- .../impl/factory/ValueObjEntityFactory.java | 66 +++++++++++++++++++ .../impl/resolver/EntityMapperResolver.java | 34 +++++++--- .../repository/AbstractContextRepository.java | 7 +- 17 files changed, 240 insertions(+), 41 deletions(-) create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/{factory/DefaultConverter.java => converter/MapExpConverter.java} (93%) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java index 7243d497..303c5d2b 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Aggregate.java @@ -57,6 +57,12 @@ public @interface Aggregate { @AliasFor(annotation = Entity.class) Class factory() default Object.class; + /** + * @see Entity + */ + @AliasFor(annotation = Entity.class) + boolean aggregate() default true; + /** * @see Entity */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java index 21dbba2a..261c013c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Entity.java @@ -46,6 +46,11 @@ public @interface Entity { */ Class factory() default Object.class; + /** + * 是否聚合 + */ + boolean aggregate() default false; + /** * 指定仓储 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index 72f331b1..5f0ada19 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -36,7 +36,7 @@ public @interface Field { /** * 是否主键 */ - boolean isId() default false; + boolean id() default false; /** * 别名 @@ -55,6 +55,11 @@ public @interface Field { */ String mapExp() default ""; + /** + * 是否值对象 + */ + boolean valueObj() default false; + /** * 指定转换器 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java index 169be88e..d1716eb1 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Id.java @@ -34,7 +34,7 @@ import java.lang.annotation.Target; public @interface Id { @AliasFor(annotation = Field.class) - boolean isId() default true; + boolean id() default true; @AliasFor(annotation = Field.class) String value() default "id"; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java new file mode 100644 index 00000000..20604c6a --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.annotation; + +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Field +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ValueObj { + + @AliasFor(annotation = Field.class) + String value() default ""; + + @AliasFor(annotation = Field.class) + boolean valueObj() default true; + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java index effdf65e..f95eac63 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/EntityDef.java @@ -36,6 +36,7 @@ public class EntityDef { private String name; private Class source; private Class factory; + private boolean aggregate; private Class repository; public static EntityDef fromElement(AnnotatedElement element) { @@ -43,7 +44,7 @@ public class EntityDef { return attributes != null ? BeanUtil.copyProperties(attributes, EntityDef.class) : null; } - public void merge(EntityDef entityDef) { + public void mergeDef(EntityDef entityDef) { if (StringUtils.isBlank(name)) { name = entityDef.getName(); } @@ -55,8 +56,4 @@ public class EntityDef { } } - public boolean isRepositoryDef() { - return repository != Object.class; - } - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java index 5d077cab..b8913a11 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java @@ -32,9 +32,10 @@ import java.util.Map; @AllArgsConstructor public class FieldDef { - private boolean isId; + private boolean id; private String alias; private String mapExp; + private boolean valueObj; private Class converter; public static FieldDef fromElement(AnnotatedElement element) { diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java index 90d9db18..f645ef5f 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityEle.java @@ -17,7 +17,6 @@ package com.gitee.dorive.api.entity; -import com.gitee.dorive.api.annotation.Aggregate; import com.gitee.dorive.api.api.PropProxy; import com.gitee.dorive.api.def.BindingDef; import com.gitee.dorive.api.def.EntityDef; @@ -39,7 +38,6 @@ public abstract class EntityEle { private AnnotatedElement element; private EntityDef entityDef; private OrderDef orderDef; - private boolean aggregated; private List bindingDefs; private PropProxy idProxy; private Map fieldAliasMapping; @@ -48,7 +46,6 @@ public abstract class EntityEle { this.element = element; this.entityDef = EntityDef.fromElement(element); this.orderDef = OrderDef.fromElement(element); - this.aggregated = (entityDef != null && entityDef.isRepositoryDef()) || isAggregateDef(); this.bindingDefs = BindingDef.fromElement(element); } @@ -56,10 +53,6 @@ public abstract class EntityEle { return entityDef != null; } - public boolean isAggregateDef() { - return element.isAnnotationPresent(Aggregate.class); - } - public void initialize() { if (entityDef != null && idProxy == null) { doInitialize(); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java index aaac3292..4a4ed5a8 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityField.java @@ -69,7 +69,7 @@ public class EntityField extends EntityEle { if (entityDef != null) { EntityDef genericEntityDef = EntityDef.fromElement(genericType); if (genericEntityDef != null) { - entityDef.merge(genericEntityDef); + entityDef.mergeDef(genericEntityDef); } } if (isComplexType(genericType)) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 6fb3de28..d03a67d0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -19,8 +19,12 @@ package com.gitee.dorive.core.api.factory; import com.gitee.dorive.core.entity.factory.FieldConverter; +import java.util.List; + public interface EntityMapper { - FieldConverter getConverter(String domain, String name); + FieldConverter getField(String domain, String name); + + List getValueObjFields(); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java similarity index 93% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java index a7a0e1be..d5325926 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapExpConverter.java @@ -15,13 +15,14 @@ * limitations under the License. */ -package com.gitee.dorive.core.impl.factory; +package com.gitee.dorive.core.impl.converter; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.def.FieldDef; import com.gitee.dorive.api.entity.EntityField; import com.gitee.dorive.core.api.factory.Converter; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.util.Collections; @@ -29,14 +30,15 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -@Data -public class DefaultConverter implements Converter { +@Getter +@Setter +public class MapExpConverter implements Converter { private EntityField entityField; private Map reMapping = Collections.emptyMap(); private Map deMapping = Collections.emptyMap(); - public DefaultConverter(EntityField entityField) { + public MapExpConverter(EntityField entityField) { this.entityField = entityField; FieldDef fieldDef = entityField.getFieldDef(); Class genericType = entityField.getGenericType(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java new file mode 100644 index 00000000..a740483a --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +@AllArgsConstructor +public class ValueObjConverter implements Converter { + + private Class entityClass; + private boolean isJson; + + @Override + public Object reconstitute(Object value) { + if (value instanceof String) { + return JSONUtil.toBean((String) value, entityClass); + + } else if (value instanceof Map) { + return BeanUtil.toBean(value, entityClass); + } + return value; + } + + @Override + public Object deconstruct(Object value) { + if (isJson) { + return JSONUtil.toJsonStr(value); + } else { + return BeanUtil.beanToMap(value); + } + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java index 9cdb710d..574a2c4f 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ExampleExecutor.java @@ -138,9 +138,9 @@ public class ExampleExecutor extends AbstractProxyExecutor { String property = criterion.getProperty(); Object value = criterion.getValue(); - FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), property); + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), property); if (fieldConverter == null) { - fieldConverter = entityMapper.getConverter(Domain.DATABASE.name(), property); + fieldConverter = entityMapper.getField(Domain.DATABASE.name(), property); } if (fieldConverter != null) { property = fieldConverter.getName(Domain.DATABASE.name()); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index 9bfb3fec..63658d3c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -27,10 +27,12 @@ import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor public class DefaultEntityFactory implements EntityFactory { @@ -49,22 +51,22 @@ public class DefaultEntityFactory implements EntityFactory { private void initReCopyOptions() { this.reCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldConverter fieldConverter = entityMapper.getConverter(Domain.DATABASE.name(), name); + FieldConverter fieldConverter = entityMapper.getField(Domain.DATABASE.name(), name); return fieldConverter != null ? fieldConverter.getName() : name; }).setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), name); + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); return fieldConverter != null ? fieldConverter.reconstitute(value) : value; }); } private void initDeCopyOptions() { this.deCopyOptions = CopyOptions.create().ignoreNullValue().setFieldNameEditor(name -> { - FieldConverter fieldConverter = entityMapper.getConverter(Domain.ENTITY.name(), name); + FieldConverter fieldConverter = entityMapper.getField(Domain.ENTITY.name(), name); return fieldConverter != null ? fieldConverter.getName(Domain.POJO.name()) : name; }).setFieldValueEditor((name, value) -> { - FieldConverter fieldConverter = entityMapper.getConverter(Domain.POJO.name(), name); + FieldConverter fieldConverter = entityMapper.getField(Domain.POJO.name(), name); return fieldConverter != null ? fieldConverter.deconstruct(value) : value; }); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java new file mode 100644 index 00000000..79c0905d --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.factory; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.factory.EntityMapper; +import com.gitee.dorive.core.entity.enums.Domain; +import com.gitee.dorive.core.entity.factory.FieldConverter; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ValueObjEntityFactory extends DefaultEntityFactory { + + @Override + @SuppressWarnings("unchecked") + public Object reconstitute(Context context, Object persistent) { + Map resultMap = (Map) persistent; + EntityMapper entityMapper = getEntityMapper(); + List fieldConverters = entityMapper.getValueObjFields(); + for (FieldConverter fieldConverter : fieldConverters) { + String name = fieldConverter.getName(Domain.DATABASE.name()); + if (!resultMap.containsKey(name)) { + resultMap.put(name, new HashMap<>(resultMap)); + } + } + return super.reconstitute(context, persistent); + } + + @Override + public Object deconstruct(Context context, Object entity) { + Object pojo = super.deconstruct(context, entity); + EntityMapper entityMapper = getEntityMapper(); + List fieldConverters = entityMapper.getValueObjFields(); + for (FieldConverter fieldConverter : fieldConverters) { + String name = fieldConverter.getName(Domain.POJO.name()); + if (name == null) { + Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); + if (valueObj != null) { + valueObj = fieldConverter.deconstruct(valueObj); + BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); + } + } + } + return pojo; + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index cbde7142..f78c379e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -26,12 +26,16 @@ import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; -import com.gitee.dorive.core.impl.factory.DefaultConverter; +import com.gitee.dorive.core.impl.converter.MapExpConverter; +import com.gitee.dorive.core.impl.converter.ValueObjConverter; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; @Data @@ -47,31 +51,43 @@ public class EntityMapperResolver { Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); + List valueObjFields = new ArrayList<>(4); entityFieldMap.forEach((name, field) -> { String alias = fieldAliasMapping.get(name); String prop = aliasPropMapping.get(alias); - Converter converter = newConverter(field); - FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, new LinkedHashMap<>(5), converter); - Map names = fieldConverter.getNames(); + Map names = new LinkedHashMap<>(5); names.put(Domain.ENTITY.name(), name); names.put(Domain.DATABASE.name(), alias); names.put(Domain.POJO.name(), prop); + + FieldDef fieldDef = field.getFieldDef(); + boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); + + Converter converter = newConverter(field, names, isValueObj); + FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, names, converter); names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); + if (isValueObj) { + valueObjFields.add(fieldConverter); + } }); - return new DefaultEntityMapper(fieldConverterMap); + return new DefaultEntityMapper(fieldConverterMap, valueObjFields); } - private Converter newConverter(EntityField entityField) { + private Converter newConverter(EntityField entityField, Map names, boolean isValueObj) { FieldDef fieldDef = entityField.getFieldDef(); if (fieldDef != null) { Class converterClass = fieldDef.getConverter(); if (converterClass != Object.class) { return (Converter) ReflectUtil.newInstance(converterClass); + } else if (isValueObj) { + String name = names.get(Domain.POJO.name()); + return new ValueObjConverter(entityField.getGenericType(), name != null); + } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { - return new DefaultConverter(entityField); + return new MapExpConverter(entityField); } } return null; @@ -81,13 +97,15 @@ public class EntityMapperResolver { return domain + ":" + name; } + @Getter @AllArgsConstructor private class DefaultEntityMapper implements EntityMapper { private final Map fieldConverterMap; + private final List valueObjFields; @Override - public FieldConverter getConverter(String domain, String name) { + public FieldConverter getField(String domain, String name) { return fieldConverterMap.get(getKey(domain, name)); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 38fc8493..2d3d6b33 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -136,7 +136,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor AbstractRepository proxyRepository = processRepository(actualRepository); boolean isRoot = "/".equals(accessPath); - boolean isAggregated = entityEle.isAggregated(); + boolean isAggregated = entityDef.getRepository() != Object.class; OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); Map propChainMap = propChainResolver.getPropChainMap(); @@ -167,7 +167,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor private EntityDef renewEntityDef(EntityEle entityEle) { EntityDef entityDef = entityEle.getEntityDef(); entityDef = BeanUtil.copyProperties(entityDef, EntityDef.class); - if (entityEle.isAggregateDef()) { + if (entityDef.isAggregate()) { Class entityClass = entityEle.getGenericType(); Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); @@ -199,7 +199,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityDef, entityEle); ENTITY_STORE_INFO_MAP.put(entityEle, entityStoreInfo); - EntityMapper entityMapper = new EntityMapperResolver(entityEle, entityStoreInfo).newEntityMapper(); + EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityEle, entityStoreInfo); + EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); EntityFactory entityFactory = newEntityFactory(entityDef, entityEle, entityStoreInfo, entityMapper); Executor executor = newExecutor(entityDef, entityEle, entityStoreInfo); -- Gitee From 4118beb890f6d4277ce9359d70b8c5ea37dadb76 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 18 Apr 2024 21:17:10 +0800 Subject: [PATCH 39/49] =?UTF-8?q?=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impl/converter/JsonConverter.java | 43 +++++++++++++++++++ ...lueObjConverter.java => MapConverter.java} | 20 ++------- .../impl/resolver/EntityMapperResolver.java | 28 +++++++----- 3 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java rename dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/{ValueObjConverter.java => MapConverter.java} (70%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java new file mode 100644 index 00000000..93842493 --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonConverter.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class JsonConverter implements Converter { + + private Class entityClass; + + @Override + public Object reconstitute(Object value) { + return JSONUtil.toBean((String) value, entityClass); + } + + @Override + public Object deconstruct(Object value) { + return JSONUtil.toJsonStr(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java similarity index 70% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java index a740483a..81b78e98 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/ValueObjConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/MapConverter.java @@ -18,40 +18,26 @@ package com.gitee.dorive.core.impl.converter; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.json.JSONUtil; import com.gitee.dorive.core.api.factory.Converter; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import java.util.Map; - @Getter @Setter @AllArgsConstructor -public class ValueObjConverter implements Converter { +public class MapConverter implements Converter { private Class entityClass; - private boolean isJson; @Override public Object reconstitute(Object value) { - if (value instanceof String) { - return JSONUtil.toBean((String) value, entityClass); - - } else if (value instanceof Map) { - return BeanUtil.toBean(value, entityClass); - } - return value; + return BeanUtil.toBean(value, entityClass); } @Override public Object deconstruct(Object value) { - if (isJson) { - return JSONUtil.toJsonStr(value); - } else { - return BeanUtil.beanToMap(value); - } + return BeanUtil.beanToMap(value); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index f78c379e..5e737e4e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -26,8 +26,9 @@ import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.impl.converter.JsonConverter; +import com.gitee.dorive.core.impl.converter.MapConverter; import com.gitee.dorive.core.impl.converter.MapExpConverter; -import com.gitee.dorive.core.impl.converter.ValueObjConverter; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -47,25 +48,30 @@ public class EntityMapperResolver { public EntityMapper newEntityMapper() { Map entityFieldMap = entityEle.getEntityFieldMap(); - Map fieldAliasMapping = entityEle.getFieldAliasMapping(); Map aliasPropMapping = entityStoreInfo.getAliasPropMapping(); Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); List valueObjFields = new ArrayList<>(4); entityFieldMap.forEach((name, field) -> { - String alias = fieldAliasMapping.get(name); - String prop = aliasPropMapping.get(alias); + String expected = entityEle.toAlias(name); + boolean isMatch = aliasPropMapping.containsKey(expected); + String alias = isMatch ? expected : null; + String prop = isMatch ? aliasPropMapping.get(alias) : null; Map names = new LinkedHashMap<>(5); names.put(Domain.ENTITY.name(), name); - names.put(Domain.DATABASE.name(), alias); - names.put(Domain.POJO.name(), prop); + if (alias != null) { + names.put(Domain.DATABASE.name(), alias); + } + if (prop != null) { + names.put(Domain.POJO.name(), prop); + } FieldDef fieldDef = field.getFieldDef(); boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); - - Converter converter = newConverter(field, names, isValueObj); + Converter converter = newConverter(field, isMatch, isValueObj); FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, names, converter); + names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); if (isValueObj) { valueObjFields.add(fieldConverter); @@ -75,7 +81,7 @@ public class EntityMapperResolver { return new DefaultEntityMapper(fieldConverterMap, valueObjFields); } - private Converter newConverter(EntityField entityField, Map names, boolean isValueObj) { + private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { FieldDef fieldDef = entityField.getFieldDef(); if (fieldDef != null) { Class converterClass = fieldDef.getConverter(); @@ -83,8 +89,8 @@ public class EntityMapperResolver { return (Converter) ReflectUtil.newInstance(converterClass); } else if (isValueObj) { - String name = names.get(Domain.POJO.name()); - return new ValueObjConverter(entityField.getGenericType(), name != null); + Class genericType = entityField.getGenericType(); + return isMatch ? new JsonConverter(genericType) : new MapConverter(genericType); } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { return new MapExpConverter(entityField); -- Gitee From 157c4f06714f129d7e7dca4764336d1398c338ca Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 18 Apr 2024 22:48:03 +0800 Subject: [PATCH 40/49] =?UTF-8?q?=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/entity/factory/FieldConverter.java | 1 + .../impl/factory/ValueObjEntityFactory.java | 18 +++++++++--------- .../impl/resolver/EntityMapperResolver.java | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java index 756b31c4..c2ef233c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/factory/FieldConverter.java @@ -31,6 +31,7 @@ public class FieldConverter implements Converter { private String domain; private String name; + private boolean match; private Map names; private Converter converter; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index 79c0905d..733b6ac2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -21,10 +21,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; -import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,16 +31,19 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { @Override @SuppressWarnings("unchecked") public Object reconstitute(Context context, Object persistent) { + Object entity = super.reconstitute(context, persistent); Map resultMap = (Map) persistent; EntityMapper entityMapper = getEntityMapper(); List fieldConverters = entityMapper.getValueObjFields(); for (FieldConverter fieldConverter : fieldConverters) { - String name = fieldConverter.getName(Domain.DATABASE.name()); - if (!resultMap.containsKey(name)) { - resultMap.put(name, new HashMap<>(resultMap)); + if (!fieldConverter.isMatch()) { + Object valueObj = fieldConverter.reconstitute(resultMap); + if (valueObj != null) { + BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); + } } } - return super.reconstitute(context, persistent); + return entity; } @Override @@ -51,11 +52,10 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { EntityMapper entityMapper = getEntityMapper(); List fieldConverters = entityMapper.getValueObjFields(); for (FieldConverter fieldConverter : fieldConverters) { - String name = fieldConverter.getName(Domain.POJO.name()); - if (name == null) { + if (!fieldConverter.isMatch()) { Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); + valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; if (valueObj != null) { - valueObj = fieldConverter.deconstruct(valueObj); BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 5e737e4e..30d5336c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -70,7 +70,7 @@ public class EntityMapperResolver { FieldDef fieldDef = field.getFieldDef(); boolean isValueObj = fieldDef != null && fieldDef.isValueObj(); Converter converter = newConverter(field, isMatch, isValueObj); - FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, names, converter); + FieldConverter fieldConverter = new FieldConverter(Domain.ENTITY.name(), name, isMatch, names, converter); names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); if (isValueObj) { -- Gitee From 502a3a34c6cd8678131f6602b895b7fe0a56d73a Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 18 Apr 2024 23:19:42 +0800 Subject: [PATCH 41/49] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=80=BC=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/factory/EntityMapper.java | 2 ++ .../impl/factory/ValueObjEntityFactory.java | 22 ++++++++----------- .../impl/resolver/EntityMapperResolver.java | 8 +++++-- .../repository/AbstractContextRepository.java | 5 ++++- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index d03a67d0..f46b4195 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -27,4 +27,6 @@ public interface EntityMapper { List getValueObjFields(); + List getUnmatchedValueObjFields(); + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index 733b6ac2..9362c7bb 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -34,13 +34,11 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { Object entity = super.reconstitute(context, persistent); Map resultMap = (Map) persistent; EntityMapper entityMapper = getEntityMapper(); - List fieldConverters = entityMapper.getValueObjFields(); + List fieldConverters = entityMapper.getUnmatchedValueObjFields(); for (FieldConverter fieldConverter : fieldConverters) { - if (!fieldConverter.isMatch()) { - Object valueObj = fieldConverter.reconstitute(resultMap); - if (valueObj != null) { - BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); - } + Object valueObj = fieldConverter.reconstitute(resultMap); + if (valueObj != null) { + BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); } } return entity; @@ -50,14 +48,12 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { public Object deconstruct(Context context, Object entity) { Object pojo = super.deconstruct(context, entity); EntityMapper entityMapper = getEntityMapper(); - List fieldConverters = entityMapper.getValueObjFields(); + List fieldConverters = entityMapper.getUnmatchedValueObjFields(); for (FieldConverter fieldConverter : fieldConverters) { - if (!fieldConverter.isMatch()) { - Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); - valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; - if (valueObj != null) { - BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); - } + Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); + valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; + if (valueObj != null) { + BeanUtil.copyProperties(valueObj, pojo, CopyOptions.create().ignoreNullValue()); } } return pojo; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 30d5336c..482086dd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -52,6 +52,7 @@ public class EntityMapperResolver { Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); List valueObjFields = new ArrayList<>(4); + List unmatchedValueObjFields = new ArrayList<>(4); entityFieldMap.forEach((name, field) -> { String expected = entityEle.toAlias(name); boolean isMatch = aliasPropMapping.containsKey(expected); @@ -75,10 +76,12 @@ public class EntityMapperResolver { names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); if (isValueObj) { valueObjFields.add(fieldConverter); + if (!isMatch) { + unmatchedValueObjFields.add(fieldConverter); + } } }); - - return new DefaultEntityMapper(fieldConverterMap, valueObjFields); + return new DefaultEntityMapper(fieldConverterMap, valueObjFields, unmatchedValueObjFields); } private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { @@ -109,6 +112,7 @@ public class EntityMapperResolver { private final Map fieldConverterMap; private final List valueObjFields; + private final List unmatchedValueObjFields; @Override public FieldConverter getField(String domain, String name) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 2d3d6b33..3af19254 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -35,12 +35,14 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.config.RepositoryContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; +import com.gitee.dorive.core.entity.factory.FieldConverter; import com.gitee.dorive.core.impl.context.SelectTypeMatcher; import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; +import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; @@ -216,7 +218,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { - entityFactory = new DefaultEntityFactory(); + List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); + entityFactory = unmatchedValueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); } else { entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); } -- Gitee From ce4f437556d56ea497c4c0a718108d779db4927d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 09:50:17 +0800 Subject: [PATCH 42/49] =?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 --- ...EntityFactory.java => UnmatchedValueObjEntityFactory.java} | 2 +- .../dorive/core/repository/AbstractContextRepository.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/{ValueObjEntityFactory.java => UnmatchedValueObjEntityFactory.java} (97%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java similarity index 97% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java index 9362c7bb..7bcd379c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java @@ -26,7 +26,7 @@ import com.gitee.dorive.core.entity.factory.FieldConverter; import java.util.List; import java.util.Map; -public class ValueObjEntityFactory extends DefaultEntityFactory { +public class UnmatchedValueObjEntityFactory extends DefaultEntityFactory { @Override @SuppressWarnings("unchecked") diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 3af19254..8197bf2c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -42,7 +42,7 @@ import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; +import com.gitee.dorive.core.impl.factory.UnmatchedValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; @@ -219,7 +219,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor EntityFactory entityFactory; if (factoryClass == Object.class) { List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); - entityFactory = unmatchedValueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); + entityFactory = unmatchedValueObjFields.isEmpty() ? new DefaultEntityFactory() : new UnmatchedValueObjEntityFactory(); } else { entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); } -- Gitee From db99c1dce4b39831b26cad7f520610ffe038f1a7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 09:54:46 +0800 Subject: [PATCH 43/49] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/Field.java | 8 ++++---- .../src/main/java/com/gitee/dorive/api/def/FieldDef.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java index 5f0ada19..fc28e069 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/Field.java @@ -51,14 +51,14 @@ public @interface Field { String alias() default ""; /** - * 映射表达式 + * 是否值对象 */ - String mapExp() default ""; + boolean valueObj() default false; /** - * 是否值对象 + * 映射表达式 */ - boolean valueObj() default false; + String mapExp() default ""; /** * 指定转换器 diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java index b8913a11..c62cfa30 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/def/FieldDef.java @@ -34,8 +34,8 @@ public class FieldDef { private boolean id; private String alias; - private String mapExp; private boolean valueObj; + private String mapExp; private Class converter; public static FieldDef fromElement(AnnotatedElement element) { -- Gitee From 28d9235c96889f84aec5823e66dcbcca3d336b5f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 12:14:06 +0800 Subject: [PATCH 44/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E9=85=8D?= =?UTF-8?q?=E7=BD=AE@Field=E4=BD=86=E6=9C=AA=E9=85=8D=E7=BD=AEalias?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/api/entity/EntityType.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java index fc574bb2..b173f83c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/EntityType.java @@ -28,6 +28,7 @@ import com.gitee.dorive.api.util.ReflectUtils; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -100,10 +101,16 @@ public class EntityType extends EntityEle { Map fieldAliasMapping = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); for (EntityField entityField : entityFieldMap.values()) { - String fieldName = entityField.getName(); + String name = entityField.getName(); + String alias = StrUtil.toUnderlineCase(name); FieldDef fieldDef = entityField.getFieldDef(); - String alias = fieldDef != null ? fieldDef.getAlias() : StrUtil.toUnderlineCase(fieldName); - fieldAliasMapping.put(fieldName, alias); + if (fieldDef != null) { + String aliasDef = fieldDef.getAlias(); + if (StringUtils.isNotBlank(aliasDef)) { + alias = aliasDef; + } + } + fieldAliasMapping.put(name, alias); } setFieldAliasMapping(fieldAliasMapping); } -- Gitee From f2f3e0673b58522e76477c8ea7578d2e79f2adf7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 15:12:14 +0800 Subject: [PATCH 45/49] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=80=BC=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=9A=84json=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/factory/EntityMapper.java | 3 ++ ...actory.java => ValueObjEntityFactory.java} | 37 ++++++++++++++++++- .../impl/resolver/EntityMapperResolver.java | 15 +++++++- .../repository/AbstractContextRepository.java | 6 +-- 4 files changed, 56 insertions(+), 5 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/{UnmatchedValueObjEntityFactory.java => ValueObjEntityFactory.java} (63%) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index f46b4195..1a036186 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -19,6 +19,7 @@ package com.gitee.dorive.core.api.factory; import com.gitee.dorive.core.entity.factory.FieldConverter; +import java.lang.reflect.Type; import java.util.List; public interface EntityMapper { @@ -29,4 +30,6 @@ public interface EntityMapper { List getUnmatchedValueObjFields(); + boolean isValueObjType(Type type); + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java similarity index 63% rename from dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java rename to dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index 7bcd379c..b7ec7cfb 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/UnmatchedValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -19,6 +19,11 @@ package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.convert.TypeConverter; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.factory.FieldConverter; @@ -26,7 +31,37 @@ import com.gitee.dorive.core.entity.factory.FieldConverter; import java.util.List; import java.util.Map; -public class UnmatchedValueObjEntityFactory extends DefaultEntityFactory { +public class ValueObjEntityFactory extends DefaultEntityFactory { + + // 从hutool源码中拷贝 + protected TypeConverter converter = (type, value) -> { + if (null == value) { + return null; + } + final String name = value.getClass().getName(); + if (ArrayUtil.contains(new String[]{"cn.hutool.json.JSONObject", "cn.hutool.json.JSONArray"}, name)) { + return ReflectUtil.invoke(value, "toBean", ObjectUtil.defaultIfNull(type, Object.class)); + } + return Convert.convertWithCheck(type, value, null, true); + }; + + @Override + public void setEntityMapper(EntityMapper entityMapper) { + super.setEntityMapper(entityMapper); + // 如果是值对象,则跳过hutool的类型转换 + getReCopyOptions().setConverter(((targetType, value) -> { + if (value == null || entityMapper.isValueObjType(targetType)) { + return value; + } + return converter.convert(targetType, value); + })); + getDeCopyOptions().setConverter(((targetType, value) -> { + if (value == null || entityMapper.isValueObjType(value.getClass())) { + return value; + } + return converter.convert(targetType, value); + })); + } @Override @SuppressWarnings("unchecked") diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 482086dd..4eeef386 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -34,10 +34,13 @@ import lombok.Data; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; @Data @AllArgsConstructor @@ -53,6 +56,8 @@ public class EntityMapperResolver { Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); List valueObjFields = new ArrayList<>(4); List unmatchedValueObjFields = new ArrayList<>(4); + Set valueObjTypes = new HashSet<>(6); + entityFieldMap.forEach((name, field) -> { String expected = entityEle.toAlias(name); boolean isMatch = aliasPropMapping.containsKey(expected); @@ -79,9 +84,11 @@ public class EntityMapperResolver { if (!isMatch) { unmatchedValueObjFields.add(fieldConverter); } + valueObjTypes.add(field.getGenericType()); } }); - return new DefaultEntityMapper(fieldConverterMap, valueObjFields, unmatchedValueObjFields); + + return new DefaultEntityMapper(fieldConverterMap, valueObjFields, unmatchedValueObjFields, valueObjTypes); } private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { @@ -113,12 +120,18 @@ public class EntityMapperResolver { private final Map fieldConverterMap; private final List valueObjFields; private final List unmatchedValueObjFields; + private final Set valueObjTypes; @Override public FieldConverter getField(String domain, String name) { return fieldConverterMap.get(getKey(domain, name)); } + @Override + public boolean isValueObjType(Type type) { + return valueObjTypes.contains(type); + } + } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 8197bf2c..281e2010 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -42,7 +42,7 @@ import com.gitee.dorive.core.impl.executor.ContextExecutor; import com.gitee.dorive.core.impl.executor.ExampleExecutor; import com.gitee.dorive.core.impl.executor.FactoryExecutor; import com.gitee.dorive.core.impl.factory.OperationFactory; -import com.gitee.dorive.core.impl.factory.UnmatchedValueObjEntityFactory; +import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedResolver; @@ -218,8 +218,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor Class factoryClass = entityDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { - List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); - entityFactory = unmatchedValueObjFields.isEmpty() ? new DefaultEntityFactory() : new UnmatchedValueObjEntityFactory(); + List valueObjFields = entityMapper.getValueObjFields(); + entityFactory = valueObjFields.isEmpty() ? new DefaultEntityFactory() : new ValueObjEntityFactory(); } else { entityFactory = (EntityFactory) applicationContext.getBean(factoryClass); } -- Gitee From 3940088076e48bf8fba8081e41e66ecba576df09 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 17:48:54 +0800 Subject: [PATCH 46/49] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=80=BC=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E9=9B=86=E5=90=88=E7=9A=84=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/converter/JsonArrayConverter.java | 43 +++++++++++++++++++ .../impl/factory/ValueObjEntityFactory.java | 31 +++++++++++-- .../impl/resolver/EntityMapperResolver.java | 7 ++- 3 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java new file mode 100644 index 00000000..9c01603b --- /dev/null +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/converter/JsonArrayConverter.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.core.impl.converter; + +import cn.hutool.json.JSONUtil; +import com.gitee.dorive.core.api.factory.Converter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class JsonArrayConverter implements Converter { + + private Class entityClass; + + @Override + public Object reconstitute(Object value) { + return JSONUtil.toList((String) value, entityClass); + } + + @Override + public Object deconstruct(Object value) { + return JSONUtil.toJsonStr(value); + } + +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index b7ec7cfb..35a431d4 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -24,10 +24,13 @@ import cn.hutool.core.convert.TypeConverter; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.json.JSONUtil; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.factory.FieldConverter; +import java.lang.reflect.ParameterizedType; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -48,16 +51,36 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { @Override public void setEntityMapper(EntityMapper entityMapper) { super.setEntityMapper(entityMapper); + // 如果是值对象,则跳过hutool的类型转换 getReCopyOptions().setConverter(((targetType, value) -> { - if (value == null || entityMapper.isValueObjType(targetType)) { - return value; + if (value == null) { + return null; + } + if (value instanceof String) { + if (targetType instanceof ParameterizedType) { + targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; + } + if (entityMapper.isValueObjType(targetType)) { + return value; + } } return converter.convert(targetType, value); })); + + // 如果是值对象,则跳过hutool的类型转换 getDeCopyOptions().setConverter(((targetType, value) -> { - if (value == null || entityMapper.isValueObjType(value.getClass())) { - return value; + if (value == null) { + return null; + } + if (targetType == String.class) { + // 运行时类型擦除,若优化需重写hutool逻辑 + if (value instanceof Collection) { + return JSONUtil.toJsonStr(value); + } + if (entityMapper.isValueObjType(value.getClass())) { + return value; + } } return converter.convert(targetType, value); })); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 4eeef386..65d62823 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -26,6 +26,7 @@ import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; +import com.gitee.dorive.core.impl.converter.JsonArrayConverter; import com.gitee.dorive.core.impl.converter.JsonConverter; import com.gitee.dorive.core.impl.converter.MapConverter; import com.gitee.dorive.core.impl.converter.MapExpConverter; @@ -100,7 +101,11 @@ public class EntityMapperResolver { } else if (isValueObj) { Class genericType = entityField.getGenericType(); - return isMatch ? new JsonConverter(genericType) : new MapConverter(genericType); + if (isMatch) { + return !entityField.isCollection() ? new JsonConverter(genericType) : new JsonArrayConverter(genericType); + } else { + return new MapConverter(genericType); + } } else if (StringUtils.isNotBlank(fieldDef.getMapExp())) { return new MapExpConverter(entityField); -- Gitee From 74159e73a929cff5c0266f570db71e796ac8ed19 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 19 Apr 2024 18:05:07 +0800 Subject: [PATCH 47/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gitee/dorive/api/annotation/ValueObj.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java index 20604c6a..752f755d 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/ValueObj.java @@ -39,4 +39,7 @@ public @interface ValueObj { @AliasFor(annotation = Field.class) boolean valueObj() default true; + @AliasFor(annotation = Field.class) + Class converter() default Object.class; + } -- Gitee From 2b338f7d5e910000c9108e1b7b3f6008ffcc266b Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 19 Apr 2024 21:47:42 +0800 Subject: [PATCH 48/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/api/factory/EntityMapper.java | 2 + .../impl/factory/ValueObjEntityFactory.java | 63 ++++++++++--------- .../impl/resolver/EntityMapperResolver.java | 8 ++- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java index 1a036186..5c7b4a87 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityMapper.java @@ -28,6 +28,8 @@ public interface EntityMapper { List getValueObjFields(); + List getMatchedValueObjFields(); + List getUnmatchedValueObjFields(); boolean isValueObjType(Type type); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index 35a431d4..ade41930 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -53,37 +53,38 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { super.setEntityMapper(entityMapper); // 如果是值对象,则跳过hutool的类型转换 - getReCopyOptions().setConverter(((targetType, value) -> { - if (value == null) { - return null; - } - if (value instanceof String) { - if (targetType instanceof ParameterizedType) { - targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; + List matchedValueObjFields = entityMapper.getMatchedValueObjFields(); + if (!matchedValueObjFields.isEmpty()) { + getReCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; } - if (entityMapper.isValueObjType(targetType)) { - return value; + if (value instanceof String) { + if (targetType instanceof ParameterizedType) { + targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; + } + if (entityMapper.isValueObjType(targetType)) { + return value; + } } - } - return converter.convert(targetType, value); - })); - - // 如果是值对象,则跳过hutool的类型转换 - getDeCopyOptions().setConverter(((targetType, value) -> { - if (value == null) { - return null; - } - if (targetType == String.class) { - // 运行时类型擦除,若优化需重写hutool逻辑 - if (value instanceof Collection) { - return JSONUtil.toJsonStr(value); + return converter.convert(targetType, value); + })); + getDeCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; } - if (entityMapper.isValueObjType(value.getClass())) { - return value; + if (targetType == String.class) { + // 运行时类型擦除,若优化需重写hutool逻辑 + if (value instanceof Collection) { + return JSONUtil.toJsonStr(value); + } + if (entityMapper.isValueObjType(value.getClass())) { + return value; + } } - } - return converter.convert(targetType, value); - })); + return converter.convert(targetType, value); + })); + } } @Override @@ -92,8 +93,8 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { Object entity = super.reconstitute(context, persistent); Map resultMap = (Map) persistent; EntityMapper entityMapper = getEntityMapper(); - List fieldConverters = entityMapper.getUnmatchedValueObjFields(); - for (FieldConverter fieldConverter : fieldConverters) { + List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); + for (FieldConverter fieldConverter : unmatchedValueObjFields) { Object valueObj = fieldConverter.reconstitute(resultMap); if (valueObj != null) { BeanUtil.setFieldValue(entity, fieldConverter.getName(), valueObj); @@ -106,8 +107,8 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { public Object deconstruct(Context context, Object entity) { Object pojo = super.deconstruct(context, entity); EntityMapper entityMapper = getEntityMapper(); - List fieldConverters = entityMapper.getUnmatchedValueObjFields(); - for (FieldConverter fieldConverter : fieldConverters) { + List unmatchedValueObjFields = entityMapper.getUnmatchedValueObjFields(); + for (FieldConverter fieldConverter : unmatchedValueObjFields) { Object valueObj = BeanUtil.getFieldValue(entity, fieldConverter.getName()); valueObj = valueObj != null ? fieldConverter.deconstruct(valueObj) : null; if (valueObj != null) { diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 65d62823..d08c52b2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -56,6 +56,7 @@ public class EntityMapperResolver { Map fieldConverterMap = new LinkedHashMap<>(entityFieldMap.size() * 4 / 3 + 1); List valueObjFields = new ArrayList<>(4); + List matchedValueObjFields = new ArrayList<>(4); List unmatchedValueObjFields = new ArrayList<>(4); Set valueObjTypes = new HashSet<>(6); @@ -82,14 +83,16 @@ public class EntityMapperResolver { names.forEach((domain, eachName) -> fieldConverterMap.put(getKey(domain, eachName), fieldConverter)); if (isValueObj) { valueObjFields.add(fieldConverter); - if (!isMatch) { + if (isMatch) { + matchedValueObjFields.add(fieldConverter); + } else { unmatchedValueObjFields.add(fieldConverter); } valueObjTypes.add(field.getGenericType()); } }); - return new DefaultEntityMapper(fieldConverterMap, valueObjFields, unmatchedValueObjFields, valueObjTypes); + return new DefaultEntityMapper(fieldConverterMap, valueObjFields, matchedValueObjFields, unmatchedValueObjFields, valueObjTypes); } private Converter newConverter(EntityField entityField, boolean isMatch, boolean isValueObj) { @@ -124,6 +127,7 @@ public class EntityMapperResolver { private final Map fieldConverterMap; private final List valueObjFields; + private final List matchedValueObjFields; private final List unmatchedValueObjFields; private final Set valueObjTypes; -- Gitee From 479b6fa2293a3a72bba87349280e387cbf9719a6 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 19 Apr 2024 22:00:28 +0800 Subject: [PATCH 49/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/factory/ValueObjEntityFactory.java | 66 +++++++++++-------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java index ade41930..eab46816 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/ValueObjEntityFactory.java @@ -51,40 +51,50 @@ public class ValueObjEntityFactory extends DefaultEntityFactory { @Override public void setEntityMapper(EntityMapper entityMapper) { super.setEntityMapper(entityMapper); - - // 如果是值对象,则跳过hutool的类型转换 List matchedValueObjFields = entityMapper.getMatchedValueObjFields(); if (!matchedValueObjFields.isEmpty()) { - getReCopyOptions().setConverter(((targetType, value) -> { - if (value == null) { - return null; + setReCopyOptions(); + setDeCopyOptions(); + } + } + + private void setReCopyOptions() { + // 如果是值对象,则跳过hutool的类型转换 + EntityMapper entityMapper = getEntityMapper(); + getReCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; + } + if (value instanceof String) { + if (targetType instanceof ParameterizedType) { + targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; } - if (value instanceof String) { - if (targetType instanceof ParameterizedType) { - targetType = ((ParameterizedType) targetType).getActualTypeArguments()[0]; - } - if (entityMapper.isValueObjType(targetType)) { - return value; - } + if (entityMapper.isValueObjType(targetType)) { + return value; } - return converter.convert(targetType, value); - })); - getDeCopyOptions().setConverter(((targetType, value) -> { - if (value == null) { - return null; + } + return converter.convert(targetType, value); + })); + } + + private void setDeCopyOptions() { + // 如果是值对象,则跳过hutool的类型转换 + EntityMapper entityMapper = getEntityMapper(); + getDeCopyOptions().setConverter(((targetType, value) -> { + if (value == null) { + return null; + } + if (targetType == String.class) { + // 运行时类型擦除,若优化需重写hutool逻辑 + if (value instanceof Collection) { + return JSONUtil.toJsonStr(value); } - if (targetType == String.class) { - // 运行时类型擦除,若优化需重写hutool逻辑 - if (value instanceof Collection) { - return JSONUtil.toJsonStr(value); - } - if (entityMapper.isValueObjType(value.getClass())) { - return value; - } + if (entityMapper.isValueObjType(value.getClass())) { + return value; } - return converter.convert(targetType, value); - })); - } + } + return converter.convert(targetType, value); + })); } @Override -- Gitee