diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java new file mode 100644 index 0000000000000000000000000000000000000000..c240e48dc059add004286650088fce04b0b72a0b --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/constant/OperationType.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.constant; + +public interface OperationType { + int NONE = 0x00000000; + int SELECT = 0x00000001; + int INSERT = 0x00000002; + int UPDATE = 0x00000004; + int INSERT_OR_UPDATE = INSERT | UPDATE; + int DELETE = 0x00000008; + int UPDATE_OR_DELETE = UPDATE | DELETE; + int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; + int FORCE_IGNORE = 0x00000010; + int FORCE_INSERT = 0x00000010 | INSERT; + int IGNORE_ROOT = 0x00000020; + int INCLUDE_ROOT = 0x00000040; +} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java index 0f5e2d1c918061cbc3ce82c958ca897c1419af7c..c9f7f3e92d359e9141faa515f3d5d10799ab4a1b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Delete.java @@ -17,10 +17,20 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.api.constant.OperationType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Delete extends Condition { public Delete(int type, Object entity) { super(type, entity); } + public Delete(Object entity) { + super(OperationType.DELETE, entity); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java index 52668150fc4c51bfb561d9c34b9a897d69bd3176..1a0ad3faafec1b1de7612b6729cc2d6b74e9299e 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Insert.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -28,4 +29,8 @@ public class Insert extends Operation { super(type, entity); } + public Insert(Object entity) { + super(OperationType.INSERT, entity); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java index d23865219f4cb827c28247e8caa19eb8c46440f8..3d1061edc3f702aaafa6622ba8aee9c94cb73b35 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/NullableUpdate.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.api.constant.OperationType; import lombok.Getter; import lombok.Setter; @@ -32,4 +33,8 @@ public class NullableUpdate extends Update { super(type, entity); } + public NullableUpdate(Object entity) { + super(OperationType.UPDATE, entity); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Operation.java index 30fbc2fc614c16d3b3682a05507c21f4d879d29d..3fee09dcc524a7db7ebced6784a840f48bdd0785 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 @@ -23,21 +23,6 @@ import lombok.Data; @Data @AllArgsConstructor public class Operation { - - public static final int NONE = 0x00000000; - public static final int SELECT = 0x00000001; - public static final int INSERT = 0x00000002; - public static final int UPDATE = 0x00000004; - public static final int DELETE = 0x00000008; - public static final int INSERT_OR_UPDATE = INSERT | UPDATE; - public static final int UPDATE_OR_DELETE = UPDATE | DELETE; - public static final int INSERT_OR_UPDATE_OR_DELETE = INSERT | UPDATE | DELETE; - public static final int FORCE_IGNORE = 0x00000010; - public static final int FORCE_INSERT = 0x00000010 | INSERT; - public static final int IGNORE_ROOT = 0x00000020; - public static final int INCLUDE_ROOT = 0x00000040; - private int type; private Object 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/Query.java index 8bdfb371a8d6168b740b5370838be2c45e45a43b..5001fec9549a68a9d872dda49666602c1a97cb2c 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,12 +17,22 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.api.constant.OperationType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Query extends Condition { public Query(int type, Object entity) { super(type, entity); } + public Query(Object entity) { + super(OperationType.SELECT, entity); + } + public boolean withoutPage() { return getExample().getPage() == null; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java index c8fba4041ed9b19afcd60837993af6a5051fb123..da5dc6a9cc011e37322daf4619a4d1248e6a3e7c 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/operation/Update.java @@ -17,10 +17,20 @@ package com.gitee.dorive.core.entity.operation; +import com.gitee.dorive.api.constant.OperationType; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Update extends Condition { public Update(int type, Object entity) { super(type, entity); } + public Update(Object entity) { + super(OperationType.UPDATE, entity); + } + } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java index 23d53df44a388095948d9513392524e95b052900..7c75add849defe43a8dc1a90626dd4b96b7a0586 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/ChainExecutor.java @@ -18,14 +18,16 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.lang.Assert; +import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.common.Binder; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.api.context.Selector; +import com.gitee.dorive.core.api.executor.EntityHandler; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.resolver.DelegateResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.CommonRepository; @@ -56,7 +58,7 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { Selector selector = context.getSelector(); CommonRepository rootRepository = repository.getRootRepository(); - boolean isIncludeRoot = (query.getType() & Operation.INCLUDE_ROOT) == Operation.INCLUDE_ROOT; + boolean isIncludeRoot = (query.getType() & OperationType.INCLUDE_ROOT) == OperationType.INCLUDE_ROOT; if (selector.matches(context, rootRepository) || isIncludeRoot) { int totalCount = 0; @@ -83,14 +85,15 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { @Override public int execute(Context context, Operation operation) { - int expectedOperation = operation.getType(); + int expectedType = operation.getType(); - boolean isInsertContext = (expectedOperation & Operation.INSERT) == Operation.INSERT; - boolean isIgnoreRoot = (expectedOperation & Operation.IGNORE_ROOT) == Operation.IGNORE_ROOT; - boolean isIncludeRoot = (expectedOperation & Operation.INCLUDE_ROOT) == Operation.INCLUDE_ROOT; + int realExpectedType = expectedType & OperationType.INSERT_OR_UPDATE_OR_DELETE; + int expectedIgnoreRoot = expectedType | OperationType.IGNORE_ROOT; + int expectedIncludeRoot = expectedType | OperationType.INCLUDE_ROOT; - int expectedIgnoreRoot = expectedOperation | Operation.IGNORE_ROOT; - int expectedIncludeRoot = expectedOperation | Operation.INCLUDE_ROOT; + boolean isInsertContext = (expectedType & OperationType.INSERT) == OperationType.INSERT; + boolean isIgnoreRoot = (expectedType & OperationType.IGNORE_ROOT) == OperationType.IGNORE_ROOT; + boolean isIncludeRoot = (expectedType & OperationType.INCLUDE_ROOT) == OperationType.INCLUDE_ROOT; Object rootEntity = operation.getEntity(); Assert.notNull(rootEntity, "The rootEntity cannot be null!"); @@ -100,100 +103,100 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { delegateRepository = delegateRepository == null ? repository : delegateRepository; Selector selector = context.getSelector(); - int totalCount = 0; for (CommonRepository repository : delegateRepository.getOrderedRepositories()) { - - if (isIgnoreRoot && repository.isRoot()) { + boolean root = repository.isRoot(); + if (isIgnoreRoot && root) { continue; } - boolean isMatch = selector.matches(context, repository); - boolean isForceInclude = isIncludeRoot && repository.isRoot(); + boolean isMatch = selector.matches(context, repository) || (isIncludeRoot && root); boolean isAggregated = repository.isAggregated(); - - if (!isMatch && !isForceInclude && !isAggregated) { + if (!isMatch && !isAggregated) { continue; } PropChain anchorPoint = repository.getAnchorPoint(); - Object targetEntity = anchorPoint == null ? rootEntity : anchorPoint.getValue(rootEntity); + Object targetEntity = root ? rootEntity : anchorPoint.getValue(rootEntity); if (targetEntity != null) { - Collection collection; - Object boundIdEntity = null; if (targetEntity instanceof Collection) { collection = (Collection) targetEntity; - } else { collection = Collections.singletonList(targetEntity); - boundIdEntity = targetEntity; } - - if (isMatch || isForceInclude) { - for (Object entity : collection) { - int finalOperation = mergeOperationType(expectedOperation, repository, entity); - - if ((finalOperation & Operation.INSERT) == Operation.INSERT) { - getBoundValueFromContext(context, rootEntity, repository, entity); + for (Object entity : collection) { + int operationType = OperationType.NONE; + boolean operable = false; + if (isMatch) { + operationType = mergeOperationType(realExpectedType, repository, entity); + operable = (operationType & OperationType.INSERT_OR_UPDATE_OR_DELETE) > 0; + if ((operationType & OperationType.INSERT) == OperationType.INSERT) { + getBoundValue(repository, context, rootEntity, entity); } + } + if (isAggregated) { + Operation newOperation = newOperation(realExpectedType, repository, context, entity); + newOperation.setType(operable ? expectedIncludeRoot : expectedIgnoreRoot); + totalCount += repository.execute(context, newOperation); - if (isAggregated) { - finalOperation = (finalOperation & Operation.INSERT_OR_UPDATE_OR_DELETE) > 0 ? expectedIncludeRoot : expectedIgnoreRoot; - Operation newOperation = new Operation(finalOperation, entity); - totalCount += repository.execute(context, newOperation); - + } else if (operable) { + if (root && realExpectedType == operationType) { + totalCount += repository.execute(context, operation); } else { - totalCount += doExecute(context, repository, entity, finalOperation); + totalCount += doExecute(operationType, repository, context, entity); } } - - if (isInsertContext && boundIdEntity != null) { - setBoundIdForBoundEntity(context, rootEntity, repository, boundIdEntity); - } - - } else if (isAggregated) { - for (Object entity : collection) { - Operation newOperation = new Operation(expectedIgnoreRoot, entity); - totalCount += repository.execute(context, newOperation); - } + } + if (isInsertContext && collection.size() == 1) { + setBoundId(repository, context, rootEntity, targetEntity); } } } return totalCount; } - private int mergeOperationType(int expectedOperation, CommonRepository repository, Object entity) { - if (expectedOperation == Operation.FORCE_INSERT) { - return Operation.INSERT; - - } else if (expectedOperation == Operation.INSERT_OR_UPDATE) { - return Operation.INSERT_OR_UPDATE; - + private int mergeOperationType(int realExpectedType, CommonRepository repository, Object entity) { + if (realExpectedType == OperationType.FORCE_INSERT) { + return OperationType.INSERT; } else { Object primaryKey = repository.getPrimaryKey(entity); - int operationType = primaryKey == null ? Operation.INSERT : Operation.UPDATE_OR_DELETE; - return expectedOperation & operationType; + int operationType = primaryKey == null ? OperationType.INSERT : OperationType.UPDATE_OR_DELETE; + return realExpectedType & operationType; } } - private int doExecute(Context context, CommonRepository repository, Object entity, int operationType) { - if (operationType == Operation.INSERT) { + private Operation newOperation(int realExpectedType, CommonRepository repository, Context context, Object entity) { + OperationFactory operationFactory = repository.getOperationFactory(); + if (realExpectedType == OperationType.INSERT) { + return operationFactory.buildInsert(context, entity); + + } else if (realExpectedType == OperationType.UPDATE) { + return operationFactory.buildUpdate(context, entity); + + } else if (realExpectedType == OperationType.INSERT_OR_UPDATE) { + return new Operation(OperationType.INSERT_OR_UPDATE, entity); + + } else if (realExpectedType == OperationType.DELETE) { + return operationFactory.buildDelete(context, entity); + } + throw new RuntimeException("Unsupported type!"); + } + + private int doExecute(int operationType, CommonRepository repository, Context context, Object entity) { + if (operationType == OperationType.INSERT) { return repository.insert(context, entity); - } else if (operationType == Operation.UPDATE) { + } else if (operationType == OperationType.UPDATE) { return repository.update(context, entity); - } else if (operationType == Operation.INSERT_OR_UPDATE) { - return repository.insertOrUpdate(context, entity); - - } else if (operationType == Operation.DELETE) { + } else if (operationType == OperationType.DELETE) { return repository.delete(context, entity); } return 0; } - private void getBoundValueFromContext(Context context, Object rootEntity, CommonRepository repository, Object entity) { + private void getBoundValue(CommonRepository repository, Context context, Object rootEntity, Object entity) { for (Binder binder : repository.getBinderResolver().getBoundValueBinders()) { Object fieldValue = binder.getFieldValue(context, entity); if (fieldValue == null) { @@ -205,7 +208,7 @@ public class ChainExecutor extends AbstractExecutor implements EntityHandler { } } - private void setBoundIdForBoundEntity(Context context, Object rootEntity, CommonRepository repository, Object entity) { + private void setBoundId(CommonRepository repository, Context context, Object rootEntity, Object entity) { Binder binder = repository.getBinderResolver().getBoundIdBinder(); if (binder != null) { Object boundValue = binder.getBoundValue(context, rootEntity); 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 3f16b858c1e74fa6d2a703352687852ef8078c04..950c2b0328582308413b064a849fe901c5ee74d1 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/OperationFactory.java @@ -17,8 +17,8 @@ package com.gitee.dorive.core.impl.factory; -import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.operation.*; import lombok.AllArgsConstructor; @@ -31,30 +31,30 @@ public class OperationFactory { private EntityEle entityEle; public Query buildQueryByPK(Context context, Object primaryKey) { - Query query = new Query(Operation.SELECT, null); + Query query = new Query(null); query.setPrimaryKey(primaryKey); return query; } public Query buildQuery(Context context, Example example) { - Query query = new Query(Operation.SELECT, null); + Query query = new Query(null); query.setExample(example); return query; } public Insert buildInsert(Context context, Object entity) { - return new Insert(Operation.INSERT, entity); + return new Insert(entity); } public Update buildUpdate(Context context, Object entity) { - Update update = new Update(Operation.UPDATE, entity); + Update update = new Update(entity); Object primaryKey = entityEle.getPkProxy().getValue(entity); update.setPrimaryKey(primaryKey); return update; } public Update buildUpdate(Context context, Object entity, Example example) { - Update update = new Update(Operation.UPDATE, entity); + Update update = new Update(entity); update.setExample(example); return update; } @@ -62,29 +62,29 @@ public class OperationFactory { public Operation buildInsertOrUpdate(Context context, Object entity) { Object primaryKey = entityEle.getPkProxy().getValue(entity); if (primaryKey == null) { - return new Insert(Operation.INSERT, entity); + return new Insert(entity); } else { - Update update = new Update(Operation.UPDATE, entity); + Update update = new Update(entity); update.setPrimaryKey(primaryKey); return update; } } public Delete buildDelete(Context context, Object entity) { - Delete delete = new Delete(Operation.DELETE, entity); + Delete delete = new Delete(entity); Object primaryKey = entityEle.getPkProxy().getValue(entity); delete.setPrimaryKey(primaryKey); return delete; } public Delete buildDeleteByPK(Context context, Object primaryKey) { - Delete delete = new Delete(Operation.DELETE, null); + Delete delete = new Delete(null); delete.setPrimaryKey(primaryKey); return delete; } public Delete buildDelete(Context context, Example example) { - Delete delete = new Delete(Operation.DELETE, null); + Delete delete = new Delete(null); delete.setExample(example); return delete; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index a5608ec9004fb115cc24ef25823678633c21746e..c56acc00e805a227eeaf5af5b7c2bf69880487a5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -18,6 +18,7 @@ package com.gitee.dorive.core.impl.handler; import com.gitee.dorive.api.api.PropProxy; +import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.api.entity.element.PropChain; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.EntityHandler; @@ -26,7 +27,6 @@ import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.repository.AbstractContextRepository; @@ -60,7 +60,7 @@ public class BatchEntityHandler implements EntityHandler { UnionExample unionExample = newUnionExample(repository, context, rootEntities); if (unionExample.isDirtyQuery()) { Query query = operationFactory.buildQuery(context, unionExample); - query.setType(query.getType() | Operation.INCLUDE_ROOT); + query.setType(query.getType() | OperationType.INCLUDE_ROOT); Result result = repository.executeQuery(context, query); if (result instanceof EntityIndex) { setValueForRootEntities(repository, rootEntities, (EntityIndex) result); 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 f00f0e19feba95bdd3bb244675db10cd15fc2014..ebfec9df0d55ab528bbffb851152e1b7845f71e2 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractGenericRepository.java @@ -18,6 +18,7 @@ package com.gitee.dorive.core.repository; import cn.hutool.core.lang.Assert; +import com.gitee.dorive.api.constant.OperationType; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Selector; import com.gitee.dorive.core.entity.context.InnerContext; @@ -52,7 +53,7 @@ public abstract class AbstractGenericRepository extends AbstractContextRe @Override public int insertOrUpdate(Context context, E entity) { Assert.notNull(entity, "The entity cannot be null!"); - Operation operation = new Operation(Operation.INSERT_OR_UPDATE, entity); + Operation operation = new Operation(OperationType.INSERT_OR_UPDATE, entity); return execute(context, operation); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java index 7da05f5d0e177661a277b4ac1d3c5fd34d8dbf26..a021277f482a4b15f3b3809be29ad16025df4f53 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/api/EntityListener.java @@ -17,10 +17,10 @@ package com.gitee.dorive.event.api; -import com.gitee.dorive.event.entity.RepositoryEvent; +import com.gitee.dorive.event.entity.ExecutorEvent; public interface EntityListener { - void onApplicationEvent(RepositoryEvent repositoryEvent); + void onApplicationEvent(ExecutorEvent executorEvent); } 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/ExecutorEvent.java similarity index 82% rename from dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java rename to dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 2b772deb2c1fbc4840b64476a42ec46baf500ec9..09185077064e899dc63befc3dc88b43d4bbb8112 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -19,21 +19,20 @@ 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.repository.EventRepository; +import com.gitee.dorive.event.impl.EventExecutor; import lombok.Getter; import lombok.Setter; import org.springframework.context.ApplicationEvent; @Getter @Setter -public class RepositoryEvent extends ApplicationEvent { +public class ExecutorEvent extends ApplicationEvent { - private String methodName; private Context context; private Operation operation; - public RepositoryEvent(EventRepository eventRepository) { - super(eventRepository); + public ExecutorEvent(EventExecutor eventExecutor) { + super(eventExecutor); } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..02d932ac7f4cf69ecd40b8fdce9a895f072bb005 --- /dev/null +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/EventExecutor.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.event.impl; + +import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.context.Context; +import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.entity.executor.Result; +import com.gitee.dorive.core.entity.operation.Operation; +import com.gitee.dorive.core.entity.operation.Query; +import com.gitee.dorive.core.impl.executor.AbstractExecutor; +import com.gitee.dorive.event.entity.ExecutorEvent; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.context.ApplicationContext; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class EventExecutor extends AbstractExecutor { + + private ApplicationContext applicationContext; + private EntityEle entityEle; + private Executor executor; + + @Override + public Result executeQuery(Context context, Query query) { + return executor.executeQuery(context, query); + } + + @Override + public int execute(Context context, Operation operation) { + int count = executor.execute(context, operation); + if (count != 0) { + ExecutorEvent executorEvent = new ExecutorEvent(this); + executorEvent.setContext(context); + executorEvent.setOperation(operation); + applicationContext.publishEvent(executorEvent); + } + return count; + } + +} diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java index e81066b19999776b1efd7d1625a8edbaeb1aa241..a70ba762b0473163d7c7a63a359f73e9b6d89703 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/RepositoryListener.java @@ -17,10 +17,10 @@ package com.gitee.dorive.event.impl; +import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.event.annotation.Listener; import com.gitee.dorive.event.api.EntityListener; -import com.gitee.dorive.event.entity.RepositoryEvent; -import com.gitee.dorive.event.repository.EventRepository; +import com.gitee.dorive.event.entity.ExecutorEvent; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; @Slf4j -public class RepositoryListener implements ApplicationListener, ApplicationContextAware, InitializingBean { +public class RepositoryListener implements ApplicationListener, ApplicationContextAware, InitializingBean { private ApplicationContext applicationContext; private final Map, List> classEventListenersMap = new LinkedHashMap<>(); @@ -62,9 +62,10 @@ public class RepositoryListener implements ApplicationListener, } @Override - public void onApplicationEvent(RepositoryEvent event) { - EventRepository repository = (EventRepository) event.getSource(); - Class entityClass = repository.getEntityClass(); + public void onApplicationEvent(ExecutorEvent event) { + EventExecutor executor = (EventExecutor) event.getSource(); + EntityEle entityEle = executor.getEntityEle(); + Class entityClass = entityEle.getGenericType(); List entityListeners = classEventListenersMap.get(entityClass); if (entityListeners != null && !entityListeners.isEmpty()) { for (EntityListener entityListener : entityListeners) { 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 93373db7718430f632815db36278234c5a0e79ed..830111fbe20534340585af19bf86805fafe59ee8 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -17,15 +17,16 @@ package com.gitee.dorive.event.repository; +import com.gitee.dorive.api.entity.element.EntityEle; +import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.repository.AbstractGenericRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.DefaultRepository; import com.gitee.dorive.core.repository.ProxyRepository; import com.gitee.dorive.event.annotation.EnableEvent; +import com.gitee.dorive.event.impl.EventExecutor; import org.springframework.core.annotation.AnnotationUtils; -import java.util.concurrent.ConcurrentHashMap; - public abstract class AbstractEventRepository extends AbstractGenericRepository { private boolean enableEvent; @@ -46,13 +47,10 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo } if (innerRepository instanceof DefaultRepository) { DefaultRepository defaultRepository = (DefaultRepository) innerRepository; - EventRepository eventRepository = new EventRepository(getApplicationContext()); - eventRepository.setEntityDef(defaultRepository.getEntityDef()); - eventRepository.setEntityEle(defaultRepository.getEntityEle()); - eventRepository.setOperationFactory(defaultRepository.getOperationFactory()); - eventRepository.setProxyRepository(repository); - eventRepository.setAttachments(new ConcurrentHashMap<>(defaultRepository.getAttachments())); - return eventRepository; + EntityEle entityEle = defaultRepository.getEntityEle(); + Executor executor = defaultRepository.getExecutor(); + executor = new EventExecutor(getApplicationContext(), entityEle, executor); + defaultRepository.setExecutor(executor); } } return repository; diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/EventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/EventRepository.java deleted file mode 100644 index 828aeaad6d2471064db7d84586352845f7ae1253..0000000000000000000000000000000000000000 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/EventRepository.java +++ /dev/null @@ -1,137 +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.event.repository; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Update; -import com.gitee.dorive.core.repository.ProxyRepository; -import com.gitee.dorive.event.entity.RepositoryEvent; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.context.ApplicationContext; - -@Data -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class EventRepository extends ProxyRepository { - - private ApplicationContext applicationContext; - - @Override - public int insert(Context context, Object entity) { - int count = super.insert(context, entity); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("insert"); - repositoryEvent.setContext(context); - repositoryEvent.setOperation(new Insert(Operation.INSERT, entity)); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int update(Context context, Object entity) { - int count = super.update(context, entity); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("update"); - repositoryEvent.setContext(context); - repositoryEvent.setOperation(new Update(Operation.UPDATE, entity)); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int updateByExample(Context context, Object entity, Example example) { - int count = super.updateByExample(context, entity, example); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("updateByExample"); - repositoryEvent.setContext(context); - Update update = new Update(Operation.UPDATE, entity); - update.setExample(example); - repositoryEvent.setOperation(update); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int insertOrUpdate(Context context, Object entity) { - int count = super.insertOrUpdate(context, entity); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("insertOrUpdate"); - repositoryEvent.setContext(context); - repositoryEvent.setOperation(new Operation(Operation.INSERT_OR_UPDATE, entity)); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int delete(Context context, Object entity) { - int count = super.delete(context, entity); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("delete"); - repositoryEvent.setContext(context); - repositoryEvent.setOperation(new Delete(Operation.DELETE, entity)); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int deleteByPrimaryKey(Context context, Object primaryKey) { - int count = super.deleteByPrimaryKey(context, primaryKey); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("deleteByPrimaryKey"); - repositoryEvent.setContext(context); - Delete delete = new Delete(Operation.DELETE, null); - delete.setPrimaryKey(primaryKey); - repositoryEvent.setOperation(delete); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - - @Override - public int deleteByExample(Context context, Example example) { - int count = super.deleteByExample(context, example); - if (count != 0) { - RepositoryEvent repositoryEvent = new RepositoryEvent(this); - repositoryEvent.setMethodName("deleteByExample"); - repositoryEvent.setContext(context); - Delete delete = new Delete(Operation.DELETE, null); - delete.setExample(example); - repositoryEvent.setOperation(delete); - applicationContext.publishEvent(repositoryEvent); - } - return count; - } - -} diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java index 7bd05b1c087a4b9283b73a30aed1eabed24642e5..44efc9c827657fcd3ed44102817fd1cc32f3fa48 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/impl/executor/FactoryExecutor.java @@ -102,6 +102,7 @@ public class FactoryExecutor extends AbstractExecutor { Object primaryKey = BeanUtil.getFieldValue(persistent, "id"); entityEle.getPkProxy().setValue(entity, primaryKey); } + operation.setEntity(entity); return totalCount; } diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java index 018b493ee54e5d5e5a60f74c9d852c8c90144a16..822a7bbe65ac39ae72568b92b99c505a10847a81 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/dorive/spring/boot/starter/repository/MybatisPlusExecutor.java @@ -30,17 +30,8 @@ import com.gitee.dorive.api.constant.Order; import com.gitee.dorive.api.entity.def.EntityDef; import com.gitee.dorive.api.entity.element.EntityEle; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.executor.Criterion; -import com.gitee.dorive.core.entity.executor.Example; -import com.gitee.dorive.core.entity.executor.OrderBy; -import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; -import com.gitee.dorive.core.entity.operation.Delete; -import com.gitee.dorive.core.entity.operation.Insert; -import com.gitee.dorive.core.entity.operation.NullableUpdate; -import com.gitee.dorive.core.entity.operation.Operation; -import com.gitee.dorive.core.entity.operation.Query; -import com.gitee.dorive.core.entity.operation.Update; +import com.gitee.dorive.core.entity.executor.*; +import com.gitee.dorive.core.entity.operation.*; import com.gitee.dorive.core.impl.executor.AbstractExecutor; import com.gitee.dorive.spring.boot.starter.api.CriterionAppender; import com.gitee.dorive.spring.boot.starter.entity.QueryResult;