From bbfe8479b179f7af12822a4fcb46d8e11613b88f Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 05:22:13 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anwen/mongo/annotation/TableLogic.java | 35 ++ .../config/MongoPlusAutoConfiguration.java | 119 +++++-- .../mongo/property/MongoLogicDelProperty.java | 65 ++++ .../main/resources/META-INF/spring.factories | 3 +- ...ot.autoconfigure.AutoConfiguration.imports | 3 +- .../cache/global/ClassLogicDeleteCache.java | 26 ++ .../anwen/mongo/logic/AnnotationHandler.java | 52 +++ .../anwen/mongo/logic/LogicDeleteHandler.java | 103 ++++++ .../mongo/mapper/DefaultBaseMapperImpl.java | 317 +++++++++++------- .../mongo/model/ClassAnnotationFiled.java | 49 +++ .../anwen/mongo/model/LogicDeleteResult.java | 49 +++ .../anwen/mongo/toolkit/AnnotationUtil.java | 38 ++- .../java/com/anwen/mongoa/entity/Base.java | 13 + 13 files changed, 720 insertions(+), 152 deletions(-) create mode 100644 mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java create mode 100644 mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/logic/AnnotationHandler.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/ClassAnnotationFiled.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicDeleteResult.java create mode 100644 mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java new file mode 100644 index 0000000..bd206d3 --- /dev/null +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java @@ -0,0 +1,35 @@ +package com.anwen.mongo.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 表字段逻辑处理注解(逻辑删除) + * + * @author loser + * @date 2024/4/28 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +public @interface TableLogic { + + /** + * 开启全局配置 并忽略该文档(任意补充在某一个字段上,建议跟@ID 相同) + */ + boolean close() default false; + + /** + * 默认逻辑未删除值(该值可无、会自动获取全局配置) + */ + String value() default ""; + + /** + * 默认逻辑删除值(该值可无、会自动获取全局配置) + */ + String delval() default ""; + +} diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index f3a1e43..44a3c6a 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -1,6 +1,8 @@ package com.anwen.mongo.config; +import com.anwen.mongo.annotation.TableLogic; import com.anwen.mongo.annotation.collection.CollectionName; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.cache.global.ListenerCache; @@ -14,15 +16,20 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.listener.Listener; import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; +import com.anwen.mongo.logic.AnnotationHandler; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; +import com.anwen.mongo.model.ClassAnnotationFiled; +import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBLogProperty; +import com.anwen.mongo.property.MongoLogicDelProperty; import com.anwen.mongo.service.IService; import com.anwen.mongo.service.impl.ServiceImpl; import com.anwen.mongo.strategy.convert.ConversionService; import com.anwen.mongo.strategy.convert.ConversionStrategy; import com.anwen.mongo.toolkit.CollUtil; +import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.MongoException; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; @@ -35,11 +42,19 @@ import org.springframework.context.ApplicationContext; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** * MongoPlus自动注入配置 + * * @author JiaChaoYang **/ @EnableConfigurationProperties(MongoDBLogProperty.class) @@ -53,23 +68,27 @@ public class MongoPlusAutoConfiguration implements InitializingBean { private final MongoDBCollectionProperty mongodbCollectionProperty; + private final MongoLogicDelProperty mongoLogicDelProperty; + private final CollectionNameConvert collectionNameConvert; private final BaseMapper baseMapper; Logger logger = LoggerFactory.getLogger(MongoPlusAutoConfiguration.class); - public MongoPlusAutoConfiguration(MongoDBLogProperty mongodbLogProperty, MongoDBCollectionProperty mongodbCollectionProperty, BaseMapper baseMapper, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { + public MongoPlusAutoConfiguration(MongoDBLogProperty mongodbLogProperty, MongoDBCollectionProperty mongodbCollectionProperty, MongoLogicDelProperty mongoLogicDelProperty, BaseMapper baseMapper, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { this.mongoPlusClient = mongoPlusClient; this.applicationContext = applicationContext; this.mongodbLogProperty = mongodbLogProperty; this.mongodbCollectionProperty = mongodbCollectionProperty; + this.mongoLogicDelProperty = mongoLogicDelProperty; this.collectionNameConvert = collectionNameConvert; setConversion(); setMetaObjectHandler(); setDocumentHandler(); setListener(); setInterceptor(); + setLogicDelete(); this.baseMapper = baseMapper; } @@ -79,7 +98,54 @@ public class MongoPlusAutoConfiguration implements InitializingBean { .values() .stream() .filter(s -> s instanceof ServiceImpl) - .forEach(s -> setExecute((ServiceImpl) s, s.getGenericityClass())); + .forEach(s -> { + setExecute((ServiceImpl) s, s.getGenericityClass()); + setLogicFiled(s.getGenericityClass()); + }); + } + + private void setLogicDelete() { + + if (Objects.isNull(mongoLogicDelProperty)) { + return; + } + ClassLogicDeleteCache.open = mongoLogicDelProperty.getOpen(); + + } + + private void setLogicFiled(Class clazz) { + + if (Objects.isNull(mongoLogicDelProperty) || !mongoLogicDelProperty.getOpen()) { + return; + } + + Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; + ClassAnnotationFiled targetInfo = AnnotationHandler.getAnnotationOnFiled(clazz, TableLogic.class); + // 优先使用每个对象自定义规则 + if (Objects.nonNull(targetInfo)) { + TableLogic annotation = targetInfo.getTargetAnnotation(); + if (annotation.close()) { + return; + } + LogicDeleteResult result = new LogicDeleteResult(); + result.setColumn(targetInfo.getField().getName()); + result.setLogicDeleteValue(StringUtils.isNotBlank(annotation.delval()) ? annotation.delval() : mongoLogicDelProperty.getLogicDeleteValue()); + result.setLogicNotDeleteValue(StringUtils.isNotBlank(annotation.value()) ? annotation.value() : mongoLogicDelProperty.getLogicNotDeleteValue()); + logicDeleteResultHashMap.put(clazz, result); + return; + } + + // 其次使用全局配置规则 + if (StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicDeleteField()) + && StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicDeleteValue()) + && StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicNotDeleteValue())) { + LogicDeleteResult result = new LogicDeleteResult(); + result.setColumn(mongoLogicDelProperty.getLogicDeleteField()); + result.setLogicDeleteValue(mongoLogicDelProperty.getLogicDeleteValue()); + result.setLogicNotDeleteValue(mongoLogicDelProperty.getLogicNotDeleteValue()); + logicDeleteResultHashMap.put(clazz, result); + } + } private void setExecute(ServiceImpl serviceImpl, Class clazz) { @@ -108,12 +174,12 @@ public class MongoPlusAutoConfiguration implements InitializingBean { ConnectMongoDB connectMongodb = new ConnectMongoDB(mongoPlusClient.getMongoClient(), db, finalCollectionName); MongoDatabase mongoDatabase = mongoPlusClient.getMongoClient().getDatabase(db); mongoDatabaseList.add(mongoDatabase); - if (Objects.equals(db, finalDataBaseName[0])){ + if (Objects.equals(db, finalDataBaseName[0])) { MongoCollection collection = connectMongodb.open(mongoDatabase); - collectionManager.setCollectionMap(finalCollectionName,collection); + collectionManager.setCollectionMap(finalCollectionName, collection); } - mongoPlusClient.getCollectionManagerMap().put(DataSourceConstant.DEFAULT_DATASOURCE,new HashMap(){{ - put(db,collectionManager); + mongoPlusClient.getCollectionManagerMap().put(DataSourceConstant.DEFAULT_DATASOURCE, new HashMap() {{ + put(db, collectionManager); }}); }); mongoPlusClient.setMongoDatabase(mongoDatabaseList); @@ -125,24 +191,25 @@ public class MongoPlusAutoConfiguration implements InitializingBean { /** * 从Bean中拿到转换器 + * * @author JiaChaoYang * @date 2023/10/19 12:49 - */ + */ @SuppressWarnings("unchecked") - private void setConversion(){ + private void setConversion() { applicationContext.getBeansOfType(ConversionStrategy.class).values().forEach(conversionStrategy -> { try { Type[] genericInterfaces = conversionStrategy.getClass().getGenericInterfaces(); for (Type anInterface : genericInterfaces) { ParameterizedType parameterizedType = (ParameterizedType) anInterface; - if (parameterizedType.getRawType().equals(ConversionStrategy.class)){ + if (parameterizedType.getRawType().equals(ConversionStrategy.class)) { Class clazz = (Class) parameterizedType.getActualTypeArguments()[0]; - ConversionService.appendConversion(clazz,conversionStrategy); + ConversionService.appendConversion(clazz, conversionStrategy); break; } } - }catch (Exception e){ - logger.error("Unknown converter type",e); + } catch (Exception e) { + logger.error("Unknown converter type", e); throw new MongoException("Unknown converter type"); } }); @@ -150,37 +217,40 @@ public class MongoPlusAutoConfiguration implements InitializingBean { /** * 从Bean中拿到自动填充策略 + * * @author JiaChaoYang * @date 2023/11/21 12:18 - */ - private void setMetaObjectHandler(){ + */ + private void setMetaObjectHandler() { applicationContext.getBeansOfType(MetaObjectHandler.class).values().forEach(metaObjectHandler -> HandlerCache.metaObjectHandler = metaObjectHandler); } /** * 从Bean中拿到Document的处理器 + * * @author JiaChaoYang * @date 2023/11/23 12:58 - */ - private void setDocumentHandler(){ + */ + private void setDocumentHandler() { applicationContext.getBeansOfType(DocumentHandler.class).values().forEach(documentHandler -> HandlerCache.documentHandler = documentHandler); } /** * 从Bean中拿到监听器 + * * @author JiaChaoYang * @date 2023/11/22 18:39 - */ - private void setListener(){ + */ + private void setListener() { List listeners = new ArrayList<>(); - if (mongodbLogProperty.getLog()){ + if (mongodbLogProperty.getLog()) { listeners.add(new LogListener()); } - if (mongodbCollectionProperty.getBlockAttackInner()){ + if (mongodbCollectionProperty.getBlockAttackInner()) { listeners.add(new BlockAttackInnerListener()); } Collection listenerCollection = applicationContext.getBeansOfType(Listener.class).values(); - if (CollUtil.isNotEmpty(listenerCollection)){ + if (CollUtil.isNotEmpty(listenerCollection)) { listeners.addAll(listenerCollection); } ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); @@ -188,10 +258,11 @@ public class MongoPlusAutoConfiguration implements InitializingBean { /** * 从Bean中拿到拦截器 + * * @author JiaChaoYang * @date 2024/3/17 0:30 - */ - private void setInterceptor(){ + */ + private void setInterceptor() { Collection interceptorCollection = applicationContext.getBeansOfType(Interceptor.class).values(); if (CollUtil.isNotEmpty(interceptorCollection)) { interceptorCollection = interceptorCollection.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java new file mode 100644 index 0000000..d47d05e --- /dev/null +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java @@ -0,0 +1,65 @@ +package com.anwen.mongo.property; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 逻辑删除配置 + * + * @author loser + * @date 2024/4/28 + */ +@ConfigurationProperties(prefix = "mongo-plus.configuration.logic") +public class MongoLogicDelProperty { + + /** + * 是否开启逻辑删除功能 + */ + private Boolean open = false; + + /** + * 逻辑删除全局属性名 + */ + private String logicDeleteField; + + /** + * 逻辑删除全局值(默认 1、表示已删除) + */ + private String logicDeleteValue = "1"; + + /** + * 逻辑未删除全局值(默认 0、表示未删除) + */ + private String logicNotDeleteValue = "0"; + + public Boolean getOpen() { + return open; + } + + public void setOpen(Boolean open) { + this.open = open; + } + + public String getLogicDeleteField() { + return logicDeleteField; + } + + public void setLogicDeleteField(String logicDeleteField) { + this.logicDeleteField = logicDeleteField; + } + + public String getLogicDeleteValue() { + return logicDeleteValue; + } + + public void setLogicDeleteValue(String logicDeleteValue) { + this.logicDeleteValue = logicDeleteValue; + } + + public String getLogicNotDeleteValue() { + return logicNotDeleteValue; + } + + public void setLogicNotDeleteValue(String logicNotDeleteValue) { + this.logicNotDeleteValue = logicNotDeleteValue; + } +} diff --git a/mongo-plus-boot-starter/src/main/resources/META-INF/spring.factories b/mongo-plus-boot-starter/src/main/resources/META-INF/spring.factories index 2d5f7d3..fd8a5e4 100644 --- a/mongo-plus-boot-starter/src/main/resources/META-INF/spring.factories +++ b/mongo-plus-boot-starter/src/main/resources/META-INF/spring.factories @@ -5,4 +5,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.anwen.mongo.property.MongoSpringProperty,\ com.anwen.mongo.property.MongoDBFieldProperty,\ com.anwen.mongo.transactional.MongoTransactionManagerAutoConfiguration,\ - com.anwen.mongo.config.MongoPropertyConfiguration + com.anwen.mongo.config.MongoPropertyConfiguration,\ + com.anwen.mongo.property.MongoLogicDelProperty diff --git a/mongo-plus-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/mongo-plus-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index cd843cc..86368e2 100644 --- a/mongo-plus-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/mongo-plus-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,4 +4,5 @@ com.anwen.mongo.config.OverrideMongoConfiguration com.anwen.mongo.property.MongoSpringProperty com.anwen.mongo.property.MongoDBFieldProperty com.anwen.mongo.transactional.MongoTransactionManagerAutoConfiguration -com.anwen.mongo.config.MongoPropertyConfiguration \ No newline at end of file +com.anwen.mongo.config.MongoPropertyConfiguration +com.anwen.mongo.property.MongoLogicDelProperty \ No newline at end of file diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java new file mode 100644 index 0000000..2684ebe --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java @@ -0,0 +1,26 @@ +package com.anwen.mongo.cache.global; + +import com.anwen.mongo.model.LogicDeleteResult; + +import java.util.HashMap; +import java.util.Map; + +/** + * 全局逻辑删除基础信息缓存 + * + * @author loser + * @date 2024/4/29 + */ +public class ClassLogicDeleteCache { + + /** + * 是否开启逻辑删除功能 + */ + public static Boolean open = false; + + /** + * 目标文档对应的逻辑删除字段 + */ + public static final Map, LogicDeleteResult> logicDeleteResultHashMap = new HashMap<>(); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/AnnotationHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/AnnotationHandler.java new file mode 100644 index 0000000..db73669 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/AnnotationHandler.java @@ -0,0 +1,52 @@ +package com.anwen.mongo.logic; + + +import com.anwen.mongo.model.ClassAnnotationFiled; +import com.anwen.mongo.toolkit.AnnotationUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.Objects; + +/** + * 注解处理类 + * + * @author loser + * @date 2024/4/29 + */ +public interface AnnotationHandler { + + /** + * 从类的所有字段上获取注解 + * + * @param beanClass 类的class + * @param annotationClass 要获取的注解class + * @return 逻辑删除的字段信息 + */ + static ClassAnnotationFiled getAnnotationOnFiled(Class beanClass, Class annotationClass) { + for (Field field : beanClass.getDeclaredFields()) { + T annotation = getAnnotation(field, annotationClass); + if (Objects.nonNull(annotation)) { + return new ClassAnnotationFiled<>(beanClass, field, annotation); + } + } + Class superclass = beanClass.getSuperclass(); + if (!Objects.equals(superclass, Object.class)) { + return getAnnotationOnFiled(superclass, annotationClass); + } + return null; + } + + /** + * 从字段上获取注解 + * + * @param field 字段 + * @param annotationClass 要获取的注解class + * @param 具体注解 + * @return 注解 + */ + static T getAnnotation(Field field, Class annotationClass) { + return AnnotationUtil.findFirstAnnotation(annotationClass, field); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java new file mode 100644 index 0000000..8f51716 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java @@ -0,0 +1,103 @@ +package com.anwen.mongo.logic; + +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.conditions.BuildCondition; +import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; +import com.anwen.mongo.conditions.query.LambdaQueryChainWrapper; +import com.anwen.mongo.conditions.query.QueryChainWrapper; +import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.toolkit.ChainWrappers; +import com.mongodb.BasicDBObject; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.bson.conversions.Bson; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 逻辑删除处理类 + * + * @author loser + * @date 2024/4/29 + */ +public interface LogicDeleteHandler { + + /** + * 是否关闭逻辑删除功能 + */ + static boolean close() { + return !ClassLogicDeleteCache.open; + } + + static Map, LogicDeleteResult> mapper() { + return ClassLogicDeleteCache.logicDeleteResultHashMap; + } + + /** + * bson 对象添加逻辑未删除条件 + * + * @param query 查询条件 + * @param clazz 目标文档 + * @param 文档类型 + * @return 添加逻辑未删除的条件对象 + */ + static Bson doBsonLogicDel(Bson query, Class clazz) { + + if (close()) { + return query; + } + LogicDeleteResult result = mapper().get(clazz); + if (Objects.isNull(result)) { + return query; + } + if (Objects.isNull(query)) { + LambdaQueryChainWrapper wrapper = ChainWrappers.lambdaQueryChain(null, clazz); + wrapper.eq(result.getColumn(), result.getLogicNotDeleteValue()); + return BuildCondition.buildQueryCondition(wrapper.getCompareList()); + } + if (query instanceof BasicDBObject) { + BasicDBObject bdb = (BasicDBObject) query; + bdb.put(result.getColumn(), new BsonString(result.getLogicNotDeleteValue())); + return bdb; + } + BsonDocument bsonDocument = query.toBsonDocument(); + bsonDocument.append(result.getColumn(), new BsonString(result.getLogicNotDeleteValue())); + return bsonDocument; + + } + + /** + * 给 wrapper 对象添加逻辑未删除对象 + * + * @param queryChainWrapper wrapper 条件包裹对象 + * @param clazz 目标文档 + * @param 文档类型 + * @return 添加逻辑未删除的条件集合 + */ + @SuppressWarnings("unchecked") + static List doWrapperLogicDel(QueryChainWrapper queryChainWrapper, Class clazz) { + + if (close()) { + if (Objects.isNull(queryChainWrapper)) { + return null; + } + return queryChainWrapper.getCompareList(); + } + LogicDeleteResult result = ClassLogicDeleteCache.logicDeleteResultHashMap.get(clazz); + if (Objects.isNull(result)) { + if (Objects.isNull(queryChainWrapper)) { + return null; + } + return queryChainWrapper.getCompareList(); + } + if (Objects.isNull(queryChainWrapper)) { + queryChainWrapper = ChainWrappers.lambdaQueryChain(null, clazz); + } + queryChainWrapper.eq(result.getColumn(), result.getLogicNotDeleteValue()); + return queryChainWrapper.getCompareList(); + + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index abd5d18..82309f8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -16,16 +16,39 @@ import com.anwen.mongo.enums.IdTypeEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.manager.MongoPlusClient; -import com.anwen.mongo.model.*; +import com.anwen.mongo.model.AggregateBasicDBObject; +import com.anwen.mongo.model.BaseAggregate; +import com.anwen.mongo.model.BaseLambdaQueryResult; +import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.model.MutablePair; +import com.anwen.mongo.model.PageParam; +import com.anwen.mongo.model.PageResult; import com.anwen.mongo.strategy.convert.ConversionService; -import com.anwen.mongo.toolkit.*; +import com.anwen.mongo.toolkit.ClassTypeUtil; +import com.anwen.mongo.toolkit.CollUtil; +import com.anwen.mongo.toolkit.DocumentUtil; +import com.anwen.mongo.toolkit.ExecuteUtil; +import com.anwen.mongo.toolkit.Generate; +import com.anwen.mongo.toolkit.LambdaOperate; +import com.anwen.mongo.toolkit.ReflectionUtils; import com.mongodb.BasicDBObject; import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.*; +import com.mongodb.client.model.Collation; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.CreateIndexOptions; +import com.mongodb.client.model.DropIndexOptions; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.IndexModel; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.ReturnDocument; +import com.mongodb.client.model.UpdateManyModel; +import com.mongodb.client.model.WriteModel; import com.mongodb.client.result.InsertManyResult; import org.bson.Document; import org.bson.conversions.Bson; @@ -36,7 +59,16 @@ import org.slf4j.LoggerFactory; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -72,9 +104,9 @@ public class DefaultBaseMapperImpl implements BaseMapper { } @Override - public boolean save(T entity){ + public boolean save(T entity) { try { - Document document = processIdField(entity,false); + Document document = processIdField(entity, false); InsertManyResult insertManyResult = factory.getExecute().executeSave(Collections.singletonList(document), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))); setBackIdValue(document, entity); return insertManyResult.wasAcknowledged(); @@ -99,8 +131,9 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long update(Bson queryBasic, Bson updateBasic, Class clazz) { + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); return factory.getExecute().executeUpdate( - queryBasic, + query, updateBasic, mongoPlusClient.getCollection(clazz) ).getModifiedCount(); @@ -108,278 +141,324 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Integer bulkWrite(List> writeModelList, Class clazz) { - BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(clazz)); + if (!LogicDeleteHandler.close()) { + writeModelList = writeModelList.stream().map(item -> { + if (item instanceof UpdateManyModel) { + UpdateManyModel umm = (UpdateManyModel) item; + Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); + return new UpdateManyModel(filter, umm.getUpdate()); + } + return item; + }).collect(Collectors.toList()); + } + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); } @Override - public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ - MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return factory.getExecute().executeUpdate(updatePair.getLeft(),updatePair.getRight(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; + public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, entity.getClass()); + MutablePair updatePair = getUpdateCondition(compareList, entity); + return factory.getExecute().executeUpdate(updatePair.getLeft(), updatePair.getRight(), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } private Boolean buildRemove(Serializable id, MongoCollection collection) { Bson filterId = Filters.eq(SqlOperationConstant._ID, ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id); - return factory.getExecute().executeRemove(filterId,collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(filterId, collection).getDeletedCount() >= 1; } - public Boolean executeRemoveByColumn(String column,Object value,MongoCollection collection){ + public Boolean executeRemoveByColumn(String column, Object value, MongoCollection collection) { Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return factory.getExecute().executeRemove(filter,collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(filter, collection).getDeletedCount() >= 1; } - private Boolean executeRemoveBatchByIds(Collection idList,MongoCollection collection){ + private Boolean executeRemoveBatchByIds(Collection idList, MongoCollection collection) { List convertedIds = idList.stream() .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) .collect(Collectors.toList()); Bson objectIdBson = Filters.in(SqlOperationConstant._ID, convertedIds); - return factory.getExecute().executeRemove(objectIdBson,collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(objectIdBson, collection).getDeletedCount() >= 1; } @Override public List list(Class clazz) { - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null,null,null,mongoPlusClient.getCollection(clazz),Document.class),clazz); + List compareList = LogicDeleteHandler.doWrapperLogicDel(null, clazz); + if (CollUtil.isNotEmpty(compareList)) { + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareList); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); + } else { + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); + } } @Override - public List list(QueryChainWrapper queryChainWrapper, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); + public List list(QueryChainWrapper queryChainWrapper, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override - public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz){ + public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); BasicDBObject optionsBasicDBObject = queryChainWrapper.getOptionsBasicDBObject(); List aggregateConditionList = new ArrayList() {{ - aggregateList.forEach(aggregate -> add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(),aggregate.getOrder()))); + aggregateList.forEach(aggregate -> add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(), aggregate.getOrder()))); addAll(basicDBObjectList); }}; aggregateConditionList.sort(Comparator.comparingInt(AggregateBasicDBObject::getOrder)); - AggregateIterable aggregateIterable = factory.getExecute().executeAggregate(aggregateConditionList, mongoPlusClient.getCollection(clazz),Document.class); - aggregateOptions(aggregateIterable,optionsBasicDBObject); - return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(),clazz); + AggregateIterable aggregateIterable = factory.getExecute().executeAggregate(aggregateConditionList, mongoPlusClient.getCollection(clazz), Document.class); + aggregateOptions(aggregateIterable, optionsBasicDBObject); + return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(), clazz); } @Override - public T one(QueryChainWrapper queryChainWrapper,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class).limit(1),clazz); + public T one(QueryChainWrapper queryChainWrapper, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, null, queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override - public T limitOne(QueryChainWrapper queryChainWrapper,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class).limit(1),clazz); + public T limitOne(QueryChainWrapper queryChainWrapper, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { count = factory.getExecute().estimatedDocumentCount(collection); - }else { - count = count(queryChainWrapper,clazz); + } else { + count = count(queryChainWrapper, clazz); } - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection,Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable,count,new PageParam(pageNum,pageSize),clazz); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection, Document.class); + return lambdaOperate.getLambdaQueryResultPage(iterable, count, new PageParam(pageNum, pageSize), clazz); } @Override public List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz),Document.class); + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable.skip((pageNum - 1) * pageSize).limit(pageSize), clazz); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ + if (CollUtil.isEmpty(compareList)) { count = factory.getExecute().estimatedDocumentCount(collection); - }else { - count = recentPageCount(queryChainWrapper.getCompareList(),clazz, pageNum, pageSize, recentPageNum); + } else { + count = recentPageCount(compareList, clazz, pageNum, pageSize, recentPageNum); } - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection,Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable, count,new PageParam(pageNum,pageSize),clazz); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection, Document.class); + return lambdaOperate.getLambdaQueryResultPage(iterable, count, new PageParam(pageNum, pageSize), clazz); } @Override - public T getById(Serializable id,Class clazz) { + public T getById(Serializable id, Class clazz) { BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(queryBasic,null,null,mongoPlusClient.getCollection(clazz),Document.class).first(),clazz); + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class).first(), clazz); } @Override - public boolean isExist(Serializable id,Class clazz){ + public boolean isExist(Serializable id, Class clazz) { BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return factory.getExecute().executeCount(queryBasic,null, mongoPlusClient.getCollection(clazz)) >= 1; + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return factory.getExecute().executeCount(query, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override - public boolean isExist(QueryChainWrapper queryChainWrapper,Class clazz){ - BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - return factory.getExecute().executeCount(basicDBObject,null,mongoPlusClient.getCollection(clazz)) >= 1; + public boolean isExist(QueryChainWrapper queryChainWrapper, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(compareList); + return factory.getExecute().executeCount(basicDBObject, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override - public List getByIds(Collection ids,Class clazz) { + public List getByIds(Collection ids, Class clazz) { BasicDBObject basicDBObject = checkIdType(ids); - FindIterable iterable = factory.getExecute().executeQuery(basicDBObject,null,null, mongoPlusClient.getCollection(clazz),Document.class); + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(basicDBObject, clazz); + FindIterable iterable = factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable, clazz); } @Override - public Boolean update(UpdateChainWrapper updateChainWrapper,Class clazz) { + public Boolean update(UpdateChainWrapper updateChainWrapper, Class clazz) { List compareConditionList = new ArrayList<>(); compareConditionList.addAll(updateChainWrapper.getCompareList()); compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); - BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); List pushConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.PUSH.getSubCondition())).collect(Collectors.toList()); List setConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.SET.getSubCondition())).collect(Collectors.toList()); BasicDBObject basicDBObject = new BasicDBObject() {{ - if (CollUtil.isNotEmpty(setConditionList)){ + if (CollUtil.isNotEmpty(setConditionList)) { append(SpecialConditionEnum.SET.getCondition(), BuildCondition.buildUpdateValue(setConditionList)); } - if (CollUtil.isNotEmpty(pushConditionList)){ + if (CollUtil.isNotEmpty(pushConditionList)) { append(SpecialConditionEnum.PUSH.getCondition(), BuildCondition.buildPushUpdateValue(pushConditionList)); } }}; - return factory.getExecute().executeUpdate(queryBasic,DocumentUtil.handleBasicDBObject(basicDBObject),mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(basicDBObject, clazz); + return factory.getExecute().executeUpdate(query, DocumentUtil.handleBasicDBObject(basicDBObject), mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; } @Override public Boolean remove(UpdateChainWrapper updateChainWrapper, Class clazz) { - return remove(BuildCondition.buildQueryCondition(updateChainWrapper.getCompareList()),clazz) >= 1; + return remove(BuildCondition.buildQueryCondition(updateChainWrapper.getCompareList()), clazz) >= 1; } @Override public Long remove(Bson filter, Class clazz) { - return factory.getExecute().executeRemove(filter,mongoPlusClient.getCollection(clazz)).getDeletedCount(); + LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); + if (LogicDeleteHandler.close() || Objects.isNull(result)) { + return factory.getExecute().executeRemove(filter, mongoPlusClient.getCollection(clazz)).getDeletedCount(); + } + Bson query = LogicDeleteHandler.doBsonLogicDel(filter, clazz); + Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue()); + return factory.getExecute().executeUpdate( + query, + new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic), + mongoPlusClient.getCollection(clazz) + ).getModifiedCount(); } @Override - public long count(QueryChainWrapper queryChainWrapper,Class clazz){ + public long count(QueryChainWrapper queryChainWrapper, Class clazz) { + List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); Execute execute = factory.getExecute(); MongoCollection collection = mongoPlusClient.getCollection(clazz); - return Optional.ofNullable(queryChainWrapper.getCompareList()) - .map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare),null,collection)) + return Optional.ofNullable(compareList) + .map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare), null, collection)) .orElseGet(() -> execute.estimatedDocumentCount(collection)); } /** * 分页查询 查询总条数 + * * @param compareConditionList 条件集合 - * @param clazz result class - * @param pageNum 当前页 - * @param pageSize 每页显示行数 - * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @param clazz result class + * @param pageNum 当前页 + * @param pageSize 每页显示行数 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} * @return long */ @Override - public long recentPageCount(List compareConditionList,Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum){ + public long recentPageCount(List compareConditionList, Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum) { if (recentPageNum == null || !(recentPageNum <= 50 && recentPageNum >= 5)) { // 返回-1 表示不查询总条数 return -1L; } + List compareList = new ArrayList<>(compareConditionList); + List compareConditions = LogicDeleteHandler.doWrapperLogicDel(null, clazz); + if (CollUtil.isNotEmpty(compareConditions)) { + compareList.addAll(compareConditions); + } //分页查询 不查询实际总条数 需要单独查询 是否有数据 //如果recentPageNum = 10 第1-6页 总页数=10 从第7页开始 需要往后 + 4 页 int limitParam = (pageNum < (recentPageNum / 2 + 1 + recentPageNum % 2) ? recentPageNum : (pageNum + (recentPageNum / 2 + recentPageNum % 2 - 1))) * pageSize; CountOptions countOptions = new CountOptions(); countOptions.skip(limitParam).limit(1); - long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, mongoPlusClient.getCollection(clazz)); + long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareList), countOptions, mongoPlusClient.getCollection(clazz)); //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 if (isExists == 0) { // 查询真实总条数 CountOptions countOptionsReal = new CountOptions(); countOptionsReal.limit(limitParam); - return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, mongoPlusClient.getCollection(clazz)); + return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareList), countOptions, mongoPlusClient.getCollection(clazz)); } return limitParam; } @Override - public long count(Class clazz){ - return factory.getExecute().estimatedDocumentCount(mongoPlusClient.getCollection(clazz)); + public long count(Class clazz) { + return count(null, clazz); } @Override - public List queryCommand(String command,Class clazz){ - FindIterable iterable = factory.getExecute().executeQuery(BasicDBObject.parse(command),null,null, mongoPlusClient.getCollection(clazz),Document.class); - return lambdaOperate.getLambdaQueryResult(iterable,clazz); + public List queryCommand(String command, Class clazz) { + Bson query = LogicDeleteHandler.doBsonLogicDel(BasicDBObject.parse(command), clazz); + FindIterable iterable = factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class); + return lambdaOperate.getLambdaQueryResult(iterable, clazz); } @Override - public List getByColumn(String column,Object value,Class clazz){ + public List getByColumn(String column, Object value, Class clazz) { Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(filter,null,null,mongoPlusClient.getCollection(clazz),Document.class),clazz); + Bson query = LogicDeleteHandler.doBsonLogicDel(filter, clazz); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override - public String createIndex(Bson bson,Class clazz){ - return factory.getExecute().doCreateIndex(bson,mongoPlusClient.getCollection(clazz)); + public String createIndex(Bson bson, Class clazz) { + return factory.getExecute().doCreateIndex(bson, mongoPlusClient.getCollection(clazz)); } @Override - public String createIndex(Bson bson, IndexOptions indexOptions, Class clazz){ - return factory.getExecute().doCreateIndex(bson,indexOptions,mongoPlusClient.getCollection(clazz)); + public String createIndex(Bson bson, IndexOptions indexOptions, Class clazz) { + return factory.getExecute().doCreateIndex(bson, indexOptions, mongoPlusClient.getCollection(clazz)); } @Override - public List createIndexes(List indexes,Class clazz){ - return factory.getExecute().doCreateIndexes(indexes,mongoPlusClient.getCollection(clazz)); + public List createIndexes(List indexes, Class clazz) { + return factory.getExecute().doCreateIndexes(indexes, mongoPlusClient.getCollection(clazz)); } @Override - public List createIndexes(List indexes, CreateIndexOptions createIndexOptions,Class clazz){ - return factory.getExecute().doCreateIndexes(indexes,createIndexOptions,mongoPlusClient.getCollection(clazz)); + public List createIndexes(List indexes, CreateIndexOptions createIndexOptions, Class clazz) { + return factory.getExecute().doCreateIndexes(indexes, createIndexOptions, mongoPlusClient.getCollection(clazz)); } @Override - public List listIndexes(Class clazz){ + public List listIndexes(Class clazz) { return factory.getExecute().doListIndexes(mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(String indexName,Class clazz){ - factory.getExecute().doDropIndex(indexName,mongoPlusClient.getCollection(clazz)); + public void dropIndex(String indexName, Class clazz) { + factory.getExecute().doDropIndex(indexName, mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(String indexName,DropIndexOptions dropIndexOptions,Class clazz){ - factory.getExecute().doDropIndex(indexName,dropIndexOptions,mongoPlusClient.getCollection(clazz)); + public void dropIndex(String indexName, DropIndexOptions dropIndexOptions, Class clazz) { + factory.getExecute().doDropIndex(indexName, dropIndexOptions, mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(Bson keys,Class clazz){ - factory.getExecute().doDropIndex(keys,mongoPlusClient.getCollection(clazz)); + public void dropIndex(Bson keys, Class clazz) { + factory.getExecute().doDropIndex(keys, mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(Bson keys,DropIndexOptions dropIndexOptions,Class clazz){ - factory.getExecute().doDropIndex(keys,dropIndexOptions,mongoPlusClient.getCollection(clazz)); + public void dropIndex(Bson keys, DropIndexOptions dropIndexOptions, Class clazz) { + factory.getExecute().doDropIndex(keys, dropIndexOptions, mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndexes(Class clazz){ + public void dropIndexes(Class clazz) { factory.getExecute().doDropIndexes(mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndexes(DropIndexOptions dropIndexOptions,Class clazz){ - factory.getExecute().doDropIndexes(dropIndexOptions,mongoPlusClient.getCollection(clazz)); + public void dropIndexes(DropIndexOptions dropIndexOptions, Class clazz) { + factory.getExecute().doDropIndexes(dropIndexOptions, mongoPlusClient.getCollection(clazz)); } - protected MutablePair getUpdate(T entity){ - Document document = DocumentUtil.checkUpdateField(entity,false); + protected MutablePair getUpdate(T entity) { + Document document = DocumentUtil.checkUpdateField(entity, false); BasicDBObject filter = ExecuteUtil.getFilter(document); BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(filter,update); + return new MutablePair<>(filter, update); } protected BasicDBObject checkIdType(Collection ids) { @@ -389,19 +468,19 @@ public class DefaultBaseMapperImpl implements BaseMapper { return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } - protected MutablePair getUpdateCondition(List compareConditionList, T entity){ + protected MutablePair getUpdateCondition(List compareConditionList, T entity) { BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); - Document document = DocumentUtil.checkUpdateField(entity,false); + Document document = DocumentUtil.checkUpdateField(entity, false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(queryBasic,updateField); + return new MutablePair<>(queryBasic, updateField); } @Override - public Document processIdField(T entity,Boolean skip){ + public Document processIdField(T entity, Boolean skip) { Document tableFieldMap = DocumentUtil.checkTableField(entity); fillId(entity, tableFieldMap); - if (HandlerCache.documentHandler != null && !skip){ + if (HandlerCache.documentHandler != null && !skip) { //经过一下Document处理器 tableFieldMap = HandlerCache.documentHandler.insertInvoke(Collections.singletonList(tableFieldMap)).get(0); } @@ -412,7 +491,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { String collectionName = collectionNameConvert.convert(clazz); // 每个Collection单独加锁 synchronized (collectionName.intern()) { - MongoCollection collection = mongoPlusClient.getCollection(clazz,"counters"); + MongoCollection collection = mongoPlusClient.getCollection(clazz, "counters"); Document query = new Document(SqlOperationConstant._ID, collectionName); Document update = new Document("$inc", new Document(SqlOperationConstant.AUTO_NUM, 1)); Document document = Optional.ofNullable(MongoTransactionContext.getClientSessionContext()) @@ -451,7 +530,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { if (annotation.type() == IdTypeEnum.AUTO) { _idValue = getAutoId(ClassTypeUtil.getClass(entity)); } else { - if (annotation.type() == IdTypeEnum.OBJECT_ID){ + if (annotation.type() == IdTypeEnum.OBJECT_ID) { return; } _idValue = Generate.generateId(annotation.type()); @@ -460,12 +539,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { Object value = ConversionService.convertValue(idField, ClassTypeUtil.getClass(entity).getDeclaredConstructor().newInstance(), _idValue); document.put(SqlOperationConstant._ID, value); //为自行设置id,需要在这里判断一下重入,自行设置checkTableField方法会进行处理 - if (annotation.saveField()){ - document.put(idField.getName(),value); + if (annotation.saveField()) { + document.put(idField.getName(), value); } } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { - logger.error("Failed to convert to entity class's' _id 'field type when filling in'_id',error message: {}",e.getMessage(),e); + logger.error("Failed to convert to entity class's' _id 'field type when filling in'_id',error message: {}", e.getMessage(), e); throw new RuntimeException(e); } } @@ -484,7 +563,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { } try { //使用策略转换器回写id - ConversionService.setValue(idField,entity,idValue); + ConversionService.setValue(idField, entity, idValue); } catch (Exception e) { logger.error("set back id field value error, error message: {}", e.getMessage()); } @@ -498,12 +577,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { } } - protected List processIdFieldList(Collection entityList){ - List documentList = entityList.stream().map(document -> processIdField(document,true)).collect(Collectors.toList()); + protected List processIdFieldList(Collection entityList) { + List documentList = entityList.stream().map(document -> processIdField(document, true)).collect(Collectors.toList()); return Optional.ofNullable(HandlerCache.documentHandler).map(documentHandler -> documentHandler.insertInvoke(documentList)).orElse(documentList); } - protected void aggregateOptions(AggregateIterable aggregateIterable,BasicDBObject optionsBasicDBObject){ + protected void aggregateOptions(AggregateIterable aggregateIterable, BasicDBObject optionsBasicDBObject) { options(aggregateIterable, optionsBasicDBObject); } @@ -511,7 +590,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { Set keyedSet = optionsBasicDBObject.keySet(); for (String key : keyedSet) { AggregateOptionsEnum aggregateOptionsEnum = AggregateOptionsEnum.getByOptions(key); - switch (Objects.requireNonNull(aggregateOptionsEnum)){ + switch (Objects.requireNonNull(aggregateOptionsEnum)) { case ALLOW_DISK_USE: aggregateIterable.allowDiskUse(optionsBasicDBObject.getBoolean(key)); break; @@ -525,7 +604,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { aggregateIterable.maxTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); break; case MAX_AWAIT_TIME_MS: - aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key),TimeUnit.MILLISECONDS); + aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); break; case BYPASS_DOCUMENT_VALIDATION: aggregateIterable.bypassDocumentValidation(optionsBasicDBObject.getBoolean(key)); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/ClassAnnotationFiled.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/ClassAnnotationFiled.java new file mode 100644 index 0000000..234b1e0 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/ClassAnnotationFiled.java @@ -0,0 +1,49 @@ +package com.anwen.mongo.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; + +/** + * 目标类首个指定注解结果包裹对象 + * + * @author loser + * @date 2024/4/28 + */ +public class ClassAnnotationFiled { + + private Class target; + + private Field field; + + private T targetAnnotation; + + public ClassAnnotationFiled(Class target, Field field, T tableLogic) { + this.target = target; + this.field = field; + this.targetAnnotation = tableLogic; + } + + public Class getTarget() { + return target; + } + + public void setTarget(Class target) { + this.target = target; + } + + public Field getField() { + return field; + } + + public void setField(Field field) { + this.field = field; + } + + public T getTargetAnnotation() { + return targetAnnotation; + } + + public void setTargetAnnotation(T targetAnnotation) { + this.targetAnnotation = targetAnnotation; + } +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicDeleteResult.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicDeleteResult.java new file mode 100644 index 0000000..d9990cc --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicDeleteResult.java @@ -0,0 +1,49 @@ +package com.anwen.mongo.model; + +/** + * 逻辑删除信息 + * + * @author loser + * @date 2024/4/29 + */ +public class LogicDeleteResult { + + /** + * 逻辑删除指定的列 + */ + private String column; + + /** + * 逻辑删除全局值(默认 1、表示已删除) + */ + private String logicDeleteValue = "1"; + + /** + * 逻辑未删除全局值(默认 0、表示未删除) + */ + private String logicNotDeleteValue = "0"; + + public String getColumn() { + return column; + } + + public void setColumn(String column) { + this.column = column; + } + + public String getLogicDeleteValue() { + return logicDeleteValue; + } + + public void setLogicDeleteValue(String logicDeleteValue) { + this.logicDeleteValue = logicDeleteValue; + } + + public String getLogicNotDeleteValue() { + return logicNotDeleteValue; + } + + public void setLogicNotDeleteValue(String logicNotDeleteValue) { + this.logicNotDeleteValue = logicNotDeleteValue; + } +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/AnnotationUtil.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/AnnotationUtil.java index 5c25b72..7c1419b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/AnnotationUtil.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/AnnotationUtil.java @@ -4,9 +4,12 @@ import com.anwen.mongo.annotation.ID; import com.anwen.mongo.enums.IdTypeEnum; import com.anwen.mongo.model.BaseModelID; +import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * @author JiaChaoYang @@ -15,32 +18,53 @@ import java.util.Map; **/ public class AnnotationUtil { - public static Map getFieldAnnotation(Object object) { + public static Map getFieldAnnotation(Object object) { Field[] fields = object.getClass().getDeclaredFields(); - Map resultMap = new HashMap<>(); + Map resultMap = new HashMap<>(); Class superclass = object.getClass().getSuperclass(); IdTypeEnum idTypeEnum = null; String fieldName = "id"; Class fieldType = String.class; for (Field field : fields) { - if (field.isAnnotationPresent(ID.class)){ + if (field.isAnnotationPresent(ID.class)) { idTypeEnum = field.getAnnotation(ID.class).type(); fieldName = field.getName(); fieldType = field.getType(); } } - if (superclass == BaseModelID.class){ + if (superclass == BaseModelID.class) { try { idTypeEnum = superclass.getField("id").getAnnotation(ID.class).type(); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } } - if (idTypeEnum != null){ - resultMap.put("fieldName",fieldName); - resultMap.put("fieldType",fieldType); + if (idTypeEnum != null) { + resultMap.put("fieldName", fieldName); + resultMap.put("fieldType", fieldType); resultMap.put("generateType", idTypeEnum); } return resultMap; } + + public static T findFirstAnnotation(Class annotationClazz, Field field) { + return getAnnotation(annotationClazz, new HashSet<>(), field.getDeclaredAnnotations()); + } + + @SuppressWarnings("unchecked") + private static T getAnnotation(Class annotationClazz, Set> annotationSet, Annotation... annotations) { + for (Annotation annotation : annotations) { + if (annotationSet.add(annotation.annotationType())) { + if (annotationClazz.isAssignableFrom(annotation.annotationType())) { + return (T) annotation; + } + annotation = getAnnotation(annotationClazz, annotationSet, annotation.annotationType().getDeclaredAnnotations()); + if (annotation != null) { + return (T) annotation; + } + } + } + return null; + } + } diff --git a/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java b/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java new file mode 100644 index 0000000..9e138c5 --- /dev/null +++ b/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java @@ -0,0 +1,13 @@ +package com.anwen.mongoa.entity; + +import com.anwen.mongo.annotation.TableLogic; +import lombok.Data; + +@Data +public class Base { + + // @TableLogic(delval = "0", value = "1", close = true) + @TableLogic + private String logicDel; + +} -- Gitee From 8cd4f54b752bf713feffe4cffecf6a043fca896a Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 05:38:25 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/anwen/mongo/logic/LogicDeleteHandler.java | 13 +++++++++++++ .../anwen/mongo/mapper/DefaultBaseMapperImpl.java | 10 +++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java index 8f51716..005a783 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java @@ -68,6 +68,19 @@ public interface LogicDeleteHandler { } + + /** + * 给 wrapper 对象添加逻辑未删除对象 + * + * @param clazz 目标文档 + * @param 文档类型 + * @return 添加逻辑未删除的条件集合 + */ + @SuppressWarnings("unchecked") + static List doWrapperLogicDel(Class clazz) { + return doWrapperLogicDel(null, clazz); + } + /** * 给 wrapper 对象添加逻辑未删除对象 * diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 82309f8..656f7a0 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -182,7 +182,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List list(Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(null, clazz); + List compareList = LogicDeleteHandler.doWrapperLogicDel(clazz); if (CollUtil.isNotEmpty(compareList)) { BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareList); return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); @@ -200,6 +200,10 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { + if (!LogicDeleteHandler.close()) { + BasicDBObject logicDelete = BuildCondition.buildQueryCondition(LogicDeleteHandler.doWrapperLogicDel(clazz)); + queryChainWrapper.custom(logicDelete); + } List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); BasicDBObject optionsBasicDBObject = queryChainWrapper.getOptionsBasicDBObject(); @@ -233,7 +237,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { + if (CollUtil.isEmpty(compareList)) { count = factory.getExecute().estimatedDocumentCount(collection); } else { count = count(queryChainWrapper, clazz); @@ -360,7 +364,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { return -1L; } List compareList = new ArrayList<>(compareConditionList); - List compareConditions = LogicDeleteHandler.doWrapperLogicDel(null, clazz); + List compareConditions = LogicDeleteHandler.doWrapperLogicDel(clazz); if (CollUtil.isNotEmpty(compareConditions)) { compareList.addAll(compareConditions); } -- Gitee From 19a94e06421fdd85963d954eb59cf0da41c3b6e9 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 13:16:00 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/mapper/DefaultBaseMapperImpl.java | 3 +- .../anwen/mongo/service/impl/ServiceImpl.java | 177 ++++++++++-------- 2 files changed, 96 insertions(+), 84 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 656f7a0..308d71a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -303,6 +303,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { List compareConditionList = new ArrayList<>(); compareConditionList.addAll(updateChainWrapper.getCompareList()); compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); List pushConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.PUSH.getSubCondition())).collect(Collectors.toList()); List setConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.SET.getSubCondition())).collect(Collectors.toList()); BasicDBObject basicDBObject = new BasicDBObject() {{ @@ -313,7 +314,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { append(SpecialConditionEnum.PUSH.getCondition(), BuildCondition.buildPushUpdateValue(pushConditionList)); } }}; - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(basicDBObject, clazz); + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); return factory.getExecute().executeUpdate(query, DocumentUtil.handleBasicDBObject(basicDBObject), mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/impl/ServiceImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/impl/ServiceImpl.java index cbf570e..39e0a52 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/impl/ServiceImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/impl/ServiceImpl.java @@ -17,10 +17,21 @@ import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; import com.anwen.mongo.service.IService; import com.anwen.mongo.support.SFunction; -import com.anwen.mongo.toolkit.*; +import com.anwen.mongo.toolkit.ChainWrappers; +import com.anwen.mongo.toolkit.ClassTypeUtil; +import com.anwen.mongo.toolkit.DocumentUtil; +import com.anwen.mongo.toolkit.ExecuteUtil; +import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.BasicDBObject; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.*; +import com.mongodb.client.model.CreateIndexOptions; +import com.mongodb.client.model.DropIndexOptions; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.IndexModel; +import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.InsertOneModel; +import com.mongodb.client.model.UpdateManyModel; +import com.mongodb.client.model.WriteModel; import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; @@ -39,11 +50,11 @@ import java.util.stream.Collectors; * 接口实现 * @since 2023-02-09 14:13 **/ -public class ServiceImpl implements IService{ +public class ServiceImpl implements IService { private BaseMapper baseMapper; - public void setBaseMapper(BaseMapper baseMapper){ + public void setBaseMapper(BaseMapper baseMapper) { this.baseMapper = baseMapper; } @@ -85,12 +96,12 @@ public class ServiceImpl implements IService{ @Override public MongoCollection getCollection() { - return baseMapper.getMongoPlusClient().getCollection(database,clazz); + return baseMapper.getMongoPlusClient().getCollection(database, clazz); } @Override public MongoCollection getCollection(String database) { - return baseMapper.getMongoPlusClient().getCollection(database,clazz); + return baseMapper.getMongoPlusClient().getCollection(database, clazz); } @Override @@ -106,7 +117,7 @@ public class ServiceImpl implements IService{ @Override public Boolean saveOrUpdate(T entity) { String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); - if (StringUtils.isBlank(idByEntity)){ + if (StringUtils.isBlank(idByEntity)) { return save(entity); } return updateById(entity); @@ -115,19 +126,19 @@ public class ServiceImpl implements IService{ @Override public Boolean saveOrUpdateWrapper(T entity, QueryChainWrapper queryChainWrapper) { long count = count(queryChainWrapper); - if (count > 0){ - MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return baseMapper.update(updatePair.getLeft(),updatePair.getRight(),ClassTypeUtil.getClass(entity)) >= 1; + if (count > 0) { + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return baseMapper.update(updatePair.getLeft(), updatePair.getRight(), ClassTypeUtil.getClass(entity)) >= 1; } return save(entity); } - protected MutablePair getUpdateCondition(List compareConditionList, T entity){ + protected MutablePair getUpdateCondition(List compareConditionList, T entity) { BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); - Document document = DocumentUtil.checkUpdateField(entity,false); + Document document = DocumentUtil.checkUpdateField(entity, false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(queryBasic,updateField); + return new MutablePair<>(queryBasic, updateField); } @Override @@ -135,14 +146,14 @@ public class ServiceImpl implements IService{ List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); - if (StringUtils.isBlank(idByEntity)){ - writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity,false))); + if (StringUtils.isBlank(idByEntity)) { + writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity, false))); } else { - MutablePair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(), basicDBObjectPair.getRight())); } }); - return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); + return baseMapper.bulkWrite(writeModelList, entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override @@ -151,83 +162,83 @@ public class ServiceImpl implements IService{ List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { long count = baseMapper.count(queryChainWrapper, clazz); - if (count > 0){ - MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - writeModelList.add(new UpdateManyModel<>(updatePair.getLeft(),updatePair.getRight())); + if (count > 0) { + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getLeft(), updatePair.getRight())); } else { - writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity,false))); + writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity, false))); } }); - return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); + return baseMapper.bulkWrite(writeModelList, entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override public Boolean updateById(T entity) { - MutablePair basicDBObjectPair = getUpdate(entity); - return baseMapper.update(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight(),ClassTypeUtil.getClass(entity)) >= 1; + MutablePair basicDBObjectPair = getUpdate(entity); + return baseMapper.update(basicDBObjectPair.getLeft(), basicDBObjectPair.getRight(), ClassTypeUtil.getClass(entity)) >= 1; } - protected MutablePair getUpdate(T entity) { - Document document = DocumentUtil.checkUpdateField(entity,false); + protected MutablePair getUpdate(T entity) { + Document document = DocumentUtil.checkUpdateField(entity, false); BasicDBObject filter = ExecuteUtil.getFilter(document); BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(filter,update); + return new MutablePair<>(filter, update); } @Override public Boolean updateBatchByIds(Collection entityList) { List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { - MutablePair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(), basicDBObjectPair.getRight())); }); - return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); + return baseMapper.bulkWrite(writeModelList, entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override public Boolean updateByColumn(T entity, SFunction column) { - return updateByColumn(entity,column.getFieldNameLine()); + return updateByColumn(entity, column.getFieldNameLine()); } @Override public Boolean updateByColumn(T entity, String column) { - Object filterValue = ClassTypeUtil.getClassFieldValue(entity,column); + Object filterValue = ClassTypeUtil.getClassFieldValue(entity, column); String valueOf = String.valueOf(filterValue); Bson filter = Filters.eq(column, ObjectId.isValid(valueOf) ? new ObjectId(valueOf) : filterValue); - Document document = DocumentUtil.checkUpdateField(entity,false); - return baseMapper.update(filter,document,ClassTypeUtil.getClass(entity)) >= 1; + Document document = DocumentUtil.checkUpdateField(entity, false); + return baseMapper.update(filter, new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document), ClassTypeUtil.getClass(entity)) >= 1; } @Override public Boolean remove(UpdateChainWrapper updateChainWrapper) { - return baseMapper.remove(updateChainWrapper,clazz); + return baseMapper.remove(updateChainWrapper, clazz); } @Override public Boolean update(UpdateChainWrapper updateChainWrapper) { - return baseMapper.update(updateChainWrapper,clazz); + return baseMapper.update(updateChainWrapper, clazz); } @Override public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { - return baseMapper.update(entity,queryChainWrapper); + return baseMapper.update(entity, queryChainWrapper); } @Override public Boolean removeById(Serializable id) { Bson filterId = Filters.eq(SqlOperationConstant._ID, ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id); - return baseMapper.remove(filterId,clazz) >= 1; + return baseMapper.remove(filterId, clazz) >= 1; } @Override public Boolean removeByColumn(SFunction column, Object value) { - return removeByColumn(column.getFieldNameLine(),value); + return removeByColumn(column.getFieldNameLine(), value); } @Override public Boolean removeByColumn(String column, Object value) { Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return baseMapper.remove(filter,clazz) >= 1; + return baseMapper.remove(filter, clazz) >= 1; } @Override @@ -236,23 +247,23 @@ public class ServiceImpl implements IService{ .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) .collect(Collectors.toList()); Bson objectIdBson = Filters.in(SqlOperationConstant._ID, convertedIds); - return baseMapper.remove(objectIdBson,clazz) >= 1; + return baseMapper.remove(objectIdBson, clazz) >= 1; } @Override public List aggregateList(AggregateChainWrapper queryChainWrapper) { - return baseMapper.aggregateList(queryChainWrapper,clazz); + return baseMapper.aggregateList(queryChainWrapper, clazz); } @Override - public T one(QueryChainWrapper queryChainWrapper) { - return baseMapper.one(queryChainWrapper,clazz); + public T one(QueryChainWrapper queryChainWrapper) { + return baseMapper.one(queryChainWrapper, clazz); } @Override @Deprecated public T limitOne(QueryChainWrapper queryChainWrapper) { - return baseMapper.limitOne(queryChainWrapper,clazz); + return baseMapper.limitOne(queryChainWrapper, clazz); } @Override @@ -261,13 +272,13 @@ public class ServiceImpl implements IService{ } @Override - public List list(QueryChainWrapper queryChainWrapper) { - return baseMapper.list(queryChainWrapper,clazz); + public List list(QueryChainWrapper queryChainWrapper) { + return baseMapper.list(queryChainWrapper, clazz); } @Override - public List list(AggregateChainWrapper queryChainWrapper) { - return baseMapper.aggregateList(queryChainWrapper,clazz); + public List list(AggregateChainWrapper queryChainWrapper) { + return baseMapper.aggregateList(queryChainWrapper, clazz); } @Override @@ -277,52 +288,52 @@ public class ServiceImpl implements IService{ @Override public long count(QueryChainWrapper queryChainWrapper) { - return baseMapper.count(queryChainWrapper,clazz); + return baseMapper.count(queryChainWrapper, clazz); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize){ - return baseMapper.page(queryChainWrapper, pageNum,pageSize,clazz); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize) { + return baseMapper.page(queryChainWrapper, pageNum, pageSize, clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam) { - return page(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize()); + return page(queryChainWrapper, pageParam.getPageNum(), pageParam.getPageSize()); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum){ - return baseMapper.page(queryChainWrapper, pageNum,pageSize,recentPageNum,clazz); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum) { + return baseMapper.page(queryChainWrapper, pageNum, pageSize, recentPageNum, clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum) { - return page(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum); + return page(queryChainWrapper, pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum); } @Override public List pageList(PageParam pageParam) { - return pageList(pageParam.getPageNum(),pageParam.getPageSize()); + return pageList(pageParam.getPageNum(), pageParam.getPageSize()); } @Override public List pageList(Integer pageNum, Integer pageSize) { - return baseMapper.pageList(new QueryWrapper<>(),pageNum,pageSize,clazz); + return baseMapper.pageList(new QueryWrapper<>(), pageNum, pageSize, clazz); } @Override public List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize) { - return baseMapper.pageList(queryChainWrapper,pageNum,pageSize,clazz); + return baseMapper.pageList(queryChainWrapper, pageNum, pageSize, clazz); } @Override public List pageList(QueryChainWrapper queryChainWrapper, PageParam pageParam) { - return baseMapper.pageList(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize(),clazz); + return baseMapper.pageList(queryChainWrapper, pageParam.getPageNum(), pageParam.getPageSize(), clazz); } @Override public PageResult page(PageParam pageParam) { - return page(pageParam.getPageNum(),pageParam.getPageSize()); + return page(pageParam.getPageNum(), pageParam.getPageSize()); } @Override @@ -332,67 +343,67 @@ public class ServiceImpl implements IService{ @Override public PageResult page(Integer pageNum, Integer pageSize) { - return page(new QueryWrapper<>(),pageNum,pageSize); + return page(new QueryWrapper<>(), pageNum, pageSize); } @Override public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { - return baseMapper.page(new QueryWrapper<>(),pageNum,pageSize,recentPageNum,clazz); + return baseMapper.page(new QueryWrapper<>(), pageNum, pageSize, recentPageNum, clazz); } @Override public T getById(Serializable id) { - return baseMapper.getById(id,clazz); + return baseMapper.getById(id, clazz); } @Override public List getByIds(Collection ids) { - return baseMapper.getByIds(ids,clazz); + return baseMapper.getByIds(ids, clazz); } @Override public List queryCommand(String command) { - return baseMapper.queryCommand(command,clazz); + return baseMapper.queryCommand(command, clazz); } @Override public List getByColumn(SFunction field, Object fieldValue) { - return baseMapper.getByColumn(field.getFieldNameLine(), fieldValue,clazz); + return baseMapper.getByColumn(field.getFieldNameLine(), fieldValue, clazz); } @Override public List getByColumn(String field, Object fieldValue) { - return baseMapper.getByColumn(field,fieldValue,clazz); + return baseMapper.getByColumn(field, fieldValue, clazz); } @Override public Boolean exist(Serializable id) { - return baseMapper.isExist(id,clazz); + return baseMapper.isExist(id, clazz); } @Override public Boolean exist(QueryChainWrapper queryChainWrapper) { - return baseMapper.isExist(queryChainWrapper,clazz); + return baseMapper.isExist(queryChainWrapper, clazz); } @Override public String createIndex(Bson bson) { - return baseMapper.createIndex(bson,clazz); + return baseMapper.createIndex(bson, clazz); } @Override public String createIndex(Bson bson, IndexOptions indexOptions) { - return baseMapper.createIndex(bson,indexOptions,clazz); + return baseMapper.createIndex(bson, indexOptions, clazz); } @Override public List createIndexes(List indexes) { - return baseMapper.createIndexes(indexes,clazz); + return baseMapper.createIndexes(indexes, clazz); } @Override public List createIndexes(List indexes, CreateIndexOptions createIndexOptions) { - return baseMapper.createIndexes(indexes,createIndexOptions,clazz); + return baseMapper.createIndexes(indexes, createIndexOptions, clazz); } @Override @@ -402,22 +413,22 @@ public class ServiceImpl implements IService{ @Override public void dropIndex(String indexName) { - baseMapper.dropIndex(indexName,clazz); + baseMapper.dropIndex(indexName, clazz); } @Override public void dropIndex(String indexName, DropIndexOptions dropIndexOptions) { - baseMapper.dropIndex(indexName,dropIndexOptions,clazz); + baseMapper.dropIndex(indexName, dropIndexOptions, clazz); } @Override public void dropIndex(Bson keys) { - baseMapper.dropIndex(keys,clazz); + baseMapper.dropIndex(keys, clazz); } @Override public void dropIndex(Bson keys, DropIndexOptions dropIndexOptions) { - baseMapper.dropIndex(keys,dropIndexOptions,clazz); + baseMapper.dropIndex(keys, dropIndexOptions, clazz); } @Override @@ -427,7 +438,7 @@ public class ServiceImpl implements IService{ @Override public void dropIndexes(DropIndexOptions dropIndexOptions) { - baseMapper.dropIndexes(dropIndexOptions,clazz); + baseMapper.dropIndexes(dropIndexOptions, clazz); } public Class getClazz() { @@ -436,16 +447,16 @@ public class ServiceImpl implements IService{ @Override public LambdaQueryChainWrapper lambdaQuery() { - return ChainWrappers.lambdaQueryChain(baseMapper,clazz); + return ChainWrappers.lambdaQueryChain(baseMapper, clazz); } @Override public LambdaAggregateChainWrapper lambdaAggregate() { - return ChainWrappers.lambdaAggregateChain(baseMapper,clazz); + return ChainWrappers.lambdaAggregateChain(baseMapper, clazz); } @Override public LambdaUpdateChainWrapper lambdaUpdate() { - return ChainWrappers.lambdaUpdateChain(baseMapper,clazz); + return ChainWrappers.lambdaUpdateChain(baseMapper, clazz); } } -- Gitee From 03ca3c5c453b28c042ef7a7b62f39ed4670bf57d Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 13:30:05 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8Daggregate=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=A0=E9=99=A4=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 308d71a..9d173db 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -202,7 +202,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { if (!LogicDeleteHandler.close()) { BasicDBObject logicDelete = BuildCondition.buildQueryCondition(LogicDeleteHandler.doWrapperLogicDel(clazz)); - queryChainWrapper.custom(logicDelete); + queryChainWrapper.match(logicDelete); } List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); -- Gitee From 3d69d7053cff422de70b26b140285a1840861cfc Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 21:33:50 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=99=A8=E8=A7=A3=E8=80=A6=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionLogic.java} | 4 +- .../config/MongoPlusAutoConfiguration.java | 8 +- .../cache/global/ClassLogicDeleteCache.java | 15 ++ .../logic/CollectionLogiceInterceptor.java | 93 +++++++++++ .../mongo/mapper/DefaultBaseMapperImpl.java | 147 +++++++----------- .../com/anwen/mongo/proxy/ExecutorProxy.java | 62 +++++++- .../java/com/anwen/mongoa/entity/Base.java | 4 +- 7 files changed, 234 insertions(+), 99 deletions(-) rename mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/{TableLogic.java => collection/CollectionLogic.java} (90%) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/collection/CollectionLogic.java similarity index 90% rename from mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java rename to mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/collection/CollectionLogic.java index bd206d3..083a399 100644 --- a/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/TableLogic.java +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/collection/CollectionLogic.java @@ -1,4 +1,4 @@ -package com.anwen.mongo.annotation; +package com.anwen.mongo.annotation.collection; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -15,7 +15,7 @@ import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) -public @interface TableLogic { +public @interface CollectionLogic { /** * 开启全局配置 并忽略该文档(任意补充在某一个字段上,建议跟@ID 相同) diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 44a3c6a..20d869f 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -1,6 +1,6 @@ package com.anwen.mongo.config; -import com.anwen.mongo.annotation.TableLogic; +import com.anwen.mongo.annotation.collection.CollectionLogic; import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.HandlerCache; @@ -17,6 +17,7 @@ import com.anwen.mongo.listener.Listener; import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; import com.anwen.mongo.logic.AnnotationHandler; +import com.anwen.mongo.logic.CollectionLogiceInterceptor; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.ClassAnnotationFiled; @@ -110,6 +111,7 @@ public class MongoPlusAutoConfiguration implements InitializingBean { return; } ClassLogicDeleteCache.open = mongoLogicDelProperty.getOpen(); + InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); } @@ -120,10 +122,10 @@ public class MongoPlusAutoConfiguration implements InitializingBean { } Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; - ClassAnnotationFiled targetInfo = AnnotationHandler.getAnnotationOnFiled(clazz, TableLogic.class); + ClassAnnotationFiled targetInfo = AnnotationHandler.getAnnotationOnFiled(clazz, CollectionLogic.class); // 优先使用每个对象自定义规则 if (Objects.nonNull(targetInfo)) { - TableLogic annotation = targetInfo.getTargetAnnotation(); + CollectionLogic annotation = targetInfo.getTargetAnnotation(); if (annotation.close()) { return; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java index 2684ebe..a22a5c2 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java @@ -23,4 +23,19 @@ public class ClassLogicDeleteCache { */ public static final Map, LogicDeleteResult> logicDeleteResultHashMap = new HashMap<>(); + private static final ThreadLocal> logicCollection = new InheritableThreadLocal<>(); + + public static void setLogicCollection(Class clazz) { + logicCollection.set(clazz); + } + + public static Class getLogicCollection() { + return logicCollection.get(); + } + + public static void clear() { + logicCollection.remove(); + } + + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java new file mode 100644 index 0000000..d8df7a4 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java @@ -0,0 +1,93 @@ +package com.anwen.mongo.logic; + +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.conditions.BuildCondition; +import com.anwen.mongo.enums.AggregateTypeEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.model.AggregateBasicDBObject; +import com.anwen.mongo.model.BaseAggregate; +import com.anwen.mongo.model.MutablePair; +import com.anwen.mongo.model.QueryParam; +import com.anwen.mongo.strategy.aggregate.impl.DefaultConcretePipeline; +import com.mongodb.BasicDBObject; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.UpdateManyModel; +import com.mongodb.client.model.WriteModel; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class CollectionLogiceInterceptor implements Interceptor { + + @Override + public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeUpdate(queryBasic, updateBasic); + } + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, updateBasic); + + } + + @Override + public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond) { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); + } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new QueryParam(query, projectionList, sortCond); + + } + + @Override + public List executeAggregate(List aggregateConditionList) { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeAggregate(aggregateConditionList); + } + BasicDBObject logicDelete = BuildCondition.buildQueryCondition(LogicDeleteHandler.doWrapperLogicDel(clazz)); + BaseAggregate aggregate = new BaseAggregate(AggregateTypeEnum.MATCH.getType(), new DefaultConcretePipeline(logicDelete), aggregateConditionList.size() + 1); + aggregateConditionList.add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(), aggregate.getOrder())); + return aggregateConditionList; + + } + + @Override + public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions) { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeCount(queryBasic, countOptions); + } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, countOptions); + + } + + @Override + public List> executeBulkWrite(List> writeModelList) { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeBulkWrite(writeModelList); + } + return writeModelList.stream().map(item -> { + if (item instanceof UpdateManyModel) { + UpdateManyModel umm = (UpdateManyModel) item; + Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); + return new UpdateManyModel(filter, umm.getUpdate()); + } + return item; + }).collect(Collectors.toList()); + + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 9d173db..273b85d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -1,6 +1,7 @@ package com.anwen.mongo.mapper; import com.anwen.mongo.annotation.ID; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; @@ -21,7 +22,6 @@ import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.AggregateBasicDBObject; import com.anwen.mongo.model.BaseAggregate; import com.anwen.mongo.model.BaseLambdaQueryResult; -import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; @@ -47,7 +47,6 @@ import com.mongodb.client.model.FindOneAndUpdateOptions; import com.mongodb.client.model.IndexModel; import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.ReturnDocument; -import com.mongodb.client.model.UpdateManyModel; import com.mongodb.client.model.WriteModel; import com.mongodb.client.result.InsertManyResult; import org.bson.Document; @@ -131,34 +130,21 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long update(Bson queryBasic, Bson updateBasic, Class clazz) { - Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return factory.getExecute().executeUpdate( - query, - updateBasic, - mongoPlusClient.getCollection(clazz) - ).getModifiedCount(); + setCollectionClass(clazz); + return factory.getExecute().executeUpdate(queryBasic, updateBasic, mongoPlusClient.getCollection(clazz)).getModifiedCount(); } @Override public Integer bulkWrite(List> writeModelList, Class clazz) { - if (!LogicDeleteHandler.close()) { - writeModelList = writeModelList.stream().map(item -> { - if (item instanceof UpdateManyModel) { - UpdateManyModel umm = (UpdateManyModel) item; - Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); - return new UpdateManyModel(filter, umm.getUpdate()); - } - return item; - }).collect(Collectors.toList()); - } + setCollectionClass(clazz); BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); } @Override public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, entity.getClass()); - MutablePair updatePair = getUpdateCondition(compareList, entity); + setCollectionClass(entity.getClass()); + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); return factory.getExecute().executeUpdate(updatePair.getLeft(), updatePair.getRight(), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } @@ -182,28 +168,20 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List list(Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(clazz); - if (CollUtil.isNotEmpty(compareList)) { - BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareList); - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); - } else { - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); - } + setCollectionClass(clazz); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override public List list(QueryChainWrapper queryChainWrapper, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { - if (!LogicDeleteHandler.close()) { - BasicDBObject logicDelete = BuildCondition.buildQueryCondition(LogicDeleteHandler.doWrapperLogicDel(clazz)); - queryChainWrapper.match(logicDelete); - } + setCollectionClass(clazz); List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); BasicDBObject optionsBasicDBObject = queryChainWrapper.getOptionsBasicDBObject(); @@ -219,25 +197,26 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public T one(QueryChainWrapper queryChainWrapper, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, null, queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), null, queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override public T limitOne(QueryChainWrapper queryChainWrapper, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(compareList)) { + // todo loser + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { count = factory.getExecute().estimatedDocumentCount(collection); } else { count = count(queryChainWrapper, clazz); @@ -248,22 +227,23 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable.skip((pageNum - 1) * pageSize).limit(pageSize), clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareList, queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + setCollectionClass(clazz); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(compareList)) { + // todo loser + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { count = factory.getExecute().estimatedDocumentCount(collection); } else { - count = recentPageCount(compareList, clazz, pageNum, pageSize, recentPageNum); + count = recentPageCount(queryChainWrapper.getCompareList(), clazz, pageNum, pageSize, recentPageNum); } FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection, Document.class); return lambdaOperate.getLambdaQueryResultPage(iterable, count, new PageParam(pageNum, pageSize), clazz); @@ -271,35 +251,36 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public T getById(Serializable id, Class clazz) { + setCollectionClass(clazz); BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class).first(), clazz); + return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class).first(), clazz); } @Override public boolean isExist(Serializable id, Class clazz) { + setCollectionClass(clazz); BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return factory.getExecute().executeCount(query, null, mongoPlusClient.getCollection(clazz)) >= 1; + return factory.getExecute().executeCount(queryBasic, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override public boolean isExist(QueryChainWrapper queryChainWrapper, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); - BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(compareList); + setCollectionClass(clazz); + BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); return factory.getExecute().executeCount(basicDBObject, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override public List getByIds(Collection ids, Class clazz) { + setCollectionClass(clazz); BasicDBObject basicDBObject = checkIdType(ids); - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(basicDBObject, clazz); - FindIterable iterable = factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class); + FindIterable iterable = factory.getExecute().executeQuery(basicDBObject, null, null, mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable, clazz); } @Override public Boolean update(UpdateChainWrapper updateChainWrapper, Class clazz) { + setCollectionClass(clazz); List compareConditionList = new ArrayList<>(); compareConditionList.addAll(updateChainWrapper.getCompareList()); compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); @@ -314,8 +295,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { append(SpecialConditionEnum.PUSH.getCondition(), BuildCondition.buildPushUpdateValue(pushConditionList)); } }}; - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return factory.getExecute().executeUpdate(query, DocumentUtil.handleBasicDBObject(basicDBObject), mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; + return factory.getExecute().executeUpdate(queryBasic, DocumentUtil.handleBasicDBObject(basicDBObject), mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; } @Override @@ -325,27 +305,16 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long remove(Bson filter, Class clazz) { - LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); - if (LogicDeleteHandler.close() || Objects.isNull(result)) { - return factory.getExecute().executeRemove(filter, mongoPlusClient.getCollection(clazz)).getDeletedCount(); - } - Bson query = LogicDeleteHandler.doBsonLogicDel(filter, clazz); - Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue()); - return factory.getExecute().executeUpdate( - query, - new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic), - mongoPlusClient.getCollection(clazz) - ).getModifiedCount(); + setCollectionClass(clazz); + return factory.getExecute().executeRemove(filter, mongoPlusClient.getCollection(clazz)).getDeletedCount(); } @Override public long count(QueryChainWrapper queryChainWrapper, Class clazz) { - List compareList = LogicDeleteHandler.doWrapperLogicDel(queryChainWrapper, clazz); + setCollectionClass(clazz); Execute execute = factory.getExecute(); MongoCollection collection = mongoPlusClient.getCollection(clazz); - return Optional.ofNullable(compareList) - .map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare), null, collection)) - .orElseGet(() -> execute.estimatedDocumentCount(collection)); + return Optional.ofNullable(queryChainWrapper.getCompareList()).map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare), null, collection)).orElseGet(() -> execute.estimatedDocumentCount(collection)); } /** @@ -364,23 +333,19 @@ public class DefaultBaseMapperImpl implements BaseMapper { // 返回-1 表示不查询总条数 return -1L; } - List compareList = new ArrayList<>(compareConditionList); - List compareConditions = LogicDeleteHandler.doWrapperLogicDel(clazz); - if (CollUtil.isNotEmpty(compareConditions)) { - compareList.addAll(compareConditions); - } + setCollectionClass(clazz); //分页查询 不查询实际总条数 需要单独查询 是否有数据 //如果recentPageNum = 10 第1-6页 总页数=10 从第7页开始 需要往后 + 4 页 int limitParam = (pageNum < (recentPageNum / 2 + 1 + recentPageNum % 2) ? recentPageNum : (pageNum + (recentPageNum / 2 + recentPageNum % 2 - 1))) * pageSize; CountOptions countOptions = new CountOptions(); countOptions.skip(limitParam).limit(1); - long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareList), countOptions, mongoPlusClient.getCollection(clazz)); + long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList), countOptions, mongoPlusClient.getCollection(clazz)); //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 if (isExists == 0) { // 查询真实总条数 CountOptions countOptionsReal = new CountOptions(); countOptionsReal.limit(limitParam); - return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareList), countOptions, mongoPlusClient.getCollection(clazz)); + return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList), countOptions, mongoPlusClient.getCollection(clazz)); } return limitParam; } @@ -392,16 +357,16 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List queryCommand(String command, Class clazz) { - Bson query = LogicDeleteHandler.doBsonLogicDel(BasicDBObject.parse(command), clazz); - FindIterable iterable = factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class); + setCollectionClass(clazz); + FindIterable iterable = factory.getExecute().executeQuery(BasicDBObject.parse(command), null, null, mongoPlusClient.getCollection(clazz), Document.class); return lambdaOperate.getLambdaQueryResult(iterable, clazz); } @Override public List getByColumn(String column, Object value, Class clazz) { + setCollectionClass(clazz); Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - Bson query = LogicDeleteHandler.doBsonLogicDel(filter, clazz); - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(query, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(filter, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override @@ -467,9 +432,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { } protected BasicDBObject checkIdType(Collection ids) { - List convertedIds = ids.stream() - .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) - .collect(Collectors.toList()); + List convertedIds = ids.stream().map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id).collect(Collectors.toList()); return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } @@ -499,9 +462,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { MongoCollection collection = mongoPlusClient.getCollection(clazz, "counters"); Document query = new Document(SqlOperationConstant._ID, collectionName); Document update = new Document("$inc", new Document(SqlOperationConstant.AUTO_NUM, 1)); - Document document = Optional.ofNullable(MongoTransactionContext.getClientSessionContext()) - .map(session -> collection.findOneAndUpdate(session, query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))) - .orElseGet(() -> collection.findOneAndUpdate(query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))); + Document document = Optional.ofNullable(MongoTransactionContext.getClientSessionContext()).map(session -> collection.findOneAndUpdate(session, query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))).orElseGet(() -> collection.findOneAndUpdate(query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))); int finalNum = 1; if (document == null) { Map map = new HashMap<>(); @@ -630,4 +591,14 @@ public class DefaultBaseMapperImpl implements BaseMapper { } } + /** + * 设置逻辑删除集合class + */ + private static void setCollectionClass(Class clazz) { + if (LogicDeleteHandler.close()) { + return; + } + ClassLogicDeleteCache.setLogicCollection(clazz); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index 65135a7..87e56ed 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -1,11 +1,23 @@ package com.anwen.mongo.proxy; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorProxyCache; import com.anwen.mongo.cache.global.InterceptorCache; +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.Execute; +import com.anwen.mongo.logic.LogicDeleteHandler; +import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; +import org.bson.Document; +import org.bson.conversions.Bson; import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Objects; @@ -26,12 +38,54 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + String name = method.getName(); - MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(name); - if (Objects.nonNull(executor)) { - InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); + boolean close = LogicDeleteHandler.close(); + try { + MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(name); + if (Objects.nonNull(executor)) { + InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); + } + // 将删除替换成逻辑删除 + if (!close && name.equals(ExecuteMethodEnum.REMOVE.getMethod())) { + return doLogicRemove(method, args); + } + return method.invoke(target, args); + } finally { + if (!close) { + ClassLogicDeleteCache.clear(); + } } - return method.invoke(target, args); + + } + + private Object doLogicRemove(Method method, Object[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (Objects.isNull(clazz)) { + return method.invoke(target, args); + } + LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); + if (Objects.isNull(result)) { + return method.invoke(target, args); + } + Method updateMethod = target.getClass().getMethod(ExecuteMethodEnum.UPDATE.getMethod(), Bson.class, Bson.class, MongoCollection.class); + Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue()); + BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic); + Object[] updateArgs = new Object[]{args[0], update, args[1]}; + UpdateResult res = (UpdateResult) updateMethod.invoke(target, updateArgs); + return new DeleteResult() { + @Override + public boolean wasAcknowledged() { + return false; + } + + @Override + public long getDeletedCount() { + return res.getModifiedCount(); + } + }; + } } diff --git a/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java b/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java index 9e138c5..c5f9e93 100644 --- a/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java +++ b/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java @@ -1,13 +1,13 @@ package com.anwen.mongoa.entity; -import com.anwen.mongo.annotation.TableLogic; +import com.anwen.mongo.annotation.collection.CollectionLogic; import lombok.Data; @Data public class Base { // @TableLogic(delval = "0", value = "1", close = true) - @TableLogic + @CollectionLogic private String logicDel; } -- Gitee From e1aa9fce59d78499a5ea68a16cd01fdbfe7bfec8 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 29 Apr 2024 21:34:57 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=AF=AF=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/anwen/mongoa/entity/Base.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java diff --git a/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java b/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java deleted file mode 100644 index c5f9e93..0000000 --- a/mongo-plus-demo/src/main/java/com/anwen/mongoa/entity/Base.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.anwen.mongoa.entity; - -import com.anwen.mongo.annotation.collection.CollectionLogic; -import lombok.Data; - -@Data -public class Base { - - // @TableLogic(delval = "0", value = "1", close = true) - @CollectionLogic - private String logicDel; - -} -- Gitee From c92e5dfef9f749929c73727aef8de1826d2c7806 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 01:38:56 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E8=A7=A3=E8=80=A6ExecutorProxy?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MongoPlusAutoConfiguration.java | 26 +++- .../cache/global/ExecutorReplacerCache.java | 18 +++ .../com/anwen/mongo/config/Configuration.java | 147 ++++++++++++------ .../logic/CollectionLogiceInterceptor.java | 94 +++++------ .../anwen/mongo/logic/LogicDeleteHandler.java | 9 +- .../mongo/logic/LogicRemoveReplacer.java | 62 ++++++++ .../mongo/mapper/DefaultBaseMapperImpl.java | 2 - .../com/anwen/mongo/proxy/ExecutorProxy.java | 66 ++------ .../com/anwen/mongo/replacer/Replacer.java | 23 +++ .../com/anwen/mongo/support/BoolFunction.java | 17 ++ 10 files changed, 308 insertions(+), 156 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/replacer/Replacer.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/support/BoolFunction.java diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 20d869f..1f2a3d8 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -1,8 +1,10 @@ package com.anwen.mongo.config; +import com.anwen.mongo.annotation.collection.CollectionField; import com.anwen.mongo.annotation.collection.CollectionLogic; import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.cache.global.ListenerCache; @@ -18,6 +20,7 @@ import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; import com.anwen.mongo.logic.AnnotationHandler; import com.anwen.mongo.logic.CollectionLogiceInterceptor; +import com.anwen.mongo.logic.LogicRemoveReplacer; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.ClassAnnotationFiled; @@ -25,6 +28,7 @@ import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBLogProperty; import com.anwen.mongo.property.MongoLogicDelProperty; +import com.anwen.mongo.replacer.Replacer; import com.anwen.mongo.service.IService; import com.anwen.mongo.service.impl.ServiceImpl; import com.anwen.mongo.strategy.convert.ConversionService; @@ -41,6 +45,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; +import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; @@ -89,6 +94,7 @@ public class MongoPlusAutoConfiguration implements InitializingBean { setDocumentHandler(); setListener(); setInterceptor(); + setReplacer(); setLogicDelete(); this.baseMapper = baseMapper; } @@ -112,11 +118,13 @@ public class MongoPlusAutoConfiguration implements InitializingBean { } ClassLogicDeleteCache.open = mongoLogicDelProperty.getOpen(); InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); + ExecutorReplacerCache.replacers.add(new LogicRemoveReplacer()); } private void setLogicFiled(Class clazz) { + // todo loser if (Objects.isNull(mongoLogicDelProperty) || !mongoLogicDelProperty.getOpen()) { return; } @@ -130,7 +138,10 @@ public class MongoPlusAutoConfiguration implements InitializingBean { return; } LogicDeleteResult result = new LogicDeleteResult(); - result.setColumn(targetInfo.getField().getName()); + Field field = targetInfo.getField(); + CollectionField collectionField = field.getAnnotation(CollectionField.class); + String column = Objects.nonNull(collectionField) && StringUtils.isNotEmpty(collectionField.value()) ? collectionField.value() : field.getName(); + result.setColumn(column); result.setLogicDeleteValue(StringUtils.isNotBlank(annotation.delval()) ? annotation.delval() : mongoLogicDelProperty.getLogicDeleteValue()); result.setLogicNotDeleteValue(StringUtils.isNotBlank(annotation.value()) ? annotation.value() : mongoLogicDelProperty.getLogicNotDeleteValue()); logicDeleteResultHashMap.put(clazz, result); @@ -272,4 +283,17 @@ public class MongoPlusAutoConfiguration implements InitializingBean { InterceptorCache.interceptors = new ArrayList<>(interceptorCollection); } + /** + * 从bean 容器中获取替换器 + * + * @author loser + */ + private void setReplacer() { + Collection replacers = applicationContext.getBeansOfType(Replacer.class).values(); + if (CollUtil.isNotEmpty(replacers)) { + replacers = replacers.stream().sorted(Comparator.comparing(Replacer::order)).collect(Collectors.toList()); + } + ExecutorReplacerCache.replacers = new ArrayList<>(replacers); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java new file mode 100644 index 0000000..f6e6707 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java @@ -0,0 +1,18 @@ +package com.anwen.mongo.cache.global; + +import com.anwen.mongo.replacer.Replacer; + +import java.util.ArrayList; +import java.util.List; + +/** + * executor 替换器 + * + * @author loser + * @date 2024/4/30 + */ +public class ExecutorReplacerCache { + + public static List replacers = new ArrayList<>(); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index bbd55fe..92fce60 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -1,5 +1,6 @@ package com.anwen.mongo.config; +import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.cache.global.ListenerCache; @@ -22,6 +23,7 @@ import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.mapper.DefaultBaseMapperImpl; import com.anwen.mongo.mapper.MongoPlusMapMapper; import com.anwen.mongo.model.BaseProperty; +import com.anwen.mongo.replacer.Replacer; import com.anwen.mongo.strategy.convert.ConversionService; import com.anwen.mongo.strategy.convert.ConversionStrategy; import com.anwen.mongo.toolkit.MongoCollectionUtils; @@ -36,7 +38,13 @@ import com.mongodb.client.MongoDatabase; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -49,50 +57,56 @@ public class Configuration { /** * MongoDB连接URL + * * @author JiaChaoYang * @date 2024/3/19 18:25 - */ + */ private String url; /** * 属性配置文件,url和baseProperty存在一个即可 + * * @author JiaChaoYang * @date 2024/3/19 18:25 - */ + */ private BaseProperty baseProperty = new BaseProperty(); /** * 集合名称获取策略 + * * @author JiaChaoYang * @date 2024/3/19 18:25 - */ + */ private CollectionNameConvert collectionNameConvert = MongoCollectionUtils.build(CollectionNameConvertEnum.ALL_CHAR_LOWERCASE); /** * 获取一个空的Configuration + * * @author JiaChaoYang * @date 2024/3/19 18:26 - */ - public static Configuration builder(){ + */ + public static Configuration builder() { return new Configuration(); } /** * 设置url + * * @author JiaChaoYang * @date 2024/3/19 18:26 - */ - public Configuration connection(String url){ + */ + public Configuration connection(String url) { this.url = url; return this; } /** * 设置属性配置文件 + * * @author JiaChaoYang * @date 2024/3/19 18:26 - */ - public Configuration connection(BaseProperty baseProperty){ + */ + public Configuration connection(BaseProperty baseProperty) { this.baseProperty = baseProperty; UrlJoint urlJoint = new UrlJoint(baseProperty); return connection(urlJoint.jointMongoUrl()); @@ -100,43 +114,46 @@ public class Configuration { /** * 配置数据库 + * * @param database 数据库 多个库使用逗号隔开 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 19:08 - */ - public Configuration database(String database){ + */ + public Configuration database(String database) { this.baseProperty.setDatabase(database); return this; } /** * 设置集合名称获取策略 + * * @author JiaChaoYang * @date 2024/3/19 18:27 - */ - public Configuration collectionNameConvert(CollectionNameConvertEnum collectionNameConvertEnum){ + */ + public Configuration collectionNameConvert(CollectionNameConvertEnum collectionNameConvertEnum) { this.collectionNameConvert = MongoCollectionUtils.build(collectionNameConvertEnum); return this; } /** * 设置转换器 + * * @param clazzConversions 转换器类 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 18:29 - */ + */ @SafeVarargs - public final Configuration convert(Class>... clazzConversions){ + public final Configuration convert(Class>... clazzConversions) { for (Class> clazzConversion : clazzConversions) { Type[] genericInterfaces = clazzConversion.getGenericInterfaces(); for (Type anInterface : genericInterfaces) { ParameterizedType parameterizedType = (ParameterizedType) anInterface; - if (parameterizedType.getRawType().equals(ConversionStrategy.class)){ + if (parameterizedType.getRawType().equals(ConversionStrategy.class)) { Class clazz = (Class) parameterizedType.getActualTypeArguments()[0]; try { - ConversionService.appendConversion(clazz,clazzConversion.getDeclaredConstructor().newInstance()); + ConversionService.appendConversion(clazz, clazzConversion.getDeclaredConstructor().newInstance()); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw new RuntimeException(e); @@ -150,57 +167,62 @@ public class Configuration { /** * 设置自动填充 + * * @param metaObjectHandler 元数据填充 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 18:29 - */ - public Configuration metaObjectHandler(MetaObjectHandler metaObjectHandler){ + */ + public Configuration metaObjectHandler(MetaObjectHandler metaObjectHandler) { HandlerCache.metaObjectHandler = metaObjectHandler; return this; } /** * 设置Document处理器 + * * @param documentHandler document处理器 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 18:30 - */ - public Configuration documentHandler(DocumentHandler documentHandler){ + */ + public Configuration documentHandler(DocumentHandler documentHandler) { HandlerCache.documentHandler = documentHandler; return this; } /** * 开启日志打印 + * * @author JiaChaoYang * @date 2024/3/19 18:31 - */ - public Configuration log(){ + */ + public Configuration log() { ListenerCache.listeners.add(new LogListener()); return this; } /** * 开启防攻击 + * * @author JiaChaoYang * @date 2024/3/19 18:31 - */ - public Configuration blockAttackInner(){ + */ + public Configuration blockAttackInner() { ListenerCache.listeners.add(new BlockAttackInnerListener()); return this; } /** * 设置监听器 + * * @param listeners 监听器 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 18:38 - */ + */ @SafeVarargs - public final Configuration listener(Class... listeners){ + public final Configuration listener(Class... listeners) { for (Class listener : listeners) { try { ListenerCache.listeners.add(listener.getDeclaredConstructor().newInstance()); @@ -214,13 +236,14 @@ public class Configuration { /** * 设置拦截器 + * * @param interceptors 拦截器 * @return com.anwen.mongo.config.Configuration * @author JiaChaoYang * @date 2024/3/19 18:38 - */ + */ @SafeVarargs - public final Configuration interceptor(Class... interceptors){ + public final Configuration interceptor(Class... interceptors) { for (Class interceptor : interceptors) { try { InterceptorCache.interceptors.add(interceptor.getDeclaredConstructor().newInstance()); @@ -233,38 +256,60 @@ public class Configuration { return this; } + /** + * 设置 替换器 + * + * @param replacers 替换器 + * @return 配置对象 + * @author loser + */ + @SafeVarargs + public final Configuration replacer(Class... replacers) { + for (Class replacer : replacers) { + try { + ExecutorReplacerCache.replacers.add(replacer.getDeclaredConstructor().newInstance()); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + ExecutorReplacerCache.replacers = ExecutorReplacerCache.replacers.stream().sorted(Comparator.comparing(Replacer::order)).collect(Collectors.toList()); + return this; + } + /** * 获取MongoPlusClient + * * @author JiaChaoYang * @date 2024/3/19 18:38 - */ - public MongoPlusClient getMongoPlusClient(){ - if (StringUtils.isBlank(url)){ + */ + public MongoPlusClient getMongoPlusClient() { + if (StringUtils.isBlank(url)) { throw new InitMongoPlusException("Connection URL not configured"); } - if (StringUtils.isBlank(baseProperty.getDatabase())){ + if (StringUtils.isBlank(baseProperty.getDatabase())) { throw new InitMongoPlusException("Connection database not configured"); } return initMongoPlusClient(); } - public MongoPlusClient initMongoPlusClient(){ + public MongoPlusClient initMongoPlusClient() { return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder() - .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty); + .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()), collectionNameConvert, baseProperty); } - public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert){ + public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert) { return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder() - .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty); + .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()), collectionNameConvert, baseProperty); } - public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert,BaseProperty baseProperty){ + public MongoPlusClient initMongoPlusClient(CollectionNameConvert collectionNameConvert, BaseProperty baseProperty) { return initMongoPlusClient(MongoClients.create(MongoClientSettings.builder() - .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()),collectionNameConvert,baseProperty); + .applyConnectionString(new ConnectionString(this.url)).commandListenerList(Collections.singletonList(new BaseListener())).build()), collectionNameConvert, baseProperty); } - public MongoPlusClient initMongoPlusClient(MongoClient mongoClient,CollectionNameConvert collectionNameConvert,BaseProperty baseProperty){ - if (StringUtils.isBlank(baseProperty.getDatabase())){ + public MongoPlusClient initMongoPlusClient(MongoClient mongoClient, CollectionNameConvert collectionNameConvert, BaseProperty baseProperty) { + if (StringUtils.isBlank(baseProperty.getDatabase())) { throw new InitMongoPlusException("Connection database not configured"); } MongoClientFactory.getInstance(mongoClient); @@ -272,14 +317,14 @@ public class Configuration { mongoPlusClient.setBaseProperty(baseProperty); mongoPlusClient.setCollectionNameConvert(collectionNameConvert); List mongoDatabaseList = new ArrayList<>(); - mongoPlusClient.setCollectionManagerMap(new ConcurrentHashMap>(){{ - put(DataSourceConstant.DEFAULT_DATASOURCE,new LinkedHashMap(){{ + mongoPlusClient.setCollectionManagerMap(new ConcurrentHashMap>() {{ + put(DataSourceConstant.DEFAULT_DATASOURCE, new LinkedHashMap() {{ String database = mongoPlusClient.getBaseProperty().getDatabase(); Arrays.stream(database.split(",")).collect(Collectors.toList()).forEach(db -> { CollectionManager collectionManager = new CollectionManager(mongoPlusClient.getMongoClient(), collectionNameConvert, db); MongoDatabase mongoDatabase = mongoPlusClient.getMongoClient().getDatabase(db); mongoDatabaseList.add(mongoDatabase); - put(db,collectionManager); + put(db, collectionManager); }); }}); }}); @@ -290,23 +335,25 @@ public class Configuration { /** * 设置数据源 + * * @author JiaChaoYang * @date 2024/4/5 1:48 - */ - public void setOtherDataSource(Map mongoClientMap){ + */ + public void setOtherDataSource(Map mongoClientMap) { MongoClientFactory.getInstance(mongoClientMap); } /** * 获取BaseMapper + * * @author JiaChaoYang * @date 2024/3/19 18:39 - */ - public BaseMapper getBaseMapper(){ + */ + public BaseMapper getBaseMapper() { return new DefaultBaseMapperImpl(getMongoPlusClient()); } - public MongoPlusMapMapper getMongoPlusMapMapper(){ + public MongoPlusMapMapper getMongoPlusMapMapper() { return new MongoPlusMapMapper(getMongoPlusClient()); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java index d8df7a4..6fc6161 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java @@ -1,14 +1,9 @@ package com.anwen.mongo.logic; import com.anwen.mongo.cache.global.ClassLogicDeleteCache; -import com.anwen.mongo.conditions.BuildCondition; -import com.anwen.mongo.enums.AggregateTypeEnum; import com.anwen.mongo.interceptor.Interceptor; -import com.anwen.mongo.model.AggregateBasicDBObject; -import com.anwen.mongo.model.BaseAggregate; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.model.QueryParam; -import com.anwen.mongo.strategy.aggregate.impl.DefaultConcretePipeline; import com.mongodb.BasicDBObject; import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.UpdateManyModel; @@ -20,73 +15,82 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +/** + * 逻辑删除拦截器 + * + * @author loser + * @date 2024/4/30 + */ public class CollectionLogiceInterceptor implements Interceptor { @Override public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeUpdate(queryBasic, updateBasic); + try { + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeUpdate(queryBasic, updateBasic); + } + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, updateBasic); + } finally { + ClassLogicDeleteCache.clear(); } - Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new MutablePair<>(query, updateBasic); } @Override public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); - } - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new QueryParam(query, projectionList, sortCond); - - } - - @Override - public List executeAggregate(List aggregateConditionList) { - - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeAggregate(aggregateConditionList); + try { + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); + } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new QueryParam(query, projectionList, sortCond); + } finally { + ClassLogicDeleteCache.clear(); } - BasicDBObject logicDelete = BuildCondition.buildQueryCondition(LogicDeleteHandler.doWrapperLogicDel(clazz)); - BaseAggregate aggregate = new BaseAggregate(AggregateTypeEnum.MATCH.getType(), new DefaultConcretePipeline(logicDelete), aggregateConditionList.size() + 1); - aggregateConditionList.add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(), aggregate.getOrder())); - return aggregateConditionList; } @Override public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeCount(queryBasic, countOptions); + try { + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeCount(queryBasic, countOptions); + } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, countOptions); + } finally { + ClassLogicDeleteCache.clear(); } - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new MutablePair<>(query, countOptions); } @Override + @SuppressWarnings("all") public List> executeBulkWrite(List> writeModelList) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeBulkWrite(writeModelList); - } - return writeModelList.stream().map(item -> { - if (item instanceof UpdateManyModel) { - UpdateManyModel umm = (UpdateManyModel) item; - Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); - return new UpdateManyModel(filter, umm.getUpdate()); + try { + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeBulkWrite(writeModelList); } - return item; - }).collect(Collectors.toList()); + return writeModelList.stream().map(item -> { + if (item instanceof UpdateManyModel) { + UpdateManyModel umm = (UpdateManyModel) item; + Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); + return new UpdateManyModel(filter, umm.getUpdate()); + } + return item; + }).collect(Collectors.toList()); + } finally { + ClassLogicDeleteCache.clear(); + } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java index 005a783..6788ad8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java @@ -3,8 +3,8 @@ package com.anwen.mongo.logic; import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; -import com.anwen.mongo.conditions.query.LambdaQueryChainWrapper; import com.anwen.mongo.conditions.query.QueryChainWrapper; +import com.anwen.mongo.conditions.query.QueryWrapper; import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.toolkit.ChainWrappers; import com.mongodb.BasicDBObject; @@ -43,6 +43,7 @@ public interface LogicDeleteHandler { * @param 文档类型 * @return 添加逻辑未删除的条件对象 */ + @SuppressWarnings("all") static Bson doBsonLogicDel(Bson query, Class clazz) { if (close()) { @@ -53,7 +54,7 @@ public interface LogicDeleteHandler { return query; } if (Objects.isNull(query)) { - LambdaQueryChainWrapper wrapper = ChainWrappers.lambdaQueryChain(null, clazz); + QueryChainWrapper wrapper = new QueryWrapper(); wrapper.eq(result.getColumn(), result.getLogicNotDeleteValue()); return BuildCondition.buildQueryCondition(wrapper.getCompareList()); } @@ -76,8 +77,8 @@ public interface LogicDeleteHandler { * @param 文档类型 * @return 添加逻辑未删除的条件集合 */ - @SuppressWarnings("unchecked") - static List doWrapperLogicDel(Class clazz) { + @SuppressWarnings("all") + static List doWrapperLogicDel(Class clazz) { return doWrapperLogicDel(null, clazz); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java new file mode 100644 index 0000000..67bcb57 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java @@ -0,0 +1,62 @@ +package com.anwen.mongo.logic; + +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.enums.SpecialConditionEnum; +import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.replacer.Replacer; +import com.anwen.mongo.support.BoolFunction; +import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.result.DeleteResult; +import com.mongodb.client.result.UpdateResult; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.lang.reflect.Method; +import java.util.Objects; + +/** + * 逻辑删除替换器 + * + * @author loser + * @date 2024/4/30 + */ +public class LogicRemoveReplacer implements Replacer { + + @Override + public Object invoke(Object proxy, Object target, Method method, Object[] args) throws Throwable { + + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (Objects.isNull(clazz)) { + return method.invoke(target, args); + } + LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); + if (Objects.isNull(result)) { + return method.invoke(target, args); + } + Method updateMethod = target.getClass().getMethod(ExecuteMethodEnum.UPDATE.getMethod(), Bson.class, Bson.class, MongoCollection.class); + Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue()); + BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic); + Object[] updateArgs = new Object[]{args[0], update, args[1]}; + UpdateResult res = (UpdateResult) updateMethod.invoke(target, updateArgs); + return new DeleteResult() { + @Override + public boolean wasAcknowledged() { + return res.wasAcknowledged(); + } + + @Override + public long getDeletedCount() { + return res.getModifiedCount(); + } + }; + + } + + @Override + public BoolFunction supplier() { + return (proxy, target, method, args) -> ClassLogicDeleteCache.open && method.getName().equals(ExecuteMethodEnum.REMOVE.getMethod()); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 273b85d..1c4c1b5 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -215,7 +215,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - // todo loser if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { count = factory.getExecute().estimatedDocumentCount(collection); } else { @@ -239,7 +238,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - // todo loser if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { count = factory.getExecute().estimatedDocumentCount(collection); } else { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index 87e56ed..03b22c6 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -1,23 +1,13 @@ package com.anwen.mongo.proxy; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorProxyCache; +import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.InterceptorCache; -import com.anwen.mongo.enums.ExecuteMethodEnum; -import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.Execute; -import com.anwen.mongo.logic.LogicDeleteHandler; -import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.replacer.Replacer; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; -import com.mongodb.BasicDBObject; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.result.DeleteResult; -import com.mongodb.client.result.UpdateResult; -import org.bson.Document; -import org.bson.conversions.Bson; import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Objects; @@ -39,52 +29,20 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - String name = method.getName(); - boolean close = LogicDeleteHandler.close(); - try { - MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(name); - if (Objects.nonNull(executor)) { - InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); - } - // 将删除替换成逻辑删除 - if (!close && name.equals(ExecuteMethodEnum.REMOVE.getMethod())) { - return doLogicRemove(method, args); - } - return method.invoke(target, args); - } finally { - if (!close) { - ClassLogicDeleteCache.clear(); - } + // 参数替换拦截器 + MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(method.getName()); + if (Objects.nonNull(executor)) { + InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); } - } - - private Object doLogicRemove(Method method, Object[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { - - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (Objects.isNull(clazz)) { - return method.invoke(target, args); - } - LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); - if (Objects.isNull(result)) { - return method.invoke(target, args); - } - Method updateMethod = target.getClass().getMethod(ExecuteMethodEnum.UPDATE.getMethod(), Bson.class, Bson.class, MongoCollection.class); - Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue()); - BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic); - Object[] updateArgs = new Object[]{args[0], update, args[1]}; - UpdateResult res = (UpdateResult) updateMethod.invoke(target, updateArgs); - return new DeleteResult() { - @Override - public boolean wasAcknowledged() { - return false; + // 方法替换执行器 执行首个命中执行器 + for (Replacer replacer : ExecutorReplacerCache.replacers) { + if (replacer.supplier().get(proxy, target, method, args)) { + return replacer.invoke(proxy, target, method, args); } + } - @Override - public long getDeletedCount() { - return res.getModifiedCount(); - } - }; + return method.invoke(target, args); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/replacer/Replacer.java b/mongo-plus-core/src/main/java/com/anwen/mongo/replacer/Replacer.java new file mode 100644 index 0000000..2b8ec5a --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/replacer/Replacer.java @@ -0,0 +1,23 @@ +package com.anwen.mongo.replacer; + +import com.anwen.mongo.support.BoolFunction; + +import java.lang.reflect.Method; + +/** + * 替换器接 + * + * @author loser + * @date 2024/4/30 + */ +public interface Replacer { + + default int order() { + return Integer.MIN_VALUE; + } + + Object invoke(Object proxy, Object target, Method method, Object[] args) throws Throwable; + + BoolFunction supplier(); + +} \ No newline at end of file diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/support/BoolFunction.java b/mongo-plus-core/src/main/java/com/anwen/mongo/support/BoolFunction.java new file mode 100644 index 0000000..8a13da4 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/support/BoolFunction.java @@ -0,0 +1,17 @@ +package com.anwen.mongo.support; + + +import java.lang.reflect.Method; + +/** + * boolean function + * + * @author loser + * @date 2024/4/30 + */ +@FunctionalInterface +public interface BoolFunction { + + boolean get(Object proxy, Object target, Method method, Object[] args); + +} -- Gitee From 3f9f7511d78f063e035bb72195d40b6f30b54272 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 01:50:27 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E6=8B=A6=E6=88=AAexecuteRemove=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/logic/CollectionLogiceInterceptor.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java index 6fc6161..452c7c3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java @@ -23,6 +23,21 @@ import java.util.stream.Collectors; */ public class CollectionLogiceInterceptor implements Interceptor { + @Override + public Bson executeRemove(Bson filter) { + + try { + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeRemove(filter); + } + return LogicDeleteHandler.doBsonLogicDel(filter, clazz); + } finally { + ClassLogicDeleteCache.clear(); + } + + } + @Override public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { -- Gitee From f0900768d845cbb2b72cfffe3e02e1cf8f7769de Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 14:53:25 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=85=8D=E7=BD=AE=E5=88=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=B0core=E6=A8=A1=E5=9D=97=E4=B8=8Bconfiguration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MongoPlusAutoConfiguration.java | 79 +++------------- .../mongo/property/MongoLogicDelProperty.java | 54 +---------- .../cache/global/ExecutorReplacerCache.java | 6 ++ .../mongo/cache/global/InterceptorCache.java | 6 ++ .../com/anwen/mongo/config/Configuration.java | 91 +++++++++++++++++++ .../logic/CollectionLogiceInterceptor.java | 80 ++++++---------- .../com/anwen/mongo/model/LogicProperty.java | 62 +++++++++++++ .../com/anwen/mongo/proxy/ExecutorProxy.java | 27 +++--- 8 files changed, 224 insertions(+), 181 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 1f2a3d8..7ed39e8 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -1,9 +1,6 @@ package com.anwen.mongo.config; -import com.anwen.mongo.annotation.collection.CollectionField; -import com.anwen.mongo.annotation.collection.CollectionLogic; import com.anwen.mongo.annotation.collection.CollectionName; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; @@ -18,13 +15,8 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.listener.Listener; import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; -import com.anwen.mongo.logic.AnnotationHandler; -import com.anwen.mongo.logic.CollectionLogiceInterceptor; -import com.anwen.mongo.logic.LogicRemoveReplacer; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; -import com.anwen.mongo.model.ClassAnnotationFiled; -import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBLogProperty; import com.anwen.mongo.property.MongoLogicDelProperty; @@ -34,7 +26,6 @@ import com.anwen.mongo.service.impl.ServiceImpl; import com.anwen.mongo.strategy.convert.ConversionService; import com.anwen.mongo.strategy.convert.ConversionStrategy; import com.anwen.mongo.toolkit.CollUtil; -import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.MongoException; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; @@ -45,7 +36,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; -import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; @@ -54,7 +44,6 @@ import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -95,70 +84,24 @@ public class MongoPlusAutoConfiguration implements InitializingBean { setListener(); setInterceptor(); setReplacer(); - setLogicDelete(); this.baseMapper = baseMapper; } @Override public void afterPropertiesSet() { - applicationContext.getBeansOfType(IService.class) - .values() - .stream() - .filter(s -> s instanceof ServiceImpl) - .forEach(s -> { - setExecute((ServiceImpl) s, s.getGenericityClass()); - setLogicFiled(s.getGenericityClass()); - }); + Collection values = applicationContext.getBeansOfType(IService.class).values(); + values.forEach(s -> setExecute((ServiceImpl) s, s.getGenericityClass())); + setLogicFiled(values.stream().map(IService::getGenericityClass).toArray(Class[]::new)); } - private void setLogicDelete() { - - if (Objects.isNull(mongoLogicDelProperty)) { - return; - } - ClassLogicDeleteCache.open = mongoLogicDelProperty.getOpen(); - InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); - ExecutorReplacerCache.replacers.add(new LogicRemoveReplacer()); - - } - - private void setLogicFiled(Class clazz) { - - // todo loser - if (Objects.isNull(mongoLogicDelProperty) || !mongoLogicDelProperty.getOpen()) { - return; - } - - Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; - ClassAnnotationFiled targetInfo = AnnotationHandler.getAnnotationOnFiled(clazz, CollectionLogic.class); - // 优先使用每个对象自定义规则 - if (Objects.nonNull(targetInfo)) { - CollectionLogic annotation = targetInfo.getTargetAnnotation(); - if (annotation.close()) { - return; - } - LogicDeleteResult result = new LogicDeleteResult(); - Field field = targetInfo.getField(); - CollectionField collectionField = field.getAnnotation(CollectionField.class); - String column = Objects.nonNull(collectionField) && StringUtils.isNotEmpty(collectionField.value()) ? collectionField.value() : field.getName(); - result.setColumn(column); - result.setLogicDeleteValue(StringUtils.isNotBlank(annotation.delval()) ? annotation.delval() : mongoLogicDelProperty.getLogicDeleteValue()); - result.setLogicNotDeleteValue(StringUtils.isNotBlank(annotation.value()) ? annotation.value() : mongoLogicDelProperty.getLogicNotDeleteValue()); - logicDeleteResultHashMap.put(clazz, result); - return; - } - - // 其次使用全局配置规则 - if (StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicDeleteField()) - && StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicDeleteValue()) - && StringUtils.isNotEmpty(mongoLogicDelProperty.getLogicNotDeleteValue())) { - LogicDeleteResult result = new LogicDeleteResult(); - result.setColumn(mongoLogicDelProperty.getLogicDeleteField()); - result.setLogicDeleteValue(mongoLogicDelProperty.getLogicDeleteValue()); - result.setLogicNotDeleteValue(mongoLogicDelProperty.getLogicNotDeleteValue()); - logicDeleteResultHashMap.put(clazz, result); - } - + /** + * 配置逻辑删除 + * + * @param collectionClasses 需要进行逻辑删除的 collection class 集合 + * @author loser + */ + private void setLogicFiled(Class... collectionClasses) { + Configuration.builder().logic(this.mongoLogicDelProperty).setLogicFiled(collectionClasses); } private void setExecute(ServiceImpl serviceImpl, Class clazz) { diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java index d47d05e..bc061a9 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoLogicDelProperty.java @@ -1,5 +1,6 @@ package com.anwen.mongo.property; +import com.anwen.mongo.model.LogicProperty; import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -9,57 +10,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @date 2024/4/28 */ @ConfigurationProperties(prefix = "mongo-plus.configuration.logic") -public class MongoLogicDelProperty { +public class MongoLogicDelProperty extends LogicProperty { - /** - * 是否开启逻辑删除功能 - */ - private Boolean open = false; - - /** - * 逻辑删除全局属性名 - */ - private String logicDeleteField; - - /** - * 逻辑删除全局值(默认 1、表示已删除) - */ - private String logicDeleteValue = "1"; - - /** - * 逻辑未删除全局值(默认 0、表示未删除) - */ - private String logicNotDeleteValue = "0"; - - public Boolean getOpen() { - return open; - } - - public void setOpen(Boolean open) { - this.open = open; - } - - public String getLogicDeleteField() { - return logicDeleteField; - } - - public void setLogicDeleteField(String logicDeleteField) { - this.logicDeleteField = logicDeleteField; - } - - public String getLogicDeleteValue() { - return logicDeleteValue; - } - - public void setLogicDeleteValue(String logicDeleteValue) { - this.logicDeleteValue = logicDeleteValue; - } - - public String getLogicNotDeleteValue() { - return logicNotDeleteValue; - } - - public void setLogicNotDeleteValue(String logicNotDeleteValue) { - this.logicNotDeleteValue = logicNotDeleteValue; - } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java index f6e6707..4d52f8d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorReplacerCache.java @@ -3,7 +3,9 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.replacer.Replacer; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /** * executor 替换器 @@ -15,4 +17,8 @@ public class ExecutorReplacerCache { public static List replacers = new ArrayList<>(); + public static void sorted() { + replacers = replacers.stream().sorted(Comparator.comparing(Replacer::order)).collect(Collectors.toList()); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/InterceptorCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/InterceptorCache.java index 7f1a605..4ac3c9f 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/InterceptorCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/InterceptorCache.java @@ -3,7 +3,9 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.interceptor.Interceptor; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /** * 拦截器 @@ -14,4 +16,8 @@ public class InterceptorCache { public static List interceptors = new ArrayList<>(); + public static void sorted() { + interceptors = interceptors.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index 92fce60..d19b1dc 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -1,5 +1,8 @@ package com.anwen.mongo.config; +import com.anwen.mongo.annotation.collection.CollectionField; +import com.anwen.mongo.annotation.collection.CollectionLogic; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; @@ -18,11 +21,17 @@ import com.anwen.mongo.listener.BaseListener; import com.anwen.mongo.listener.Listener; import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; +import com.anwen.mongo.logic.AnnotationHandler; +import com.anwen.mongo.logic.CollectionLogiceInterceptor; +import com.anwen.mongo.logic.LogicRemoveReplacer; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.mapper.DefaultBaseMapperImpl; import com.anwen.mongo.mapper.MongoPlusMapMapper; import com.anwen.mongo.model.BaseProperty; +import com.anwen.mongo.model.ClassAnnotationFiled; +import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.model.LogicProperty; import com.anwen.mongo.replacer.Replacer; import com.anwen.mongo.strategy.convert.ConversionService; import com.anwen.mongo.strategy.convert.ConversionStrategy; @@ -35,6 +44,7 @@ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -45,6 +55,7 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -71,6 +82,13 @@ public class Configuration { */ private BaseProperty baseProperty = new BaseProperty(); + /** + * 逻辑删除配置 + * + * @author loser + */ + private LogicProperty logicProperty = new LogicProperty(); + /** * 集合名称获取策略 * @@ -357,4 +375,77 @@ public class Configuration { return new MongoPlusMapMapper(getMongoPlusClient()); } + /** + * 配置逻辑删除 + * + * @param logicProperty 逻辑删除配置 + * @return 全局配置对象 + * @author loser + */ + public Configuration logic(LogicProperty logicProperty) { + + this.logicProperty = logicProperty; + ClassLogicDeleteCache.open = logicProperty.getOpen(); + if (logicProperty.getOpen()) { + InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); + InterceptorCache.sorted(); + ExecutorReplacerCache.replacers.add(new LogicRemoveReplacer()); + ExecutorReplacerCache.sorted(); + } + return this; + + } + + /** + * 注册逻辑删除 class + * + * @param collectionClasses 需要注册的 class 集合 + * @return 全局配置对象 + * @author loser + */ + public Configuration setLogicFiled(Class... collectionClasses) { + + if (Objects.isNull(logicProperty) || !logicProperty.getOpen()) { + return this; + } + Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; + + for (Class clazz : collectionClasses) { + if (logicDeleteResultHashMap.containsKey(clazz)) { + continue; + } + ClassAnnotationFiled targetInfo = AnnotationHandler.getAnnotationOnFiled(clazz, CollectionLogic.class); + // 优先使用每个对象自定义规则 + if (Objects.nonNull(targetInfo)) { + CollectionLogic annotation = targetInfo.getTargetAnnotation(); + if (annotation.close()) { + continue; + } + LogicDeleteResult result = new LogicDeleteResult(); + Field field = targetInfo.getField(); + CollectionField collectionField = field.getAnnotation(CollectionField.class); + String column = Objects.nonNull(collectionField) && StringUtils.isNotEmpty(collectionField.value()) ? collectionField.value() : field.getName(); + result.setColumn(column); + result.setLogicDeleteValue(StringUtils.isNotBlank(annotation.delval()) ? annotation.delval() : logicProperty.getLogicDeleteValue()); + result.setLogicNotDeleteValue(StringUtils.isNotBlank(annotation.value()) ? annotation.value() : logicProperty.getLogicNotDeleteValue()); + logicDeleteResultHashMap.put(clazz, result); + continue; + } + + // 其次使用全局配置规则 + if (StringUtils.isNotEmpty(logicProperty.getLogicDeleteField()) + && StringUtils.isNotEmpty(logicProperty.getLogicDeleteValue()) + && StringUtils.isNotEmpty(logicProperty.getLogicNotDeleteValue())) { + LogicDeleteResult result = new LogicDeleteResult(); + result.setColumn(logicProperty.getLogicDeleteField()); + result.setLogicDeleteValue(logicProperty.getLogicDeleteValue()); + result.setLogicNotDeleteValue(logicProperty.getLogicNotDeleteValue()); + logicDeleteResultHashMap.put(clazz, result); + } + + } + return this; + + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java index 452c7c3..c9c8e0c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java @@ -26,63 +26,47 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override public Bson executeRemove(Bson filter) { - try { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeRemove(filter); - } - return LogicDeleteHandler.doBsonLogicDel(filter, clazz); - } finally { - ClassLogicDeleteCache.clear(); + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeRemove(filter); } + return LogicDeleteHandler.doBsonLogicDel(filter, clazz); } @Override public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { - try { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeUpdate(queryBasic, updateBasic); - } - Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new MutablePair<>(query, updateBasic); - } finally { - ClassLogicDeleteCache.clear(); + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeUpdate(queryBasic, updateBasic); } + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, updateBasic); } @Override public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond) { - try { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); - } - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new QueryParam(query, projectionList, sortCond); - } finally { - ClassLogicDeleteCache.clear(); + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new QueryParam(query, projectionList, sortCond); } @Override public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions) { - try { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeCount(queryBasic, countOptions); - } - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); - return new MutablePair<>(query, countOptions); - } finally { - ClassLogicDeleteCache.clear(); + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeCount(queryBasic, countOptions); } + BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + return new MutablePair<>(query, countOptions); } @@ -90,22 +74,18 @@ public class CollectionLogiceInterceptor implements Interceptor { @SuppressWarnings("all") public List> executeBulkWrite(List> writeModelList) { - try { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); - if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeBulkWrite(writeModelList); - } - return writeModelList.stream().map(item -> { - if (item instanceof UpdateManyModel) { - UpdateManyModel umm = (UpdateManyModel) item; - Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); - return new UpdateManyModel(filter, umm.getUpdate()); - } - return item; - }).collect(Collectors.toList()); - } finally { - ClassLogicDeleteCache.clear(); + Class clazz = ClassLogicDeleteCache.getLogicCollection(); + if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { + return Interceptor.super.executeBulkWrite(writeModelList); } + return writeModelList.stream().map(item -> { + if (item instanceof UpdateManyModel) { + UpdateManyModel umm = (UpdateManyModel) item; + Bson filter = LogicDeleteHandler.doBsonLogicDel(umm.getFilter(), clazz); + return new UpdateManyModel(filter, umm.getUpdate()); + } + return item; + }).collect(Collectors.toList()); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java new file mode 100644 index 0000000..de0d2ac --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java @@ -0,0 +1,62 @@ +package com.anwen.mongo.model; + +/** + * @author JiaChaoYang + * @project mongo-plus + * @description + * @date 2023-02-23 10:42 + **/ +public class LogicProperty { + + /** + * 是否开启逻辑删除功能 + */ + private Boolean open = false; + + /** + * 逻辑删除全局属性名 + */ + private String logicDeleteField; + + /** + * 逻辑删除全局值(默认 1、表示已删除) + */ + private String logicDeleteValue = "1"; + + /** + * 逻辑未删除全局值(默认 0、表示未删除) + */ + private String logicNotDeleteValue = "0"; + + public Boolean getOpen() { + return open; + } + + public void setOpen(Boolean open) { + this.open = open; + } + + public String getLogicDeleteField() { + return logicDeleteField; + } + + public void setLogicDeleteField(String logicDeleteField) { + this.logicDeleteField = logicDeleteField; + } + + public String getLogicDeleteValue() { + return logicDeleteValue; + } + + public void setLogicDeleteValue(String logicDeleteValue) { + this.logicDeleteValue = logicDeleteValue; + } + + public String getLogicNotDeleteValue() { + return logicNotDeleteValue; + } + + public void setLogicNotDeleteValue(String logicNotDeleteValue) { + this.logicNotDeleteValue = logicNotDeleteValue; + } +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index 03b22c6..c930018 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -1,5 +1,6 @@ package com.anwen.mongo.proxy; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorProxyCache; import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.InterceptorCache; @@ -29,20 +30,24 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - // 参数替换拦截器 - MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(method.getName()); - if (Objects.nonNull(executor)) { - InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); - } + try { + // 参数替换拦截器 + MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(method.getName()); + if (Objects.nonNull(executor)) { + InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); + } - // 方法替换执行器 执行首个命中执行器 - for (Replacer replacer : ExecutorReplacerCache.replacers) { - if (replacer.supplier().get(proxy, target, method, args)) { - return replacer.invoke(proxy, target, method, args); + // 方法替换执行器 执行首个命中执行器 + for (Replacer replacer : ExecutorReplacerCache.replacers) { + if (replacer.supplier().get(proxy, target, method, args)) { + return replacer.invoke(proxy, target, method, args); + } } - } - return method.invoke(target, args); + return method.invoke(target, args); + } finally { + ClassLogicDeleteCache.clear(); + } } -- Gitee From bacdd8b233e67526743d840c43d3a5a72c51f577 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 15:45:50 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E5=B0=81=E8=A3=85=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=E3=80=81=E7=9B=91=E5=90=AC=E5=99=A8=E3=80=81=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E5=99=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/anwen/mongo/config/MongoPlusAutoConfiguration.java | 4 ++-- .../java/com/anwen/mongo/cache/global/ListenerCache.java | 6 ++++++ .../src/main/java/com/anwen/mongo/config/Configuration.java | 5 ++--- .../com/anwen/mongo/config/MongoPlusAutoConfiguration.java | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 7ed39e8..ad10486 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -198,7 +198,7 @@ public class MongoPlusAutoConfiguration implements InitializingBean { * @date 2023/11/22 18:39 */ private void setListener() { - List listeners = new ArrayList<>(); + List listeners = ListenerCache.listeners; if (mongodbLogProperty.getLog()) { listeners.add(new LogListener()); } @@ -209,7 +209,7 @@ public class MongoPlusAutoConfiguration implements InitializingBean { if (CollUtil.isNotEmpty(listenerCollection)) { listeners.addAll(listenerCollection); } - ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); + ListenerCache.sorted(); } /** diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java index f8cb392..c2ab959 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java @@ -3,7 +3,9 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.listener.Listener; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /** * @author JiaChaoYang @@ -15,4 +17,8 @@ public class ListenerCache { public static List listeners = new ArrayList<>(); + public static void sorted() { + listeners = listeners.stream().sorted(Comparator.comparing(Listener::getOrder)).collect(Collectors.toList()); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index d19b1dc..05333ba 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -51,7 +51,6 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -270,7 +269,7 @@ public class Configuration { throw new RuntimeException(e); } } - InterceptorCache.interceptors = InterceptorCache.interceptors.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); + InterceptorCache.sorted(); return this; } @@ -291,7 +290,7 @@ public class Configuration { throw new RuntimeException(e); } } - ExecutorReplacerCache.replacers = ExecutorReplacerCache.replacers.stream().sorted(Comparator.comparing(Replacer::order)).collect(Collectors.toList()); + ExecutorReplacerCache.sorted(); return this; } diff --git a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index d08120d..16f2069 100644 --- a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -168,7 +168,7 @@ public class MongoPlusAutoConfiguration { * @date 2023/11/22 18:39 */ private void setListener(AppContext context){ - List listeners = new ArrayList<>(); + List listeners = ListenerCache.listeners; if (mongoDBLogProperty.getLog()){ listeners.add(new LogListener()); } @@ -179,7 +179,8 @@ public class MongoPlusAutoConfiguration { if (CollUtil.isNotEmpty(listenerCollection)){ listeners.addAll(listenerCollection); } - ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); + ListenerCache.sorted(); + } /** -- Gitee From a783ebe1fba6730607d29c67d5ff21775d0068eb Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 17:57:35 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E6=89=A9=E5=B1=95Interceptor=E3=80=81?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4class=20?= =?UTF-8?q?=E4=BB=8EThreadLocal=E4=B8=BAMongoCollection=E3=80=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=80=BB=E8=BE=91=E5=AD=97=E6=AE=B5=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=A1=AB=E5=85=85=E6=8B=A6=E6=88=AA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cache/global/ClassLogicDeleteCache.java | 22 ++---- .../com/anwen/mongo/config/Configuration.java | 28 ++++++- .../anwen/mongo/conn/CollectionManager.java | 17 +++-- .../mongo/domain/InitMongoLogicException.java | 16 ++++ .../anwen/mongo/interceptor/Interceptor.java | 73 +++++++++++++++++++ .../anwen/mongo/logic/LogicDeleteHandler.java | 17 +++++ .../CollectionLogiceInterceptor.java | 37 +++++----- .../interceptor/LogicAutoFillInterceptor.java | 43 +++++++++++ .../{ => replacer}/LogicRemoveReplacer.java | 5 +- .../mongo/mapper/DefaultBaseMapperImpl.java | 33 --------- .../com/anwen/mongo/model/LogicProperty.java | 13 ++++ .../com/anwen/mongo/proxy/ExecutorProxy.java | 27 +++---- .../impl/AggregateExecutorStrategy.java | 3 + .../impl/BulkWriteExecutorStrategy.java | 2 + .../executor/impl/CountExecutorStrategy.java | 5 ++ .../executor/impl/QueryExecutorStrategy.java | 6 ++ .../executor/impl/RemoveExecutorStrategy.java | 3 + .../executor/impl/SaveExecutorStrategy.java | 2 + .../executor/impl/UpdateExecutorStrategy.java | 5 ++ 19 files changed, 265 insertions(+), 92 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/domain/InitMongoLogicException.java rename mongo-plus-core/src/main/java/com/anwen/mongo/logic/{ => interceptor}/CollectionLogiceInterceptor.java (64%) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java rename mongo-plus-core/src/main/java/com/anwen/mongo/logic/{ => replacer}/LogicRemoveReplacer.java (91%) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java index a22a5c2..b35f0e8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java @@ -1,9 +1,11 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.model.LogicDeleteResult; +import com.anwen.mongo.model.LogicProperty; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 全局逻辑删除基础信息缓存 @@ -18,24 +20,16 @@ public class ClassLogicDeleteCache { */ public static Boolean open = false; + /** + * 逻辑删除配置 + */ + public static LogicProperty logicProperty = new LogicProperty(); + /** * 目标文档对应的逻辑删除字段 */ public static final Map, LogicDeleteResult> logicDeleteResultHashMap = new HashMap<>(); - private static final ThreadLocal> logicCollection = new InheritableThreadLocal<>(); - - public static void setLogicCollection(Class clazz) { - logicCollection.set(clazz); - } - - public static Class getLogicCollection() { - return logicCollection.get(); - } - - public static void clear() { - logicCollection.remove(); - } - + public static final Map> fullNameMap = new ConcurrentHashMap<>(); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index 05333ba..df6f844 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -11,6 +11,7 @@ import com.anwen.mongo.cache.global.MongoPlusClientCache; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.constant.DataSourceConstant; import com.anwen.mongo.convert.CollectionNameConvert; +import com.anwen.mongo.domain.InitMongoLogicException; import com.anwen.mongo.domain.InitMongoPlusException; import com.anwen.mongo.enums.CollectionNameConvertEnum; import com.anwen.mongo.factory.MongoClientFactory; @@ -22,8 +23,9 @@ import com.anwen.mongo.listener.Listener; import com.anwen.mongo.listener.business.BlockAttackInnerListener; import com.anwen.mongo.listener.business.LogListener; import com.anwen.mongo.logic.AnnotationHandler; -import com.anwen.mongo.logic.CollectionLogiceInterceptor; -import com.anwen.mongo.logic.LogicRemoveReplacer; +import com.anwen.mongo.logic.interceptor.CollectionLogiceInterceptor; +import com.anwen.mongo.logic.interceptor.LogicAutoFillInterceptor; +import com.anwen.mongo.logic.replacer.LogicRemoveReplacer; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.mapper.DefaultBaseMapperImpl; @@ -383,10 +385,17 @@ public class Configuration { */ public Configuration logic(LogicProperty logicProperty) { + if (Objects.isNull(logicProperty)) { + throw new InitMongoLogicException("Config logic logicProperty not null"); + } this.logicProperty = logicProperty; ClassLogicDeleteCache.open = logicProperty.getOpen(); + ClassLogicDeleteCache.logicProperty = logicProperty; if (logicProperty.getOpen()) { InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); + if (logicProperty.getAutoFill()) { + InterceptorCache.interceptors.add(new LogicAutoFillInterceptor()); + } InterceptorCache.sorted(); ExecutorReplacerCache.replacers.add(new LogicRemoveReplacer()); ExecutorReplacerCache.sorted(); @@ -403,8 +412,19 @@ public class Configuration { * @author loser */ public Configuration setLogicFiled(Class... collectionClasses) { + return setLogicFiled(logicProperty, collectionClasses); + } + + /** + * 注册逻辑删除 class + * + * @param collectionClasses 需要注册的 class 集合 + * @return 全局配置对象 + * @author loser + */ + public Configuration setLogicFiled(LogicProperty logicProperty, Class... collectionClasses) { - if (Objects.isNull(logicProperty) || !logicProperty.getOpen()) { + if (Objects.isNull(collectionClasses) || Objects.isNull(logicProperty) || !logicProperty.getOpen()) { return this; } Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; @@ -440,7 +460,9 @@ public class Configuration { result.setLogicDeleteValue(logicProperty.getLogicDeleteValue()); result.setLogicNotDeleteValue(logicProperty.getLogicNotDeleteValue()); logicDeleteResultHashMap.put(clazz, result); + continue; } + logicDeleteResultHashMap.put(clazz, null); } return this; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java index 3d5b329..5c7e14b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java @@ -1,5 +1,6 @@ package com.anwen.mongo.conn; +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.factory.MongoClientFactory; import com.anwen.mongo.toolkit.ClassTypeUtil; @@ -22,6 +23,7 @@ public class CollectionManager { /** * 缓存mongoCollection + * * @author JiaChaoYang * @date 2023/12/28 10:58 */ @@ -38,24 +40,27 @@ public class CollectionManager { /** * 设置一个连接 + * * @author JiaChaoYang * @date 2023/12/28 11:20 - */ - public void setCollectionMap(String key,MongoCollection value){ - collectionMap.put(key,value); + */ + public void setCollectionMap(String key, MongoCollection value) { + collectionMap.put(key, value); } private MongoCollection getCollection(T entity) { return getCollection(ClassTypeUtil.getClass(entity)).withCodecRegistry(RegisterCodecUtil.registerCodec(entity)); } - private MongoCollection getCollection(String collectionName,Map map){ + private MongoCollection getCollection(String collectionName, Map map) { return getCollection(collectionName).withCodecRegistry(RegisterCodecUtil.registerCodec(map)); } public MongoCollection getCollection(Class clazz) { String collectionName = this.collectionNameConvert.convert(clazz); - return getCollection(collectionName); + MongoCollection collection = getCollection(collectionName); + ClassLogicDeleteCache.fullNameMap.put(collection.getNamespace().getFullName(), clazz); + return collection; } public MongoCollection getCollection(String collectionName) { @@ -64,7 +69,7 @@ public class CollectionManager { if (!this.collectionMap.containsKey(collectionName)) { mongoCollection = new ConnectMongoDB(MongoClientFactory.getInstance().getMongoClient(), database, collectionName).open(); this.collectionMap.put(collectionName, mongoCollection); - }else { + } else { mongoCollection = this.collectionMap.get(collectionName); } return mongoCollection.withCodecRegistry(RegisterCodecUtil.getCodecCacheAndDefault()); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/domain/InitMongoLogicException.java b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/InitMongoLogicException.java new file mode 100644 index 0000000..25c8e39 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/InitMongoLogicException.java @@ -0,0 +1,16 @@ +package com.anwen.mongo.domain; + +/** + * 初始化MongoPlus逻辑删除异常 + * + * @author loser + * @date 2024/4/30 + */ +public class InitMongoLogicException extends MongoPlusException { + + public InitMongoLogicException(String message) { + super(message); + this.message = message; + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java index 0a8b5f8..d76730d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java @@ -4,6 +4,7 @@ import com.anwen.mongo.model.AggregateBasicDBObject; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.model.QueryParam; import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.WriteModel; import org.bson.Document; @@ -99,4 +100,76 @@ public interface Interceptor { return writeModelList; } + /** + * 添加拦截方法 + * + * @param documentList 经过添加方法的值 + * @return java.util.List + * @author JiaChaoYang + * @date 2024/3/17 0:37 + */ + default List executeSave(List documentList, MongoCollection collection) { + return documentList; + } + + /** + * 删除拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:18 + */ + default Bson executeRemove(Bson filter, MongoCollection collection) { + return filter; + } + + /** + * 修改拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:18 + */ + default MutablePair executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { + return new MutablePair<>(queryBasic, updateBasic); + } + + /** + * 查询拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:18 + */ + default QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection) { + return new QueryParam(queryBasic, projectionList, sortCond); + } + + /** + * 管道拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:18 + */ + default List executeAggregate(List aggregateConditionList, MongoCollection collection) { + return aggregateConditionList; + } + + /** + * 统计拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:18 + */ + default MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions, MongoCollection collection) { + return new MutablePair<>(queryBasic, countOptions); + } + + /** + * 批量操作拦截方法 + * + * @author JiaChaoYang + * @date 2024/3/19 19:19 + */ + default List> executeBulkWrite(List> writeModelList, MongoCollection collection) { + return writeModelList; + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java index 6788ad8..1e99b55 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java @@ -5,11 +5,14 @@ import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conditions.query.QueryWrapper; +import com.anwen.mongo.config.Configuration; import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.toolkit.ChainWrappers; import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; import org.bson.BsonDocument; import org.bson.BsonString; +import org.bson.Document; import org.bson.conversions.Bson; import java.util.List; @@ -114,4 +117,18 @@ public interface LogicDeleteHandler { } + static Class getBeanClass(MongoCollection collection) { + if (Objects.isNull(collection)) { + return null; + } + Class clazz = ClassLogicDeleteCache.fullNameMap.get(collection.getNamespace().getFullName()); + if (Objects.nonNull(clazz)) { + if (!ClassLogicDeleteCache.logicDeleteResultHashMap.containsKey(clazz)) { + Configuration.builder().setLogicFiled(ClassLogicDeleteCache.logicProperty, clazz); + } + } + return clazz; + + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java similarity index 64% rename from mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java index c9c8e0c..c18b21b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/CollectionLogiceInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java @@ -1,10 +1,11 @@ -package com.anwen.mongo.logic; +package com.anwen.mongo.logic.interceptor; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.model.QueryParam; import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.UpdateManyModel; import com.mongodb.client.model.WriteModel; @@ -24,22 +25,22 @@ import java.util.stream.Collectors; public class CollectionLogiceInterceptor implements Interceptor { @Override - public Bson executeRemove(Bson filter) { + public Bson executeRemove(Bson filter, MongoCollection collection) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeRemove(filter); + return filter; } return LogicDeleteHandler.doBsonLogicDel(filter, clazz); } @Override - public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { + public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeUpdate(queryBasic, updateBasic); + return new MutablePair<>(queryBasic, updateBasic); } Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); return new MutablePair<>(query, updateBasic); @@ -47,23 +48,23 @@ public class CollectionLogiceInterceptor implements Interceptor { } @Override - public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond) { + public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeQuery(queryBasic, projectionList, sortCond); + return new QueryParam(queryBasic, projectionList, sortCond); } - BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); + Bson query = LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); return new QueryParam(query, projectionList, sortCond); } @Override - public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions) { + public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions, MongoCollection collection) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeCount(queryBasic, countOptions); + return new MutablePair<>(queryBasic, countOptions); } BasicDBObject query = (BasicDBObject) LogicDeleteHandler.doBsonLogicDel(queryBasic, clazz); return new MutablePair<>(query, countOptions); @@ -72,11 +73,11 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override @SuppressWarnings("all") - public List> executeBulkWrite(List> writeModelList) { + public List> executeBulkWrite(List> writeModelList, MongoCollection collection) { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { - return Interceptor.super.executeBulkWrite(writeModelList); + return writeModelList; } return writeModelList.stream().map(item -> { if (item instanceof UpdateManyModel) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java new file mode 100644 index 0000000..c393ca8 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java @@ -0,0 +1,43 @@ +package com.anwen.mongo.logic.interceptor; + +import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.config.Configuration; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.logic.LogicDeleteHandler; +import com.anwen.mongo.model.LogicDeleteResult; +import com.mongodb.client.MongoCollection; +import org.bson.Document; + +import java.util.List; +import java.util.Objects; + +/** + * 逻辑删除默认字段拦截器(初始化逻辑未删除字段、建议方案:使用数据库默认字段 > 其次是手动设置 > 配置框架提供拦截器 > 自定义拦截器)) + * + * @author loser + * @date 2024/4/30 + */ +public class LogicAutoFillInterceptor implements Interceptor { + + @Override + public List executeSave(List documentList, MongoCollection collection) { + + Class clazz = LogicDeleteHandler.getBeanClass(collection); + if (Objects.isNull(clazz)) { + return documentList; + } + if (!ClassLogicDeleteCache.logicDeleteResultHashMap.containsKey(clazz)) { + Configuration.builder().setLogicFiled(ClassLogicDeleteCache.logicProperty, clazz); + } + LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); + if (Objects.nonNull(result)) { + for (Document document : documentList) { + document.put(result.getColumn(), result.getLogicNotDeleteValue()); + } + } + return documentList; + + } + + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java similarity index 91% rename from mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java index 67bcb57..d881554 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicRemoveReplacer.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java @@ -1,8 +1,9 @@ -package com.anwen.mongo.logic; +package com.anwen.mongo.logic.replacer; import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.enums.SpecialConditionEnum; +import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.model.LogicDeleteResult; import com.anwen.mongo.replacer.Replacer; import com.anwen.mongo.support.BoolFunction; @@ -27,7 +28,7 @@ public class LogicRemoveReplacer implements Replacer { @Override public Object invoke(Object proxy, Object target, Method method, Object[] args) throws Throwable { - Class clazz = ClassLogicDeleteCache.getLogicCollection(); + Class clazz = LogicDeleteHandler.getBeanClass((MongoCollection) args[1]); if (Objects.isNull(clazz)) { return method.invoke(target, args); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 1c4c1b5..8f5ac6c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -1,7 +1,6 @@ package com.anwen.mongo.mapper; import com.anwen.mongo.annotation.ID; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; @@ -17,7 +16,6 @@ import com.anwen.mongo.enums.IdTypeEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.execute.ExecutorFactory; -import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.AggregateBasicDBObject; import com.anwen.mongo.model.BaseAggregate; @@ -130,20 +128,17 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long update(Bson queryBasic, Bson updateBasic, Class clazz) { - setCollectionClass(clazz); return factory.getExecute().executeUpdate(queryBasic, updateBasic, mongoPlusClient.getCollection(clazz)).getModifiedCount(); } @Override public Integer bulkWrite(List> writeModelList, Class clazz) { - setCollectionClass(clazz); BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); } @Override public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { - setCollectionClass(entity.getClass()); MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); return factory.getExecute().executeUpdate(updatePair.getLeft(), updatePair.getRight(), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } @@ -168,20 +163,17 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List list(Class clazz) { - setCollectionClass(clazz); return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override public List list(QueryChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class), clazz); } @Override public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); BasicDBObject optionsBasicDBObject = queryChainWrapper.getOptionsBasicDBObject(); @@ -197,21 +189,18 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public T one(QueryChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), null, queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override public T limitOne(QueryChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; @@ -226,7 +215,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable.skip((pageNum - 1) * pageSize).limit(pageSize), clazz); @@ -234,7 +222,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { - setCollectionClass(clazz); BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; @@ -249,28 +236,24 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public T getById(Serializable id, Class clazz) { - setCollectionClass(clazz); BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class).first(), clazz); } @Override public boolean isExist(Serializable id, Class clazz) { - setCollectionClass(clazz); BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); return factory.getExecute().executeCount(queryBasic, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override public boolean isExist(QueryChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); return factory.getExecute().executeCount(basicDBObject, null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override public List getByIds(Collection ids, Class clazz) { - setCollectionClass(clazz); BasicDBObject basicDBObject = checkIdType(ids); FindIterable iterable = factory.getExecute().executeQuery(basicDBObject, null, null, mongoPlusClient.getCollection(clazz), Document.class); return DocumentMapperConvert.mapDocumentList(iterable, clazz); @@ -278,7 +261,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Boolean update(UpdateChainWrapper updateChainWrapper, Class clazz) { - setCollectionClass(clazz); List compareConditionList = new ArrayList<>(); compareConditionList.addAll(updateChainWrapper.getCompareList()); compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); @@ -303,13 +285,11 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long remove(Bson filter, Class clazz) { - setCollectionClass(clazz); return factory.getExecute().executeRemove(filter, mongoPlusClient.getCollection(clazz)).getDeletedCount(); } @Override public long count(QueryChainWrapper queryChainWrapper, Class clazz) { - setCollectionClass(clazz); Execute execute = factory.getExecute(); MongoCollection collection = mongoPlusClient.getCollection(clazz); return Optional.ofNullable(queryChainWrapper.getCompareList()).map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare), null, collection)).orElseGet(() -> execute.estimatedDocumentCount(collection)); @@ -331,7 +311,6 @@ public class DefaultBaseMapperImpl implements BaseMapper { // 返回-1 表示不查询总条数 return -1L; } - setCollectionClass(clazz); //分页查询 不查询实际总条数 需要单独查询 是否有数据 //如果recentPageNum = 10 第1-6页 总页数=10 从第7页开始 需要往后 + 4 页 int limitParam = (pageNum < (recentPageNum / 2 + 1 + recentPageNum % 2) ? recentPageNum : (pageNum + (recentPageNum / 2 + recentPageNum % 2 - 1))) * pageSize; @@ -355,14 +334,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public List queryCommand(String command, Class clazz) { - setCollectionClass(clazz); FindIterable iterable = factory.getExecute().executeQuery(BasicDBObject.parse(command), null, null, mongoPlusClient.getCollection(clazz), Document.class); return lambdaOperate.getLambdaQueryResult(iterable, clazz); } @Override public List getByColumn(String column, Object value, Class clazz) { - setCollectionClass(clazz); Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(filter, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); } @@ -589,14 +566,4 @@ public class DefaultBaseMapperImpl implements BaseMapper { } } - /** - * 设置逻辑删除集合class - */ - private static void setCollectionClass(Class clazz) { - if (LogicDeleteHandler.close()) { - return; - } - ClassLogicDeleteCache.setLogicCollection(clazz); - } - } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java index de0d2ac..f1d63ad 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/LogicProperty.java @@ -13,6 +13,11 @@ public class LogicProperty { */ private Boolean open = false; + /** + * 是否开启基于拦截器的逻辑删除字段填充(建议方案:使用数据库默认字段 > 其次是手动设置 > 框架自带拦截器 > 自定义拦截器) + */ + private Boolean autoFill = false; + /** * 逻辑删除全局属性名 */ @@ -28,6 +33,14 @@ public class LogicProperty { */ private String logicNotDeleteValue = "0"; + public void setAutoFill(Boolean autoFill) { + this.autoFill = autoFill; + } + + public Boolean getAutoFill() { + return autoFill; + } + public Boolean getOpen() { return open; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index c930018..03b22c6 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -1,6 +1,5 @@ package com.anwen.mongo.proxy; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorProxyCache; import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.InterceptorCache; @@ -30,25 +29,21 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try { - // 参数替换拦截器 - MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(method.getName()); - if (Objects.nonNull(executor)) { - InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); - } + // 参数替换拦截器 + MethodExecutorStrategy executor = ExecutorProxyCache.EXECUTOR_MAP.get(method.getName()); + if (Objects.nonNull(executor)) { + InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); + } - // 方法替换执行器 执行首个命中执行器 - for (Replacer replacer : ExecutorReplacerCache.replacers) { - if (replacer.supplier().get(proxy, target, method, args)) { - return replacer.invoke(proxy, target, method, args); - } + // 方法替换执行器 执行首个命中执行器 + for (Replacer replacer : ExecutorReplacerCache.replacers) { + if (replacer.supplier().get(proxy, target, method, args)) { + return replacer.invoke(proxy, target, method, args); } - - return method.invoke(target, args); - } finally { - ClassLogicDeleteCache.clear(); } + return method.invoke(target, args); + } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java index a6c6e68..e50741c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java @@ -4,6 +4,8 @@ import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.model.AggregateBasicDBObject; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.client.MongoCollection; +import org.bson.Document; import java.util.List; @@ -17,6 +19,7 @@ public class AggregateExecutorStrategy implements MethodExecutorStrategy { @Override public void invoke(Interceptor interceptor, Object[] args) { args[0] = interceptor.executeAggregate((List) args[0]); + args[0] = interceptor.executeAggregate((List) args[0], (MongoCollection) args[1]); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java index e6d5521..e132a5d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java @@ -3,6 +3,7 @@ package com.anwen.mongo.strategy.executor.impl; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.client.MongoCollection; import com.mongodb.client.model.WriteModel; import org.bson.Document; @@ -18,6 +19,7 @@ public class BulkWriteExecutorStrategy implements MethodExecutorStrategy { @Override public void invoke(Interceptor interceptor, Object[] args) { args[0] = interceptor.executeBulkWrite((List>) args[0]); + args[0] = interceptor.executeBulkWrite((List>) args[0], (MongoCollection) args[1]); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java index 50deabd..49b1b3c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java @@ -5,7 +5,9 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; import com.mongodb.client.model.CountOptions; +import org.bson.Document; public class CountExecutorStrategy implements MethodExecutorStrategy { @@ -19,6 +21,9 @@ public class CountExecutorStrategy implements MethodExecutorStrategy { MutablePair basicDBObjectCountOptionsMutablePair = interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); args[0] = basicDBObjectCountOptionsMutablePair.getLeft(); args[1] = basicDBObjectCountOptionsMutablePair.getRight(); + basicDBObjectCountOptionsMutablePair = interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1], (MongoCollection) args[2]); + args[0] = basicDBObjectCountOptionsMutablePair.getLeft(); + args[1] = basicDBObjectCountOptionsMutablePair.getRight(); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java index 4325f86..52de8ba 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java @@ -5,6 +5,8 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.model.QueryParam; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; import com.mongodb.BasicDBObject; +import com.mongodb.client.MongoCollection; +import org.bson.Document; import org.bson.conversions.Bson; public class QueryExecutorStrategy implements MethodExecutorStrategy { @@ -20,6 +22,10 @@ public class QueryExecutorStrategy implements MethodExecutorStrategy { args[0] = queryParam.getQuery(); args[1] = queryParam.getProjection(); args[2] = queryParam.getSort(); + queryParam = interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2], (MongoCollection) args[3]); + args[0] = queryParam.getQuery(); + args[1] = queryParam.getProjection(); + args[2] = queryParam.getSort(); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java index 8c33ee1..dcf5556 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java @@ -3,6 +3,8 @@ package com.anwen.mongo.strategy.executor.impl; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.client.MongoCollection; +import org.bson.Document; import org.bson.conversions.Bson; public class RemoveExecutorStrategy implements MethodExecutorStrategy { @@ -15,6 +17,7 @@ public class RemoveExecutorStrategy implements MethodExecutorStrategy { @Override public void invoke(Interceptor interceptor, Object[] args) { args[0] = interceptor.executeRemove((Bson) args[0]); + args[0] = interceptor.executeRemove((Bson) args[0], (MongoCollection) args[1]); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java index da838c8..06808b0 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java @@ -3,6 +3,7 @@ package com.anwen.mongo.strategy.executor.impl; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.List; @@ -17,6 +18,7 @@ public class SaveExecutorStrategy implements MethodExecutorStrategy { @Override public void invoke(Interceptor interceptor, Object[] args) { args[0] = interceptor.executeSave((List) args[0]); + args[0] = interceptor.executeSave((List) args[0], (MongoCollection) args[1]); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java index 1166437..859a0a9 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java @@ -4,6 +4,8 @@ import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.strategy.executor.MethodExecutorStrategy; +import com.mongodb.client.MongoCollection; +import org.bson.Document; import org.bson.conversions.Bson; public class UpdateExecutorStrategy implements MethodExecutorStrategy { @@ -18,6 +20,9 @@ public class UpdateExecutorStrategy implements MethodExecutorStrategy { MutablePair bsonBsonMutablePair = interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); args[0] = bsonBsonMutablePair.getLeft(); args[1] = bsonBsonMutablePair.getRight(); + bsonBsonMutablePair = interceptor.executeUpdate((Bson) args[0], (Bson) args[1], (MongoCollection) args[2]); + args[0] = bsonBsonMutablePair.getLeft(); + args[1] = bsonBsonMutablePair.getRight(); } } -- Gitee From 86b5d151a79b1309145e35cef317ab8978794472 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 20:21:10 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=88=B0=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/mapper/DefaultBaseMapperImpl.java | 274 ++++++++---------- 1 file changed, 127 insertions(+), 147 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java index 8f5ac6c..abd5d18 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -17,35 +17,15 @@ import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.manager.MongoPlusClient; -import com.anwen.mongo.model.AggregateBasicDBObject; -import com.anwen.mongo.model.BaseAggregate; -import com.anwen.mongo.model.BaseLambdaQueryResult; -import com.anwen.mongo.model.MutablePair; -import com.anwen.mongo.model.PageParam; -import com.anwen.mongo.model.PageResult; +import com.anwen.mongo.model.*; import com.anwen.mongo.strategy.convert.ConversionService; -import com.anwen.mongo.toolkit.ClassTypeUtil; -import com.anwen.mongo.toolkit.CollUtil; -import com.anwen.mongo.toolkit.DocumentUtil; -import com.anwen.mongo.toolkit.ExecuteUtil; -import com.anwen.mongo.toolkit.Generate; -import com.anwen.mongo.toolkit.LambdaOperate; -import com.anwen.mongo.toolkit.ReflectionUtils; +import com.anwen.mongo.toolkit.*; import com.mongodb.BasicDBObject; import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.Collation; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateIndexOptions; -import com.mongodb.client.model.DropIndexOptions; -import com.mongodb.client.model.Filters; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.IndexModel; -import com.mongodb.client.model.IndexOptions; -import com.mongodb.client.model.ReturnDocument; -import com.mongodb.client.model.WriteModel; +import com.mongodb.client.model.*; import com.mongodb.client.result.InsertManyResult; import org.bson.Document; import org.bson.conversions.Bson; @@ -56,16 +36,7 @@ import org.slf4j.LoggerFactory; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -101,9 +72,9 @@ public class DefaultBaseMapperImpl implements BaseMapper { } @Override - public boolean save(T entity) { + public boolean save(T entity){ try { - Document document = processIdField(entity, false); + Document document = processIdField(entity,false); InsertManyResult insertManyResult = factory.getExecute().executeSave(Collections.singletonList(document), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))); setBackIdValue(document, entity); return insertManyResult.wasAcknowledged(); @@ -128,139 +99,143 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Long update(Bson queryBasic, Bson updateBasic, Class clazz) { - return factory.getExecute().executeUpdate(queryBasic, updateBasic, mongoPlusClient.getCollection(clazz)).getModifiedCount(); + return factory.getExecute().executeUpdate( + queryBasic, + updateBasic, + mongoPlusClient.getCollection(clazz) + ).getModifiedCount(); } @Override public Integer bulkWrite(List> writeModelList, Class clazz) { - BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(clazz)); return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); } @Override - public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { + public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return factory.getExecute().executeUpdate(updatePair.getLeft(), updatePair.getRight(), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; + return factory.getExecute().executeUpdate(updatePair.getLeft(),updatePair.getRight(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } private Boolean buildRemove(Serializable id, MongoCollection collection) { Bson filterId = Filters.eq(SqlOperationConstant._ID, ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id); - return factory.getExecute().executeRemove(filterId, collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(filterId,collection).getDeletedCount() >= 1; } - public Boolean executeRemoveByColumn(String column, Object value, MongoCollection collection) { + public Boolean executeRemoveByColumn(String column,Object value,MongoCollection collection){ Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return factory.getExecute().executeRemove(filter, collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(filter,collection).getDeletedCount() >= 1; } - private Boolean executeRemoveBatchByIds(Collection idList, MongoCollection collection) { + private Boolean executeRemoveBatchByIds(Collection idList,MongoCollection collection){ List convertedIds = idList.stream() .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) .collect(Collectors.toList()); Bson objectIdBson = Filters.in(SqlOperationConstant._ID, convertedIds); - return factory.getExecute().executeRemove(objectIdBson, collection).getDeletedCount() >= 1; + return factory.getExecute().executeRemove(objectIdBson,collection).getDeletedCount() >= 1; } @Override public List list(Class clazz) { - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(null,null,null,mongoPlusClient.getCollection(clazz),Document.class),clazz); } @Override - public List list(QueryChainWrapper queryChainWrapper, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class), clazz); + public List list(QueryChainWrapper queryChainWrapper, Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); } @Override - public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz) { + public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz){ List aggregateList = queryChainWrapper.getBaseAggregateList(); List basicDBObjectList = queryChainWrapper.getBasicDBObjectList(); BasicDBObject optionsBasicDBObject = queryChainWrapper.getOptionsBasicDBObject(); List aggregateConditionList = new ArrayList() {{ - aggregateList.forEach(aggregate -> add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(), aggregate.getOrder()))); + aggregateList.forEach(aggregate -> add(new AggregateBasicDBObject("$" + aggregate.getType(), aggregate.getPipelineStrategy().buildAggregate(),aggregate.getOrder()))); addAll(basicDBObjectList); }}; aggregateConditionList.sort(Comparator.comparingInt(AggregateBasicDBObject::getOrder)); - AggregateIterable aggregateIterable = factory.getExecute().executeAggregate(aggregateConditionList, mongoPlusClient.getCollection(clazz), Document.class); - aggregateOptions(aggregateIterable, optionsBasicDBObject); - return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(), clazz); + AggregateIterable aggregateIterable = factory.getExecute().executeAggregate(aggregateConditionList, mongoPlusClient.getCollection(clazz),Document.class); + aggregateOptions(aggregateIterable,optionsBasicDBObject); + return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(),clazz); } @Override - public T one(QueryChainWrapper queryChainWrapper, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), null, queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); + public T one(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class).limit(1),clazz); } @Override - public T limitOne(QueryChainWrapper queryChainWrapper, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); - return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class).limit(1), clazz); + public T limitOne(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + return lambdaOperate.getLambdaQueryResultOne(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class).limit(1),clazz); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ count = factory.getExecute().estimatedDocumentCount(collection); - } else { - count = count(queryChainWrapper, clazz); + }else { + count = count(queryChainWrapper,clazz); } - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection, Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable, count, new PageParam(pageNum, pageSize), clazz); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection,Document.class); + return lambdaOperate.getLambdaQueryResultPage(iterable,count,new PageParam(pageNum,pageSize),clazz); } @Override public List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz), Document.class); + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz),Document.class); return DocumentMapperConvert.mapDocumentList(iterable.skip((pageNum - 1) * pageSize).limit(pageSize), clazz); } @Override - public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(), queryChainWrapper.getOrderList(), queryChainWrapper.getProjectionList(), queryChainWrapper.getBasicDBObjectList()); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); MongoCollection collection = mongoPlusClient.getCollection(clazz); long count; - if (CollUtil.isEmpty(queryChainWrapper.getCompareList())) { + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ count = factory.getExecute().estimatedDocumentCount(collection); - } else { - count = recentPageCount(queryChainWrapper.getCompareList(), clazz, pageNum, pageSize, recentPageNum); + }else { + count = recentPageCount(queryChainWrapper.getCompareList(),clazz, pageNum, pageSize, recentPageNum); } - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection, Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable, count, new PageParam(pageNum, pageSize), clazz); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collection,Document.class); + return lambdaOperate.getLambdaQueryResultPage(iterable, count,new PageParam(pageNum,pageSize),clazz); } @Override - public T getById(Serializable id, Class clazz) { + public T getById(Serializable id,Class clazz) { BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(queryBasic, null, null, mongoPlusClient.getCollection(clazz), Document.class).first(), clazz); + return DocumentMapperConvert.mapDocument(factory.getExecute().executeQuery(queryBasic,null,null,mongoPlusClient.getCollection(clazz),Document.class).first(),clazz); } @Override - public boolean isExist(Serializable id, Class clazz) { + public boolean isExist(Serializable id,Class clazz){ BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return factory.getExecute().executeCount(queryBasic, null, mongoPlusClient.getCollection(clazz)) >= 1; + return factory.getExecute().executeCount(queryBasic,null, mongoPlusClient.getCollection(clazz)) >= 1; } @Override - public boolean isExist(QueryChainWrapper queryChainWrapper, Class clazz) { + public boolean isExist(QueryChainWrapper queryChainWrapper,Class clazz){ BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - return factory.getExecute().executeCount(basicDBObject, null, mongoPlusClient.getCollection(clazz)) >= 1; + return factory.getExecute().executeCount(basicDBObject,null,mongoPlusClient.getCollection(clazz)) >= 1; } @Override - public List getByIds(Collection ids, Class clazz) { + public List getByIds(Collection ids,Class clazz) { BasicDBObject basicDBObject = checkIdType(ids); - FindIterable iterable = factory.getExecute().executeQuery(basicDBObject, null, null, mongoPlusClient.getCollection(clazz), Document.class); + FindIterable iterable = factory.getExecute().executeQuery(basicDBObject,null,null, mongoPlusClient.getCollection(clazz),Document.class); return DocumentMapperConvert.mapDocumentList(iterable, clazz); } @Override - public Boolean update(UpdateChainWrapper updateChainWrapper, Class clazz) { + public Boolean update(UpdateChainWrapper updateChainWrapper,Class clazz) { List compareConditionList = new ArrayList<>(); compareConditionList.addAll(updateChainWrapper.getCompareList()); compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); @@ -268,45 +243,46 @@ public class DefaultBaseMapperImpl implements BaseMapper { List pushConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.PUSH.getSubCondition())).collect(Collectors.toList()); List setConditionList = compareConditionList.stream().filter(compareCondition -> Objects.equals(compareCondition.getCondition(), SpecialConditionEnum.SET.getSubCondition())).collect(Collectors.toList()); BasicDBObject basicDBObject = new BasicDBObject() {{ - if (CollUtil.isNotEmpty(setConditionList)) { + if (CollUtil.isNotEmpty(setConditionList)){ append(SpecialConditionEnum.SET.getCondition(), BuildCondition.buildUpdateValue(setConditionList)); } - if (CollUtil.isNotEmpty(pushConditionList)) { + if (CollUtil.isNotEmpty(pushConditionList)){ append(SpecialConditionEnum.PUSH.getCondition(), BuildCondition.buildPushUpdateValue(pushConditionList)); } }}; - return factory.getExecute().executeUpdate(queryBasic, DocumentUtil.handleBasicDBObject(basicDBObject), mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; + return factory.getExecute().executeUpdate(queryBasic,DocumentUtil.handleBasicDBObject(basicDBObject),mongoPlusClient.getCollection(clazz)).getModifiedCount() >= 1; } @Override public Boolean remove(UpdateChainWrapper updateChainWrapper, Class clazz) { - return remove(BuildCondition.buildQueryCondition(updateChainWrapper.getCompareList()), clazz) >= 1; + return remove(BuildCondition.buildQueryCondition(updateChainWrapper.getCompareList()),clazz) >= 1; } @Override public Long remove(Bson filter, Class clazz) { - return factory.getExecute().executeRemove(filter, mongoPlusClient.getCollection(clazz)).getDeletedCount(); + return factory.getExecute().executeRemove(filter,mongoPlusClient.getCollection(clazz)).getDeletedCount(); } @Override - public long count(QueryChainWrapper queryChainWrapper, Class clazz) { + public long count(QueryChainWrapper queryChainWrapper,Class clazz){ Execute execute = factory.getExecute(); MongoCollection collection = mongoPlusClient.getCollection(clazz); - return Optional.ofNullable(queryChainWrapper.getCompareList()).map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare), null, collection)).orElseGet(() -> execute.estimatedDocumentCount(collection)); + return Optional.ofNullable(queryChainWrapper.getCompareList()) + .map(compare -> execute.executeCount(BuildCondition.buildQueryCondition(compare),null,collection)) + .orElseGet(() -> execute.estimatedDocumentCount(collection)); } /** * 分页查询 查询总条数 - * * @param compareConditionList 条件集合 - * @param clazz result class - * @param pageNum 当前页 - * @param pageSize 每页显示行数 - * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @param clazz result class + * @param pageNum 当前页 + * @param pageSize 每页显示行数 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} * @return long */ @Override - public long recentPageCount(List compareConditionList, Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum) { + public long recentPageCount(List compareConditionList,Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum){ if (recentPageNum == null || !(recentPageNum <= 50 && recentPageNum >= 5)) { // 返回-1 表示不查询总条数 return -1L; @@ -316,114 +292,116 @@ public class DefaultBaseMapperImpl implements BaseMapper { int limitParam = (pageNum < (recentPageNum / 2 + 1 + recentPageNum % 2) ? recentPageNum : (pageNum + (recentPageNum / 2 + recentPageNum % 2 - 1))) * pageSize; CountOptions countOptions = new CountOptions(); countOptions.skip(limitParam).limit(1); - long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList), countOptions, mongoPlusClient.getCollection(clazz)); + long isExists = factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, mongoPlusClient.getCollection(clazz)); //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 if (isExists == 0) { // 查询真实总条数 CountOptions countOptionsReal = new CountOptions(); countOptionsReal.limit(limitParam); - return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList), countOptions, mongoPlusClient.getCollection(clazz)); + return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, mongoPlusClient.getCollection(clazz)); } return limitParam; } @Override - public long count(Class clazz) { - return count(null, clazz); + public long count(Class clazz){ + return factory.getExecute().estimatedDocumentCount(mongoPlusClient.getCollection(clazz)); } @Override - public List queryCommand(String command, Class clazz) { - FindIterable iterable = factory.getExecute().executeQuery(BasicDBObject.parse(command), null, null, mongoPlusClient.getCollection(clazz), Document.class); - return lambdaOperate.getLambdaQueryResult(iterable, clazz); + public List queryCommand(String command,Class clazz){ + FindIterable iterable = factory.getExecute().executeQuery(BasicDBObject.parse(command),null,null, mongoPlusClient.getCollection(clazz),Document.class); + return lambdaOperate.getLambdaQueryResult(iterable,clazz); } @Override - public List getByColumn(String column, Object value, Class clazz) { + public List getByColumn(String column,Object value,Class clazz){ Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(filter, null, null, mongoPlusClient.getCollection(clazz), Document.class), clazz); + return DocumentMapperConvert.mapDocumentList(factory.getExecute().executeQuery(filter,null,null,mongoPlusClient.getCollection(clazz),Document.class),clazz); } @Override - public String createIndex(Bson bson, Class clazz) { - return factory.getExecute().doCreateIndex(bson, mongoPlusClient.getCollection(clazz)); + public String createIndex(Bson bson,Class clazz){ + return factory.getExecute().doCreateIndex(bson,mongoPlusClient.getCollection(clazz)); } @Override - public String createIndex(Bson bson, IndexOptions indexOptions, Class clazz) { - return factory.getExecute().doCreateIndex(bson, indexOptions, mongoPlusClient.getCollection(clazz)); + public String createIndex(Bson bson, IndexOptions indexOptions, Class clazz){ + return factory.getExecute().doCreateIndex(bson,indexOptions,mongoPlusClient.getCollection(clazz)); } @Override - public List createIndexes(List indexes, Class clazz) { - return factory.getExecute().doCreateIndexes(indexes, mongoPlusClient.getCollection(clazz)); + public List createIndexes(List indexes,Class clazz){ + return factory.getExecute().doCreateIndexes(indexes,mongoPlusClient.getCollection(clazz)); } @Override - public List createIndexes(List indexes, CreateIndexOptions createIndexOptions, Class clazz) { - return factory.getExecute().doCreateIndexes(indexes, createIndexOptions, mongoPlusClient.getCollection(clazz)); + public List createIndexes(List indexes, CreateIndexOptions createIndexOptions,Class clazz){ + return factory.getExecute().doCreateIndexes(indexes,createIndexOptions,mongoPlusClient.getCollection(clazz)); } @Override - public List listIndexes(Class clazz) { + public List listIndexes(Class clazz){ return factory.getExecute().doListIndexes(mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(String indexName, Class clazz) { - factory.getExecute().doDropIndex(indexName, mongoPlusClient.getCollection(clazz)); + public void dropIndex(String indexName,Class clazz){ + factory.getExecute().doDropIndex(indexName,mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(String indexName, DropIndexOptions dropIndexOptions, Class clazz) { - factory.getExecute().doDropIndex(indexName, dropIndexOptions, mongoPlusClient.getCollection(clazz)); + public void dropIndex(String indexName,DropIndexOptions dropIndexOptions,Class clazz){ + factory.getExecute().doDropIndex(indexName,dropIndexOptions,mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(Bson keys, Class clazz) { - factory.getExecute().doDropIndex(keys, mongoPlusClient.getCollection(clazz)); + public void dropIndex(Bson keys,Class clazz){ + factory.getExecute().doDropIndex(keys,mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndex(Bson keys, DropIndexOptions dropIndexOptions, Class clazz) { - factory.getExecute().doDropIndex(keys, dropIndexOptions, mongoPlusClient.getCollection(clazz)); + public void dropIndex(Bson keys,DropIndexOptions dropIndexOptions,Class clazz){ + factory.getExecute().doDropIndex(keys,dropIndexOptions,mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndexes(Class clazz) { + public void dropIndexes(Class clazz){ factory.getExecute().doDropIndexes(mongoPlusClient.getCollection(clazz)); } @Override - public void dropIndexes(DropIndexOptions dropIndexOptions, Class clazz) { - factory.getExecute().doDropIndexes(dropIndexOptions, mongoPlusClient.getCollection(clazz)); + public void dropIndexes(DropIndexOptions dropIndexOptions,Class clazz){ + factory.getExecute().doDropIndexes(dropIndexOptions,mongoPlusClient.getCollection(clazz)); } - protected MutablePair getUpdate(T entity) { - Document document = DocumentUtil.checkUpdateField(entity, false); + protected MutablePair getUpdate(T entity){ + Document document = DocumentUtil.checkUpdateField(entity,false); BasicDBObject filter = ExecuteUtil.getFilter(document); BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(filter, update); + return new MutablePair<>(filter,update); } protected BasicDBObject checkIdType(Collection ids) { - List convertedIds = ids.stream().map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id).collect(Collectors.toList()); + List convertedIds = ids.stream() + .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) + .collect(Collectors.toList()); return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } - protected MutablePair getUpdateCondition(List compareConditionList, T entity) { + protected MutablePair getUpdateCondition(List compareConditionList, T entity){ BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); - Document document = DocumentUtil.checkUpdateField(entity, false); + Document document = DocumentUtil.checkUpdateField(entity,false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new MutablePair<>(queryBasic, updateField); + return new MutablePair<>(queryBasic,updateField); } @Override - public Document processIdField(T entity, Boolean skip) { + public Document processIdField(T entity,Boolean skip){ Document tableFieldMap = DocumentUtil.checkTableField(entity); fillId(entity, tableFieldMap); - if (HandlerCache.documentHandler != null && !skip) { + if (HandlerCache.documentHandler != null && !skip){ //经过一下Document处理器 tableFieldMap = HandlerCache.documentHandler.insertInvoke(Collections.singletonList(tableFieldMap)).get(0); } @@ -434,10 +412,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { String collectionName = collectionNameConvert.convert(clazz); // 每个Collection单独加锁 synchronized (collectionName.intern()) { - MongoCollection collection = mongoPlusClient.getCollection(clazz, "counters"); + MongoCollection collection = mongoPlusClient.getCollection(clazz,"counters"); Document query = new Document(SqlOperationConstant._ID, collectionName); Document update = new Document("$inc", new Document(SqlOperationConstant.AUTO_NUM, 1)); - Document document = Optional.ofNullable(MongoTransactionContext.getClientSessionContext()).map(session -> collection.findOneAndUpdate(session, query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))).orElseGet(() -> collection.findOneAndUpdate(query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))); + Document document = Optional.ofNullable(MongoTransactionContext.getClientSessionContext()) + .map(session -> collection.findOneAndUpdate(session, query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))) + .orElseGet(() -> collection.findOneAndUpdate(query, update, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER))); int finalNum = 1; if (document == null) { Map map = new HashMap<>(); @@ -471,7 +451,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { if (annotation.type() == IdTypeEnum.AUTO) { _idValue = getAutoId(ClassTypeUtil.getClass(entity)); } else { - if (annotation.type() == IdTypeEnum.OBJECT_ID) { + if (annotation.type() == IdTypeEnum.OBJECT_ID){ return; } _idValue = Generate.generateId(annotation.type()); @@ -480,12 +460,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { Object value = ConversionService.convertValue(idField, ClassTypeUtil.getClass(entity).getDeclaredConstructor().newInstance(), _idValue); document.put(SqlOperationConstant._ID, value); //为自行设置id,需要在这里判断一下重入,自行设置checkTableField方法会进行处理 - if (annotation.saveField()) { - document.put(idField.getName(), value); + if (annotation.saveField()){ + document.put(idField.getName(),value); } } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { - logger.error("Failed to convert to entity class's' _id 'field type when filling in'_id',error message: {}", e.getMessage(), e); + logger.error("Failed to convert to entity class's' _id 'field type when filling in'_id',error message: {}",e.getMessage(),e); throw new RuntimeException(e); } } @@ -504,7 +484,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { } try { //使用策略转换器回写id - ConversionService.setValue(idField, entity, idValue); + ConversionService.setValue(idField,entity,idValue); } catch (Exception e) { logger.error("set back id field value error, error message: {}", e.getMessage()); } @@ -518,12 +498,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { } } - protected List processIdFieldList(Collection entityList) { - List documentList = entityList.stream().map(document -> processIdField(document, true)).collect(Collectors.toList()); + protected List processIdFieldList(Collection entityList){ + List documentList = entityList.stream().map(document -> processIdField(document,true)).collect(Collectors.toList()); return Optional.ofNullable(HandlerCache.documentHandler).map(documentHandler -> documentHandler.insertInvoke(documentList)).orElse(documentList); } - protected void aggregateOptions(AggregateIterable aggregateIterable, BasicDBObject optionsBasicDBObject) { + protected void aggregateOptions(AggregateIterable aggregateIterable,BasicDBObject optionsBasicDBObject){ options(aggregateIterable, optionsBasicDBObject); } @@ -531,7 +511,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { Set keyedSet = optionsBasicDBObject.keySet(); for (String key : keyedSet) { AggregateOptionsEnum aggregateOptionsEnum = AggregateOptionsEnum.getByOptions(key); - switch (Objects.requireNonNull(aggregateOptionsEnum)) { + switch (Objects.requireNonNull(aggregateOptionsEnum)){ case ALLOW_DISK_USE: aggregateIterable.allowDiskUse(optionsBasicDBObject.getBoolean(key)); break; @@ -545,7 +525,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { aggregateIterable.maxTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); break; case MAX_AWAIT_TIME_MS: - aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); + aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key),TimeUnit.MILLISECONDS); break; case BYPASS_DOCUMENT_VALIDATION: aggregateIterable.bypassDocumentValidation(optionsBasicDBObject.getBoolean(key)); -- Gitee From 39a5bb80a4502fb3a33f4686d6b47ef0478471ad Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Tue, 30 Apr 2024 20:44:55 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=B1=BB=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=8F=8A=E8=A1=A5=E5=85=85=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...e.java => CollectionLogicDeleteCache.java} | 16 ++++++++++++- .../com/anwen/mongo/config/Configuration.java | 8 +++---- .../anwen/mongo/conn/CollectionManager.java | 4 ++-- .../anwen/mongo/logic/LogicDeleteHandler.java | 24 +++++++++++++------ .../interceptor/LogicAutoFillInterceptor.java | 5 ---- .../logic/replacer/LogicRemoveReplacer.java | 4 ++-- .../executor/MethodExecutorStrategy.java | 2 +- .../impl/AggregateExecutorStrategy.java | 6 +++++ .../impl/BulkWriteExecutorStrategy.java | 6 +++++ .../executor/impl/CountExecutorStrategy.java | 6 +++++ .../executor/impl/QueryExecutorStrategy.java | 6 +++++ .../executor/impl/RemoveExecutorStrategy.java | 7 ++++++ .../executor/impl/SaveExecutorStrategy.java | 6 +++++ .../executor/impl/UpdateExecutorStrategy.java | 6 +++++ 14 files changed, 84 insertions(+), 22 deletions(-) rename mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/{ClassLogicDeleteCache.java => CollectionLogicDeleteCache.java} (59%) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java similarity index 59% rename from mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java index b35f0e8..ff6727d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ClassLogicDeleteCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java @@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; * @author loser * @date 2024/4/29 */ -public class ClassLogicDeleteCache { +public class CollectionLogicDeleteCache { /** * 是否开启逻辑删除功能 @@ -30,6 +30,20 @@ public class ClassLogicDeleteCache { */ public static final Map, LogicDeleteResult> logicDeleteResultHashMap = new HashMap<>(); + /** + * 存储 mongo 连接对象关联的 实体 {"mongo连接fullName":"mongo集合实体class"} + */ public static final Map> fullNameMap = new ConcurrentHashMap<>(); + /** + * mongo 连接对象关联的 实体(处理直接通过 BaseMapper 操作的 class) + * + * @param fullName mongo 连接 fullName + * @param clazz 实体 + */ + public static void mapperClassByCollection(String fullName, Class clazz) { + if (!fullNameMap.containsKey(fullName)) { + fullNameMap.put(fullName, clazz); + } + } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index df6f844..9570e57 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -2,7 +2,7 @@ package com.anwen.mongo.config; import com.anwen.mongo.annotation.collection.CollectionField; import com.anwen.mongo.annotation.collection.CollectionLogic; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.cache.global.ExecutorReplacerCache; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.cache.global.InterceptorCache; @@ -389,8 +389,8 @@ public class Configuration { throw new InitMongoLogicException("Config logic logicProperty not null"); } this.logicProperty = logicProperty; - ClassLogicDeleteCache.open = logicProperty.getOpen(); - ClassLogicDeleteCache.logicProperty = logicProperty; + CollectionLogicDeleteCache.open = logicProperty.getOpen(); + CollectionLogicDeleteCache.logicProperty = logicProperty; if (logicProperty.getOpen()) { InterceptorCache.interceptors.add(new CollectionLogiceInterceptor()); if (logicProperty.getAutoFill()) { @@ -427,7 +427,7 @@ public class Configuration { if (Objects.isNull(collectionClasses) || Objects.isNull(logicProperty) || !logicProperty.getOpen()) { return this; } - Map, LogicDeleteResult> logicDeleteResultHashMap = ClassLogicDeleteCache.logicDeleteResultHashMap; + Map, LogicDeleteResult> logicDeleteResultHashMap = CollectionLogicDeleteCache.logicDeleteResultHashMap; for (Class clazz : collectionClasses) { if (logicDeleteResultHashMap.containsKey(clazz)) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java index 5c7e14b..3c242da 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conn/CollectionManager.java @@ -1,6 +1,6 @@ package com.anwen.mongo.conn; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.factory.MongoClientFactory; import com.anwen.mongo.toolkit.ClassTypeUtil; @@ -59,7 +59,7 @@ public class CollectionManager { public MongoCollection getCollection(Class clazz) { String collectionName = this.collectionNameConvert.convert(clazz); MongoCollection collection = getCollection(collectionName); - ClassLogicDeleteCache.fullNameMap.put(collection.getNamespace().getFullName(), clazz); + CollectionLogicDeleteCache.mapperClassByCollection(collection.getNamespace().getFullName(), clazz); return collection; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java index 1e99b55..5b01ee2 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/LogicDeleteHandler.java @@ -1,6 +1,6 @@ package com.anwen.mongo.logic; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.query.QueryChainWrapper; @@ -31,11 +31,14 @@ public interface LogicDeleteHandler { * 是否关闭逻辑删除功能 */ static boolean close() { - return !ClassLogicDeleteCache.open; + return !CollectionLogicDeleteCache.open; } + /** + * 获取 mongo 实体对象和逻辑删除字段的映射关系 + */ static Map, LogicDeleteResult> mapper() { - return ClassLogicDeleteCache.logicDeleteResultHashMap; + return CollectionLogicDeleteCache.logicDeleteResultHashMap; } /** @@ -102,7 +105,7 @@ public interface LogicDeleteHandler { } return queryChainWrapper.getCompareList(); } - LogicDeleteResult result = ClassLogicDeleteCache.logicDeleteResultHashMap.get(clazz); + LogicDeleteResult result = CollectionLogicDeleteCache.logicDeleteResultHashMap.get(clazz); if (Objects.isNull(result)) { if (Objects.isNull(queryChainWrapper)) { return null; @@ -117,14 +120,21 @@ public interface LogicDeleteHandler { } + /** + * 获取连接对象 关联的 mongo 实体 + * + * @param collection 连接对象 + * @return 关联实体 + */ static Class getBeanClass(MongoCollection collection) { + if (Objects.isNull(collection)) { return null; } - Class clazz = ClassLogicDeleteCache.fullNameMap.get(collection.getNamespace().getFullName()); + Class clazz = CollectionLogicDeleteCache.fullNameMap.get(collection.getNamespace().getFullName()); if (Objects.nonNull(clazz)) { - if (!ClassLogicDeleteCache.logicDeleteResultHashMap.containsKey(clazz)) { - Configuration.builder().setLogicFiled(ClassLogicDeleteCache.logicProperty, clazz); + if (!CollectionLogicDeleteCache.logicDeleteResultHashMap.containsKey(clazz)) { + Configuration.builder().setLogicFiled(CollectionLogicDeleteCache.logicProperty, clazz); } } return clazz; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java index c393ca8..06a70ab 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java @@ -1,7 +1,5 @@ package com.anwen.mongo.logic.interceptor; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; -import com.anwen.mongo.config.Configuration; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.model.LogicDeleteResult; @@ -26,9 +24,6 @@ public class LogicAutoFillInterceptor implements Interceptor { if (Objects.isNull(clazz)) { return documentList; } - if (!ClassLogicDeleteCache.logicDeleteResultHashMap.containsKey(clazz)) { - Configuration.builder().setLogicFiled(ClassLogicDeleteCache.logicProperty, clazz); - } LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); if (Objects.nonNull(result)) { for (Document document : documentList) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java index d881554..e6c9900 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java @@ -1,6 +1,6 @@ package com.anwen.mongo.logic.replacer; -import com.anwen.mongo.cache.global.ClassLogicDeleteCache; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.logic.LogicDeleteHandler; @@ -57,7 +57,7 @@ public class LogicRemoveReplacer implements Replacer { @Override public BoolFunction supplier() { - return (proxy, target, method, args) -> ClassLogicDeleteCache.open && method.getName().equals(ExecuteMethodEnum.REMOVE.getMethod()); + return (proxy, target, method, args) -> CollectionLogicDeleteCache.open && method.getName().equals(ExecuteMethodEnum.REMOVE.getMethod()); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/MethodExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/MethodExecutorStrategy.java index 001549c..3eefa43 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/MethodExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/MethodExecutorStrategy.java @@ -4,7 +4,7 @@ import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.interceptor.Interceptor; /** - * 解耦逻辑 + * 方法执行策略(解耦逻辑) * * @author loser * @date 2024/4/28 diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java index e50741c..4d354e7 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/AggregateExecutorStrategy.java @@ -9,6 +9,12 @@ import org.bson.Document; import java.util.List; +/** + * AGGREGATE 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class AggregateExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java index e132a5d..1b56f3f 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/BulkWriteExecutorStrategy.java @@ -9,6 +9,12 @@ import org.bson.Document; import java.util.List; +/** + * BULK_WRITE 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class BulkWriteExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java index 49b1b3c..2df6464 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/CountExecutorStrategy.java @@ -9,6 +9,12 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.model.CountOptions; import org.bson.Document; +/** + * COUNT 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class CountExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java index 52de8ba..cef0e15 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/QueryExecutorStrategy.java @@ -9,6 +9,12 @@ import com.mongodb.client.MongoCollection; import org.bson.Document; import org.bson.conversions.Bson; +/** + * QUERY 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class QueryExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java index dcf5556..d2e9781 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/RemoveExecutorStrategy.java @@ -7,6 +7,13 @@ import com.mongodb.client.MongoCollection; import org.bson.Document; import org.bson.conversions.Bson; + +/** + * REMOVE 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class RemoveExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java index 06808b0..2f731eb 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/SaveExecutorStrategy.java @@ -8,6 +8,12 @@ import org.bson.Document; import java.util.List; +/** + * SAVE 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class SaveExecutorStrategy implements MethodExecutorStrategy { @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java index 859a0a9..e5c1b32 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/executor/impl/UpdateExecutorStrategy.java @@ -8,6 +8,12 @@ import com.mongodb.client.MongoCollection; import org.bson.Document; import org.bson.conversions.Bson; +/** + * UPDATE 策略执行器 + * + * @author loser + * @date 2024/4/30 + */ public class UpdateExecutorStrategy implements MethodExecutorStrategy { @Override -- Gitee From e68c2f208b56b7dcbca421687bb63e68801bf66d Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Mon, 6 May 2024 11:22:17 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E5=A1=AB=E5=85=85=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=BF=87=E6=BB=A4=E5=B7=B2=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/logic/interceptor/LogicAutoFillInterceptor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java index 06a70ab..1aa4ce3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java @@ -27,7 +27,9 @@ public class LogicAutoFillInterceptor implements Interceptor { LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz); if (Objects.nonNull(result)) { for (Document document : documentList) { - document.put(result.getColumn(), result.getLogicNotDeleteValue()); + if (!document.containsKey(result.getColumn())) { + document.put(result.getColumn(), result.getLogicNotDeleteValue()); + } } } return documentList; -- Gitee