From b1ec4c5cfbc025882089c8f03d963e8bc31b9df4 Mon Sep 17 00:00:00 2001 From: chengzhihao Date: Thu, 25 Jan 2024 15:52:45 +0800 Subject: [PATCH 01/20] =?UTF-8?q?2024-01-25=20=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E6=9C=80=E8=BF=91?= =?UTF-8?q?n=E9=A1=B5=E6=95=B0=E6=8D=AE=E7=9A=84=E5=8A=9F=E8=83=BD=20?= =?UTF-8?q?=E4=B8=8D=E6=9F=A5=E8=AF=A2=E6=80=BB=E6=9D=A1=E6=95=B0=20?= =?UTF-8?q?=E5=8A=A0=E5=BF=AB=E6=9F=A5=E8=AF=A2=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/conditions/query/ChainQuery.java | 21 +++++++++++ .../query/LambdaQueryChainWrapper.java | 10 +++++ .../anwen/mongo/execute/AbstractExecute.java | 37 +++++++++++++++++++ .../java/com/anwen/mongo/execute/Execute.java | 7 ++-- .../execute/instance/DefaultExecute.java | 10 +++-- .../execute/instance/SessionExecute.java | 10 +++-- .../com/anwen/mongo/service/IService.java | 25 +++++++++++++ .../anwen/mongo/service/impl/ServiceImpl.java | 20 ++++++++++ .../anwen/mongo/toolkit/LambdaOperate.java | 6 ++- 9 files changed, 133 insertions(+), 13 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java index 13b00660..5b70a78b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java @@ -56,5 +56,26 @@ public interface ChainQuery { */ PageResult page(Integer pageNum, Integer pageSize); + /** + * 分页 + * @param pageParam 分页参数对象 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @return {@link PageResult} + * @author JiaChaoYang + * @date 2023/7/20 23:17 + */ + PageResult page(PageParam pageParam, Integer recentPageNum); + + /** + * 分页 + * @param pageNum 当前页 + * @param pageSize 每页显示行数 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @return {@link PageResult} + * @author JiaChaoYang + * @date 2023/7/20 23:17 + */ + PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum); + long count(); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index 47391cae..e31ab5e3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -50,6 +50,16 @@ public class LambdaQueryChainWrapper extends QueryChainWrapper page(PageParam pageParam, Integer recentPageNum) { + return factory.getExecute(database).page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum, clazz); + } + + @Override + public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { + return factory.getExecute(database).page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageNum, pageSize, recentPageNum, clazz); + } + @Override public long count() { return factory.getExecute(database).count(getCompareList(),clazz); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index db349113..3fd192b1 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -14,6 +14,7 @@ import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.domain.MongoQueryException; import com.anwen.mongo.enums.AggregateOptionsEnum; import com.anwen.mongo.enums.IdTypeEnum; +import com.anwen.mongo.enums.QueryOperatorEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.model.*; import com.anwen.mongo.strategy.convert.ConversionService; @@ -240,6 +241,12 @@ public abstract class AbstractExecute implements Execute { return lambdaOperate.getLambdaQueryResultPage(iterable,count(compareConditionList,clazz),new PageParam(pageNum,pageSize),clazz); } + public PageResult page(List compareConditionList, List orderList,List projectionList,List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + FindIterable iterable = doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz)); + return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(compareConditionList,clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),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(doGetById(queryBasic,collectionManager.getCollection(clazz)).first(),clazz); @@ -279,6 +286,36 @@ public abstract class AbstractExecute implements Execute { return executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList),collectionManager.getCollection(clazz)); } + /** + * 分页查询 查询总条数 + * @param compareConditionList + * @param clazz + * @param pageNum + * @param pageSize + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @return + */ + public long recentPageCount(List compareConditionList,Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum){ + if (recentPageNum == null || !(recentPageNum <= 50 && recentPageNum >= 5)) { + // 返回-1 表示不查询总条数 + return -1L; + } + //分页查询 不查询实际总条数 需要单独查询 是否有数据 + //如果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 = executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList), collectionManager.getCollection(clazz), countOptions); + //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 + if (isExists == 0) { + // 查询真实总条数 + CountOptions countOptionsReal = new CountOptions(); + countOptionsReal.limit(limitParam); + return executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList), collectionManager.getCollection(clazz), countOptionsReal); + } + return limitParam; + } + public long count(Class clazz){ return doCount(collectionManager.getCollection(clazz)); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java index 59b5ddc7..d2b7c114 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java @@ -5,10 +5,7 @@ import com.mongodb.BasicDBObject; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.CreateIndexOptions; -import com.mongodb.client.model.DropIndexOptions; -import com.mongodb.client.model.IndexModel; -import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.InsertOneResult; @@ -57,6 +54,8 @@ public interface Execute { long executeCountByCondition(BasicDBObject basicDBObject,MongoCollection collection); + long executeCountByCondition(BasicDBObject basicDBObject,MongoCollection collection, CountOptions var2); + long doCount(MongoCollection collection); FindIterable doQueryCommand(BasicDBObject basicDBObject,MongoCollection collection); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java index 4895702f..4c97bb20 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java @@ -9,10 +9,7 @@ import com.mongodb.BasicDBObject; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.CreateIndexOptions; -import com.mongodb.client.model.DropIndexOptions; -import com.mongodb.client.model.IndexModel; -import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.InsertOneResult; @@ -116,6 +113,11 @@ public class DefaultExecute extends AbstractExecute { return collection.countDocuments(basicDBObject); } + @Override + public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection, CountOptions var2) { + return collection.countDocuments(basicDBObject, var2); + } + @Override public long doCount(MongoCollection collection) { return collection.countDocuments(); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index becae3f1..67646366 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -10,10 +10,7 @@ import com.mongodb.client.AggregateIterable; import com.mongodb.client.ClientSession; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.CreateIndexOptions; -import com.mongodb.client.model.DropIndexOptions; -import com.mongodb.client.model.IndexModel; -import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.InsertOneResult; @@ -118,6 +115,11 @@ public class SessionExecute extends AbstractExecute { return collection.countDocuments(clientSession,basicDBObject); } + @Override + public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection, CountOptions var2) { + return collection.countDocuments(clientSession, basicDBObject, var2); + } + @Override public long doCount(MongoCollection collection) { return collection.countDocuments(clientSession); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java index 669233fb..f950bc5b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java @@ -190,6 +190,16 @@ public interface IService { */ PageResult page(PageParam pageParam); + /** + * 分页查询 + * @param pageParam 分页参数对象 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @return com.anwen.mongo.sql.model.PageResult + * @author JiaChaoYang + * @date 2023/6/25/025 + */ + PageResult page(PageParam pageParam, Integer recentPageNum); + /** * 分页查询 * @param pageNum 当前页 @@ -200,10 +210,25 @@ public interface IService { */ PageResult page(Integer pageNum,Integer pageSize); + /** + * 分页查询 + * @param pageNum 当前页 + * @param pageSize 每页显示行数 + * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} + * @return com.anwen.mongo.sql.model.PageResult + * @author JiaChaoYang + * @date 2023/6/25/025 + */ + PageResult page(Integer pageNum,Integer pageSize, Integer recentPageNum); + PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize); PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam); + PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum); + + PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum); + /** * 根据id查询单个 * @param id id 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 24f8930a..a2c97e8c 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 @@ -220,16 +220,36 @@ public class ServiceImpl implements IService{ return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),clazz); } + @Override + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum){ + return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(), pageNum,pageSize,recentPageNum,clazz); + } + + @Override + public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum) { + return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum,clazz); + } + @Override public PageResult page(PageParam pageParam) { return page(pageParam.getPageNum(),pageParam.getPageSize()); } + @Override + public PageResult page(PageParam pageParam, Integer recentPageNum) { + return page(pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum); + } + @Override public PageResult page(Integer pageNum, Integer pageSize) { return factory.getExecute(database).page(null,null,null,null,pageNum,pageSize,clazz); } + @Override + public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { + return factory.getExecute(database).page(null,null,null,null,pageNum,pageSize,recentPageNum,clazz); + } + @Override public T getById(Serializable id) { return factory.getExecute(database).getById(id,clazz); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java index afed057b..d6ab9f10 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java @@ -51,9 +51,13 @@ public class LambdaOperate { PageResult pageResult = new PageResult<>(); pageResult.setPageNum(pageParams.getPageNum()); pageResult.setPageSize(pageParams.getPageSize()); + pageResult.setContentData(DocumentMapperConvert.mapDocumentList(documentFindIterable.skip((pageParams.getPageNum() - 1) * pageParams.getPageSize()).limit(pageParams.getPageSize()), clazz)); + // 不查询总条数,总条数=当前页的总数 + if (totalSize == -1) { + totalSize = pageResult.getContentData().size(); + } pageResult.setTotalSize(totalSize); pageResult.setTotalPages((totalSize + pageParams.getPageSize() - 1) / pageParams.getPageSize()); - pageResult.setContentData(DocumentMapperConvert.mapDocumentList(documentFindIterable.skip((pageParams.getPageNum() - 1) * pageParams.getPageSize()).limit(pageParams.getPageSize()), clazz)); return pageResult; } -- Gitee From 7ea63f2ce10e59d2c69ecd65b9c98175063ab49c Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Thu, 25 Jan 2024 20:22:10 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E4=BF=AE=E6=94=B9bean=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anwen/mongo/config/MongoPlusConfiguration.java | 13 ++++++++----- .../mongo/config/OverrideMongoConfiguration.java | 1 - .../MongoPlusTransactionalManager.java | 8 ++++---- .../MongoTransactionManagerAutoConfiguration.java | 1 - .../transactional/MongoTransactionalAspect.java | 10 +++++----- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index 04669c58..c25a9d63 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -16,10 +16,13 @@ import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import java.util.Arrays; import java.util.Collections; +import java.util.stream.Collectors; /** * @author JiaChaoYang @@ -45,16 +48,16 @@ public class MongoPlusConfiguration { */ @Bean @ConditionalOnMissingBean - public MongoClient mongoClient(){ + public MongoClient mongo(){ return MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseInterceptor())).build()); } @Bean @ConditionalOnMissingBean(MongoPlusClient.class) - public MongoPlusClient mongoPlusClient(MongoClient mongoClient){ + public MongoPlusClient mongoPlusClient(MongoClient mongo){ MongoPlusClient mongoPlusClient = new MongoPlusClient(); - mongoPlusClient.setMongoClient(mongoClient); + mongoPlusClient.setMongoClient(mongo); mongoPlusClient.setBaseProperty(mongoDBConnectProperty); MongoPlusClientCache.mongoPlusClient = mongoPlusClient; return mongoPlusClient; @@ -84,8 +87,8 @@ public class MongoPlusConfiguration { @Bean("mongoTransactionalAspect") @Deprecated @ConditionalOnMissingBean - public MongoTransactionalAspect mongoTransactionalAspect(MongoClient mongoClient) { - return new MongoTransactionalAspect(mongoClient); + public MongoTransactionalAspect mongoTransactionalAspect(MongoClient mongo) { + return new MongoTransactionalAspect(mongo); } } diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java index 96140db6..5a51f98a 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java @@ -12,7 +12,6 @@ import org.springframework.context.annotation.DependsOn; * 覆盖MongoTemplate的MongoClient * @author JiaChaoYang **/ -@DependsOn("mongoClient") public class OverrideMongoConfiguration extends MongoAutoConfiguration { private final MongoClient mongoClient; diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoPlusTransactionalManager.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoPlusTransactionalManager.java index 483b4cef..43f6e6ce 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoPlusTransactionalManager.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoPlusTransactionalManager.java @@ -22,15 +22,15 @@ public class MongoPlusTransactionalManager extends AbstractPlatformTransactionMa Logger logger = LoggerFactory.getLogger(MongoPlusTransactionalManager.class); - private final MongoClient mongoClient; + private final MongoClient mongo; - public MongoPlusTransactionalManager(MongoClient mongoClient) { - this.mongoClient = mongoClient; + public MongoPlusTransactionalManager(MongoClient mongo) { + this.mongo = mongo; } @Override protected Object doGetTransaction() throws TransactionException { - return mongoClient.startSession(ClientSessionOptions.builder().causallyConsistent(true).build()); + return mongo.startSession(ClientSessionOptions.builder().causallyConsistent(true).build()); } @Override diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java index 9dfcce3a..414106bf 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java @@ -13,7 +13,6 @@ import org.springframework.transaction.TransactionManager; * * @author JiaChaoYang **/ -@DependsOn("mongoClient") public class MongoTransactionManagerAutoConfiguration { private final MongoClient mongoClient; diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionalAspect.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionalAspect.java index a8ad4139..092a7c73 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionalAspect.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionalAspect.java @@ -20,11 +20,11 @@ public class MongoTransactionalAspect { private static final Logger logger = LoggerFactory.getLogger(MongoTransactionalAspect.class); - public MongoTransactionalAspect(MongoClient mongoClient) { - this.mongoClient = mongoClient; - } + private final MongoClient mongo; - private final MongoClient mongoClient; + public MongoTransactionalAspect(MongoClient mongo) { + this.mongo = mongo; + } @Around("@annotation(com.anwen.mongo.annotation.transactional.MongoTransactional)") public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable { @@ -50,7 +50,7 @@ public class MongoTransactionalAspect { //获取线程中的session ClientSession session = MongoTransactionContext.getClientSessionContext(); if (session == null) { - session = mongoClient.startSession(ClientSessionOptions.builder().causallyConsistent(true).build()); + session = mongo.startSession(ClientSessionOptions.builder().causallyConsistent(true).build()); session.startTransaction(); MongoTransactionStatus status = new MongoTransactionStatus(session); MongoTransactionContext.setTransactionStatus(status); -- Gitee From a0a391450855f29f526f9562781948daadeb5919 Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Fri, 26 Jan 2024 21:50:57 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/anwen/mongo/execute/AbstractExecute.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index 3fd192b1..4f291297 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -288,12 +288,12 @@ public abstract class AbstractExecute implements Execute { /** * 分页查询 查询总条数 - * @param compareConditionList - * @param clazz - * @param pageNum - * @param pageSize + * @param compareConditionList 条件集合 + * @param clazz result class + * @param pageNum 当前页 + * @param pageSize 每页显示行数 * @param recentPageNum 查询最近n页的数据 {参数=null 表示仅查询当前页数据} {参数取值[5-50] 表示查询最近[5-50]页的数据 建议recentPageNum等于10 参考 百度分页检索} - * @return + * @return long */ public long recentPageCount(List compareConditionList,Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum){ if (recentPageNum == null || !(recentPageNum <= 50 && recentPageNum >= 5)) { -- Gitee From 3f6208cf7d8f629186b191bf64864bbf4dbd762d Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Sun, 28 Jan 2024 21:40:27 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=88=96=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=89=B9=E9=87=8F=E6=B7=BB=E5=8A=A0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=87=AA=E5=AE=9A=E4=B9=89=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/config/MongoPlusConfiguration.java | 18 ++++- .../MongoDBConfigurationProperty.java | 27 +++++++ .../mongo/domain/MongoPlusException.java | 11 +++ .../anwen/mongo/execute/AbstractExecute.java | 74 ++++++++++++------- .../java/com/anwen/mongo/execute/Execute.java | 5 +- .../execute/instance/DefaultExecute.java | 11 +-- .../execute/instance/SessionExecute.java | 11 +-- .../com/anwen/mongo/service/IService.java | 11 ++- .../anwen/mongo/service/impl/ServiceImpl.java | 5 ++ .../com/anwen/mongo/toolkit/StringUtils.java | 3 + 10 files changed, 136 insertions(+), 40 deletions(-) create mode 100644 mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoDBConfigurationProperty.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index c25a9d63..9de5ffcf 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -7,6 +7,7 @@ import com.anwen.mongo.interceptor.BaseInterceptor; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.MongoPlusMapMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; +import com.anwen.mongo.property.MongoDBConfigurationProperty; import com.anwen.mongo.property.MongoDBConnectProperty; import com.anwen.mongo.toolkit.MongoCollectionUtils; import com.anwen.mongo.toolkit.UrlJoint; @@ -29,16 +30,19 @@ import java.util.stream.Collectors; * 连接配置 * @since 2023-02-09 14:27 **/ -@EnableConfigurationProperties(value = {MongoDBConnectProperty.class, MongoDBCollectionProperty.class}) +@EnableConfigurationProperties(value = {MongoDBConnectProperty.class, MongoDBCollectionProperty.class, MongoDBConfigurationProperty.class}) public class MongoPlusConfiguration { private final MongoDBConnectProperty mongoDBConnectProperty; private final MongoDBCollectionProperty mongoDBCollectionProperty; - public MongoPlusConfiguration(MongoDBConnectProperty mongoDBConnectProperty, MongoDBCollectionProperty mongoDBCollectionProperty) { + private final MongoDBConfigurationProperty mongoDBConfigurationProperty; + + public MongoPlusConfiguration(MongoDBConnectProperty mongoDBConnectProperty, MongoDBCollectionProperty mongoDBCollectionProperty, MongoDBConfigurationProperty mongoDBConfigurationProperty) { this.mongoDBConnectProperty = mongoDBConnectProperty; this.mongoDBCollectionProperty = mongoDBCollectionProperty; + this.mongoDBConfigurationProperty = mongoDBConfigurationProperty; } /** @@ -60,6 +64,16 @@ public class MongoPlusConfiguration { mongoPlusClient.setMongoClient(mongo); mongoPlusClient.setBaseProperty(mongoDBConnectProperty); MongoPlusClientCache.mongoPlusClient = mongoPlusClient; + if (mongoDBConfigurationProperty.getBanner()){ + System.out.println("___ ___ ______ _ \n" + + "| \\/ | | ___ \\ | \n" + + "| . . | ___ _ __ __ _ ___ | |_/ / |_ _ ___ \n" + + "| |\\/| |/ _ \\| '_ \\ / _` |/ _ \\| __/| | | | / __|\n" + + "| | | | (_) | | | | (_| | (_) | | | | |_| \\__ \\\n" + + "\\_| |_/\\___/|_| |_|\\__, |\\___/\\_| |_|\\__,_|___/\n" + + " __/ | \n" + + " |___/ "); + } return mongoPlusClient; } diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoDBConfigurationProperty.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoDBConfigurationProperty.java new file mode 100644 index 00000000..45307481 --- /dev/null +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/property/MongoDBConfigurationProperty.java @@ -0,0 +1,27 @@ +package com.anwen.mongo.property; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * configuration属性配置 + * + * @author JiaChaoYang + **/ +@ConfigurationProperties(prefix = "mongo-plus.configuration") +public class MongoDBConfigurationProperty { + + /** + * banner打印 + * @author JiaChaoYang + * @date 2024/1/26 21:58 + */ + private Boolean banner = true; + + public Boolean getBanner() { + return banner; + } + + public void setBanner(Boolean banner) { + this.banner = banner; + } +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java new file mode 100644 index 00000000..db205e93 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java @@ -0,0 +1,11 @@ +package com.anwen.mongo.domain; + +/** + * MongoPlus异常 + * + * @author JiaChaoYang + **/ +public class MongoPlusException extends RuntimeException { + + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index 4f291297..89767cb8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -21,6 +21,7 @@ import com.anwen.mongo.strategy.convert.ConversionService; import com.anwen.mongo.support.SFunction; 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; @@ -31,6 +32,7 @@ import org.bson.conversions.Bson; import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sun.security.ec.point.ProjectivePoint; import java.io.Serializable; import java.lang.reflect.Field; @@ -115,42 +117,64 @@ public abstract class AbstractExecute implements Execute { } public Boolean saveOrUpdateBatch(Collection entityList) { - List saveList = new ArrayList<>(); - List updateList = new ArrayList<>(); - entityList.parallelStream().forEach(entity -> { + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); - if ((StringUtils.isBlank(idByEntity) || !isExist(idByEntity, entity.getClass()))) { - saveList.add(entity); + if (StringUtils.isBlank(idByEntity)){ + writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } else { - updateList.add(entity); + Map basicDBObjectMap = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"))); } }); - boolean save = false; - boolean update = false; - if (!saveList.isEmpty()){ - save = saveBatch(saveList); - } - if (!updateList.isEmpty()){ - update = updateBatchByIds(updateList); - } - return save == update; + BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); + return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); + } + + public Boolean saveOrUpdateBatchWrapper(Collection entityList,List compareConditionList){ + Class clazz = entityList.stream().findFirst().get().getClass(); + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + long count = count(compareConditionList, clazz); + if (count > 0){ + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); + Document document = DocumentUtil.checkUpdateField(entity,false); + document.remove(SqlOperationConstant._ID); + BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + writeModelList.add(new UpdateManyModel<>(queryBasic,updateField)); + } else { + writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); + } + }); + BulkWriteResult bulkWriteResult = bulkWrite(writeModelList, collectionManager.getCollection(clazz)); + return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); } public Boolean updateById(T entity) { - Document document = DocumentUtil.checkUpdateField(entity,false); - BasicDBObject filter = ExecuteUtil.getFilter(document); - BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + Map basicDBObjectMap = getUpdate(entity); MongoCollection collection = collectionManager.getCollection(ClassTypeUtil.getClass(entity)); - return executeUpdate(filter,update,collection).getModifiedCount() >= 1; + return executeUpdate(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"),collection).getModifiedCount() >= 1; } public Boolean updateBatchByIds(Collection entityList) { - int line = 0; - for (T entity : entityList) { - line += updateById(entity) ? 1 : 0; - } - return line == entityList.size(); + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + Map basicDBObjectMap = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"))); + }); + BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); + return bulkWriteResult.getModifiedCount() == entityList.size(); + } + + public Map getUpdate(T entity){ + Document document = DocumentUtil.checkUpdateField(entity,false); + BasicDBObject filter = ExecuteUtil.getFilter(document); + BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new HashMap(){{ + put("filter",filter); + put("update",update); + }}; } public Boolean updateByColumn(T entity, SFunction column) { @@ -259,7 +283,7 @@ public abstract class AbstractExecute implements Execute { public List getByIds(Collection ids,Class clazz) { BasicDBObject basicDBObject = checkIdType(ids); - FindIterable iterable = doGetByIds(basicDBObject, collectionManager.getCollection(clazz)); + FindIterable iterable = doGetById(basicDBObject, collectionManager.getCollection(clazz)); return DocumentMapperConvert.mapDocumentList(iterable, clazz); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java index d2b7c114..59ff2ade 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java @@ -2,6 +2,7 @@ package com.anwen.mongo.execute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; +import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; @@ -26,6 +27,8 @@ public interface Execute { InsertManyResult doSaveBatch(List documentList, MongoCollection collection); + BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection); + DeleteResult executeRemove(Bson filter, MongoCollection collection); FindIterable doList(MongoCollection collection); @@ -46,8 +49,6 @@ public interface Execute { long executeExist(BasicDBObject queryBasic, MongoCollection collection); - FindIterable doGetByIds(BasicDBObject basicDBObject,MongoCollection collection); - UpdateResult executeUpdate(Bson queryBasic,Bson updateBasic,MongoCollection collection); DeleteResult executeRemove(BasicDBObject deleteBasic,MongoCollection collection); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java index 4c97bb20..85c75b04 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java @@ -6,6 +6,7 @@ import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; +import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; @@ -43,6 +44,11 @@ public class DefaultExecute extends AbstractExecute { return collection.insertMany(documentList); } + @Override + public BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection) { + return collection.bulkWrite(writeModelList); + } + @Override public DeleteResult executeRemove(Bson filter, MongoCollection collection) { return collection.deleteMany(filter); @@ -93,11 +99,6 @@ public class DefaultExecute extends AbstractExecute { return collection.countDocuments(queryBasic); } - @Override - public FindIterable doGetByIds(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.find(basicDBObject); - } - @Override public UpdateResult executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { return collection.updateMany(queryBasic,updateBasic); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index 67646366..d3c4edf6 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -6,6 +6,7 @@ import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; +import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.AggregateIterable; import com.mongodb.client.ClientSession; import com.mongodb.client.FindIterable; @@ -46,6 +47,11 @@ public class SessionExecute extends AbstractExecute { return collection.insertMany(clientSession,documentList); } + @Override + public BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection) { + return collection.bulkWrite(clientSession,writeModelList); + } + @Override public DeleteResult executeRemove(Bson filter, MongoCollection collection) { return collection.deleteOne(clientSession, filter); @@ -95,11 +101,6 @@ public class SessionExecute extends AbstractExecute { return collection.countDocuments(clientSession,queryBasic); } - @Override - public FindIterable doGetByIds(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.find(clientSession,basicDBObject); - } - @Override public UpdateResult executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { return collection.updateMany(clientSession,queryBasic,updateBasic); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java index f950bc5b..e39e956e 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java @@ -56,7 +56,7 @@ public interface IService { Boolean saveOrUpdate(T entity); /** - * 根据传入wrapper条件判断添加还是删除,传递_id并不会修改 + * 根据传入wrapper条件判断添加修改,传递_id并不会修改 * @param entity 对象 * @param queryChainWrapper 条件 * @return java.lang.Boolean @@ -74,6 +74,15 @@ public interface IService { */ Boolean saveOrUpdateBatch(Collection entityList); + /** + * 根据传入wrapper条件判断批量添加修改,传递_id并不会修改 + * @param entityList 对象集合 + * @return java.lang.Boolean + * @author JiaChaoYang + * @since 2023/2/9 13:57 + */ + Boolean saveOrUpdateBatchWrapper(Collection entityList,QueryChainWrapper queryChainWrapper); + /** * 修改 * @param entity 修改的对象,需要包含id 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 a2c97e8c..85cd27f2 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 @@ -117,6 +117,11 @@ public class ServiceImpl implements IService{ return factory.getExecute(database).saveOrUpdateBatch(entityList); } + @Override + public Boolean saveOrUpdateBatchWrapper(Collection entityList, QueryChainWrapper queryChainWrapper) { + return factory.getExecute(database).saveOrUpdateBatchWrapper(entityList,queryChainWrapper.getCompareList()); + } + @Override public Boolean updateById(T entity) { return factory.getExecute(database).updateById(entity); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/StringUtils.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/StringUtils.java index 83f80ef2..f90fa0ab 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/StringUtils.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/StringUtils.java @@ -118,6 +118,9 @@ public final class StringUtils { if (str == null) { return true; } + if (str.equals("null")){ + return true; + } int len = str.length(); if (len == 0) { return true; -- Gitee From 2f6c8b46365c2f0665369eb5c5f4cd6a4cb3bba7 Mon Sep 17 00:00:00 2001 From: wangxiaoyan Date: Wed, 31 Jan 2024 14:39:20 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=96=B0=E7=9A=84Colle?= =?UTF-8?q?ction=E6=8F=92=E5=85=A5=E6=97=B6=EF=BC=8C=E8=87=AA=E5=A2=9Eid?= =?UTF-8?q?=E4=BC=9A=E5=8F=96=E4=B8=8A=E4=B8=AACollection=E7=9A=84?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=80=BC=E3=80=81=E8=87=AA=E5=A2=9Eid?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=94=81=E7=B2=92=E5=BA=A6=E7=BC=A9=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/anwen/mongo/execute/SqlExecute.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/SqlExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/SqlExecute.java index 91c6155b..cf041b44 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/SqlExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/SqlExecute.java @@ -104,9 +104,6 @@ public class SqlExecute { private String createIndex = null; - private int num = 1; - - public void init(Class clazz) { String tableName = clazz.getSimpleName().toLowerCase(); String database = baseProperty.getDatabase(); @@ -1088,20 +1085,26 @@ public class SqlExecute { } private synchronized Integer getAutoId(Class clazz) { + String collectionName = collectionNameConvert.convert(clazz); MongoCollection collection = getCollection("counters"); - Document query = new Document(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); + 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))); - if (document == null){ - Integer finalNum = num; - collection.insertOne(new Document(new HashMap(){{ - put(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); - put(SqlOperationConstant.AUTO_NUM, finalNum); - }})); - }else { - num = Integer.parseInt(String.valueOf(document.get(SqlOperationConstant.AUTO_NUM))); + // 只锁当前collection + synchronized (collectionName.intern()) { + 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<>(); + map.put(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); + map.put(SqlOperationConstant.AUTO_NUM, finalNum); + collection.insertOne(new Document(map)); + } else { + finalNum = Integer.parseInt(String.valueOf(document.get(SqlOperationConstant.AUTO_NUM))); + } + return finalNum; } - return num; } private void fillId(T entity, Document document) { -- Gitee From 50cdaa9db5aab6148680b4066676f0006bd5558a Mon Sep 17 00:00:00 2001 From: wangxiaoyan Date: Wed, 31 Jan 2024 15:23:10 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0Collection?= =?UTF-8?q?=E8=87=AA=E5=A2=9Eid=E4=BC=9A=E4=BB=8E=E4=B8=8A=E4=B8=AACollect?= =?UTF-8?q?ion=E7=9A=84id=E5=BC=80=E5=A7=8B=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anwen/mongo/execute/AbstractExecute.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index 89767cb8..c2562495 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -55,13 +55,6 @@ public abstract class AbstractExecute implements Execute { private final Logger logger = LoggerFactory.getLogger(AbstractExecute.class); - /** - * 计数id - * @author JiaChaoYang - * @date 2023/12/28 11:33 - */ - private int num = 1; - private final CollectionManager collectionManager; private final CollectionNameConvert collectionNameConvert; @@ -416,21 +409,27 @@ public abstract class AbstractExecute implements Execute { return tableFieldMap; } - protected synchronized Integer getAutoId(Class clazz) { - MongoCollection collection = collectionManager.getCollection("counters"); - Document query = new Document(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); - 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))); - if (document == null){ - Integer finalNum = num; - collection.insertOne(new Document(new HashMap(){{ - put(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); - put(SqlOperationConstant.AUTO_NUM, finalNum); - }})); - }else { - num = Integer.parseInt(String.valueOf(document.get(SqlOperationConstant.AUTO_NUM))); + protected Integer getAutoId(Class clazz) { + String collectionName = collectionNameConvert.convert(clazz); + // 每个Collection单独加锁 + synchronized (collectionName.intern()) { + MongoCollection collection = collectionManager.getCollection("counters"); + Document query = new Document(SqlOperationConstant._ID, collection); + 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))); + int finalNum = 1; + if (document == null) { + Map map = new HashMap<>(); + map.put(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); + map.put(SqlOperationConstant.AUTO_NUM, finalNum); + collection.insertOne(new Document(map)); + } else { + finalNum = Integer.parseInt(String.valueOf(document.get(SqlOperationConstant.AUTO_NUM))); + } + return finalNum; } - return num; } protected void fillId(T entity, Document document) { -- Gitee From 4ea0b143d8946eb834fdece5fca589b5a6542012 Mon Sep 17 00:00:00 2001 From: wangxiaoyan Date: Wed, 31 Jan 2024 15:33:55 +0800 Subject: [PATCH 07/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0Collection?= =?UTF-8?q?=E8=87=AA=E5=A2=9Eid=E4=BC=9A=E4=BB=8E=E4=B8=8A=E4=B8=AACollect?= =?UTF-8?q?ion=E7=9A=84id=E5=BC=80=E5=A7=8B=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/anwen/mongo/execute/AbstractExecute.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index c2562495..c016d6d2 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -414,7 +414,7 @@ public abstract class AbstractExecute implements Execute { // 每个Collection单独加锁 synchronized (collectionName.intern()) { MongoCollection collection = collectionManager.getCollection("counters"); - Document query = new Document(SqlOperationConstant._ID, collection); + 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))) -- Gitee From dfd77b4d3416408d9dd6ab3b100e0a96f300e893 Mon Sep 17 00:00:00 2001 From: jiachaoyang Date: Fri, 2 Feb 2024 14:19:01 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E4=BC=98=E5=8C=96AbstractExecute?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LambdaAggregateChainWrapper.java | 2 +- .../query/LambdaQueryChainWrapper.java | 12 ++--- .../mongo/domain/MongoPlusException.java | 11 +++++ .../anwen/mongo/execute/AbstractExecute.java | 45 +++++++++++-------- .../anwen/mongo/execute/ExecutorFactory.java | 19 +++++++- .../anwen/mongo/service/impl/ServiceImpl.java | 27 +++++------ 6 files changed, 74 insertions(+), 42 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java index cbe6bbba..a0717ecc 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java @@ -23,6 +23,6 @@ public class LambdaAggregateChainWrapper extends AggregateChainWrapper list() { - return factory.getExecute(database).aggregateList(super.baseAggregateList,super.getBasicDBObjectList(),super.getOptionsBasicDBObject(),clazz); + return factory.getExecute(database).aggregateList(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index 47391cae..8f71155f 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -27,32 +27,32 @@ public class LambdaQueryChainWrapper extends QueryChainWrapper list() { - return factory.getExecute(database).list(getCompareList(), getOrderList(),getProjectionList(),getBasicDBObjectList(),clazz); + return factory.getExecute(database).list(this,clazz); } @Override public T one() { - return factory.getExecute(database).one(getCompareList(),getProjectionList(),getBasicDBObjectList(),clazz); + return factory.getExecute(database).one(this,clazz); } @Override public T limitOne() { - return factory.getExecute(database).limitOne(getCompareList(),getProjectionList(),getBasicDBObjectList(),getOrderList(),clazz); + return factory.getExecute(database).limitOne(this,clazz); } @Override public PageResult page(PageParam pageParam) { - return factory.getExecute(database).page(getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),clazz); + return factory.getExecute(database).page(this,pageParam.getPageNum(),pageParam.getPageSize(),clazz); } @Override public PageResult page(Integer pageNum, Integer pageSize) { - return factory.getExecute(database).page(getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageNum,pageSize,clazz); + return factory.getExecute(database).page(this,pageNum,pageSize,clazz); } @Override public long count() { - return factory.getExecute(database).count(getCompareList(),clazz); + return factory.getExecute(database).count(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java new file mode 100644 index 00000000..a81a2cd3 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/domain/MongoPlusException.java @@ -0,0 +1,11 @@ +package com.anwen.mongo.domain; + +/** + * MongoPlus异常 + * + * @author JiaChaoYang + * @project mongo-plus + * @date 2024-01-26 10:24 + **/ +public class MongoPlusException { +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index db349113..38c887f8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -3,9 +3,12 @@ package com.anwen.mongo.execute; import com.anwen.mongo.annotation.ID; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.conditions.BuildCondition; +import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.interfaces.condition.Order; +import com.anwen.mongo.conditions.query.QueryChainWrapper; +import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.context.MongoTransactionContext; @@ -101,10 +104,10 @@ public abstract class AbstractExecute implements Execute { return isExist(idByEntity,entity.getClass()) ? updateById(entity) : save(entity); } - public Boolean saveOrUpdateWrapper(T entity,List compareConditionList){ - long count = count(compareConditionList, entity.getClass()); + public Boolean saveOrUpdateWrapper(T entity,QueryChainWrapper queryChainWrapper){ + long count = count(queryChainWrapper, entity.getClass()); if (count > 0){ - BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); Document document = DocumentUtil.checkUpdateField(entity,false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); @@ -203,12 +206,15 @@ public abstract class AbstractExecute implements Execute { return DocumentMapperConvert.mapDocumentList(doList(collectionManager.getCollection(clazz)),clazz); } - public List list(List compareConditionList, List orderList, List projectionList, List basicDBObjectList, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + public List list(QueryChainWrapper queryChainWrapper, Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); return lambdaOperate.getLambdaQueryResult(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); } - public List aggregateList(List aggregateList, List basicDBObjectList, BasicDBObject optionsBasicDBObject, 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()))); addAll(basicDBObjectList); @@ -219,8 +225,8 @@ public abstract class AbstractExecute implements Execute { return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(),clazz); } - public T one(List compareConditionList,List projectionList,List basicDBObjectList,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, null, projectionList, basicDBObjectList); + public T one(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); List result = lambdaOperate.getLambdaQueryResult(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); if (result.size() > 1) { throw new MongoQueryException("query result greater than one line"); @@ -228,16 +234,16 @@ public abstract class AbstractExecute implements Execute { return !result.isEmpty() ? result.get(0) : null; } - public T limitOne(List compareConditionList,List projectionList,List basicDBObjectList,List orderList,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + public T limitOne(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); List result = lambdaOperate.getLambdaQueryResult(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); return !result.isEmpty() ? result.get(0) : null; } - public PageResult page(List compareConditionList, List orderList,List projectionList,List basicDBObjectList, Integer pageNum, Integer pageSize,Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); FindIterable iterable = doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz)); - return lambdaOperate.getLambdaQueryResultPage(iterable,count(compareConditionList,clazz),new PageParam(pageNum,pageSize),clazz); + return lambdaOperate.getLambdaQueryResultPage(iterable,count(queryChainWrapper,clazz),new PageParam(pageNum,pageSize),clazz); } public T getById(Serializable id,Class clazz) { @@ -256,7 +262,10 @@ public abstract class AbstractExecute implements Execute { return DocumentMapperConvert.mapDocumentList(iterable, clazz); } - public Boolean update(List compareConditionList,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()); @@ -271,12 +280,12 @@ public abstract class AbstractExecute implements Execute { return executeUpdate(queryBasic,DocumentUtil.handleBasicDBObject(basicDBObject),collectionManager.getCollection(clazz)).getModifiedCount() >= 1; } - public Boolean remove(List compareConditionList,Class clazz) { - return executeRemove(BuildCondition.buildQueryCondition(compareConditionList),collectionManager.getCollection(clazz)).getDeletedCount() >= 1; + public Boolean remove(UpdateChainWrapper updateChainWrapper, Class clazz) { + return executeRemove(BuildCondition.buildQueryCondition(updateChainWrapper.getCompareList()),collectionManager.getCollection(clazz)).getDeletedCount() >= 1; } - public long count(List compareConditionList,Class clazz){ - return executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList),collectionManager.getCollection(clazz)); + public long count(QueryChainWrapper queryChainWrapper,Class clazz){ + return executeCountByCondition(BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()),collectionManager.getCollection(clazz)); } public long count(Class clazz){ diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java index 3f17ff01..a7a6c4d3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java @@ -8,6 +8,7 @@ import com.anwen.mongo.execute.instance.DefaultExecute; import com.anwen.mongo.execute.instance.SessionExecute; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.BaseProperty; +import com.anwen.mongo.toolkit.StringPool; import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.ClientSession; import org.slf4j.Logger; @@ -16,6 +17,8 @@ import org.slf4j.LoggerFactory; import java.util.Map; import java.util.Objects; +import static com.anwen.mongo.toolkit.StringPool.EMPTY; + /** * 执行器工厂 * @author JiaChaoYang @@ -51,10 +54,18 @@ public class ExecutorFactory { return getExecute(getCollectionManager(database)); } + public AbstractExecute getExecute(){ + return getExecute(getCollectionManager(EMPTY)); + } + public Execute getExecuteInterface(String database){ return getExecute(getCollectionManager(database)); } + public Execute getExecuteInterface(){ + return getExecute(getCollectionManager(EMPTY)); + } + public AbstractExecute getExecute(CollectionManager collectionManager){ ClientSession clientSessionContext = MongoTransactionContext.getClientSessionContext(); if (clientSessionContext != null) { @@ -140,8 +151,12 @@ public class ExecutorFactory { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ExecutorFactory)) return false; + if (this == o) { + return true; + } + if (!(o instanceof ExecutorFactory)) { + return false; + } ExecutorFactory that = (ExecutorFactory) o; return Objects.equals(logger, that.logger) && Objects.equals(getBaseProperty(), that.getBaseProperty()) && Objects.equals(getCollectionNameConvert(), that.getCollectionNameConvert()) && Objects.equals(getMongoPlusClient(), that.getMongoPlusClient()); } 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 24f8930a..90ef5afd 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 @@ -109,7 +109,7 @@ public class ServiceImpl implements IService{ @Override public Boolean saveOrUpdateWrapper(T entity, QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).saveOrUpdateWrapper(entity,queryChainWrapper.getCompareList()); + return factory.getExecute(database).saveOrUpdateWrapper(entity,queryChainWrapper); } @Override @@ -139,15 +139,12 @@ public class ServiceImpl implements IService{ @Override public Boolean remove(UpdateChainWrapper updateChainWrapper) { - return factory.getExecute(database).remove(updateChainWrapper.getCompareList(),clazz); + return factory.getExecute(database).remove(updateChainWrapper,clazz); } @Override public Boolean update(UpdateChainWrapper updateChainWrapper) { - List compareConditionList = new ArrayList<>(); - compareConditionList.addAll(updateChainWrapper.getCompareList()); - compareConditionList.addAll(updateChainWrapper.getUpdateCompareList()); - return factory.getExecute(database).update(compareConditionList,clazz); + return factory.getExecute(database).update(updateChainWrapper,clazz); } @Override @@ -177,27 +174,27 @@ public class ServiceImpl implements IService{ @Override public List aggregateList(AggregateChainWrapper queryChainWrapper) { - return factory.getExecute(database).aggregateList(queryChainWrapper.getBaseAggregateList(),queryChainWrapper.getBasicDBObjectList(),queryChainWrapper.getOptionsBasicDBObject(),clazz); + return factory.getExecute(database).aggregateList(queryChainWrapper,clazz); } @Override public T one(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).one(queryChainWrapper.getCompareList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),clazz); + return factory.getExecute(database).one(queryChainWrapper,clazz); } @Override public T limitOne(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).limitOne(queryChainWrapper.getCompareList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),queryChainWrapper.getOrderList(),clazz); + return factory.getExecute(database).limitOne(queryChainWrapper,clazz); } @Override public List list(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).list(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),clazz); + return factory.getExecute(database).list(queryChainWrapper,clazz); } @Override public List list(AggregateChainWrapper queryChainWrapper) { - return factory.getExecute(database).aggregateList(queryChainWrapper.getBaseAggregateList(),queryChainWrapper.getBasicDBObjectList(),queryChainWrapper.getOptionsBasicDBObject(),clazz); + return factory.getExecute(database).aggregateList(queryChainWrapper,clazz); } @Override @@ -207,17 +204,17 @@ public class ServiceImpl implements IService{ @Override public long count(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).count(queryChainWrapper.getCompareList(),clazz); + return factory.getExecute(database).count(queryChainWrapper,clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize){ - return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(), pageNum,pageSize,clazz); + return factory.getExecute(database).page(queryChainWrapper, pageNum,pageSize,clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam) { - return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),clazz); + return page(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize()); } @Override @@ -227,7 +224,7 @@ public class ServiceImpl implements IService{ @Override public PageResult page(Integer pageNum, Integer pageSize) { - return factory.getExecute(database).page(null,null,null,null,pageNum,pageSize,clazz); + return page(new QueryChainWrapper<>(),pageNum,pageSize); } @Override -- Gitee From a09cf294204c66f0bd3e42a0befa5bab3c4e6687 Mon Sep 17 00:00:00 2001 From: jiachaoyang Date: Sat, 3 Feb 2024 13:05:06 +0800 Subject: [PATCH 09/20] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=85=8D=E7=BD=AE?= 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/config/MongoPlusConfiguration.java | 5 +++-- 2 files changed, 5 insertions(+), 4 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 ee21ee78..77a87700 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 @@ -56,12 +56,12 @@ public class MongoPlusAutoConfiguration implements InitializingBean { Logger logger = LoggerFactory.getLogger(MongoPlusAutoConfiguration.class); - public MongoPlusAutoConfiguration(MongoDBLogProperty mongoDBLogProperty, MongoDBCollectionProperty mongoDBCollectionProperty, ExecutorFactory executeFactory, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { + public MongoPlusAutoConfiguration(MongoDBLogProperty mongoDBLogProperty, MongoDBCollectionProperty mongoDBCollectionProperty, ExecutorFactory factory, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { this.mongoPlusClient = mongoPlusClient; this.applicationContext = applicationContext; this.mongoDBLogProperty = mongoDBLogProperty; this.mongoDBCollectionProperty = mongoDBCollectionProperty; - this.factory = executeFactory; + this.factory = factory; this.collectionNameConvert = collectionNameConvert; setConversion(); setMetaObjectHandler(); diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index 9de5ffcf..a084acf1 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -16,6 +16,7 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; +import org.springframework.beans.factory.FactoryBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -85,9 +86,10 @@ public class MongoPlusConfiguration { @Bean @ConditionalOnMissingBean - public ExecutorFactory executeFactory(CollectionNameConvert collectionNameConvert){ + public ExecutorFactory factory(CollectionNameConvert collectionNameConvert,MongoPlusClient mongoPlusClient){ return ExecutorFactory.builder() .baseProperty(mongoDBConnectProperty) + .mongoPlusClient(mongoPlusClient) .collectionNameConvert(collectionNameConvert) .build(); } @@ -99,7 +101,6 @@ public class MongoPlusConfiguration { } @Bean("mongoTransactionalAspect") - @Deprecated @ConditionalOnMissingBean public MongoTransactionalAspect mongoTransactionalAspect(MongoClient mongo) { return new MongoTransactionalAspect(mongo); -- Gitee From 97c3a94cbae010890d88ae88a00a6684dfd3fde7 Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Sun, 4 Feb 2024 23:28:06 +0800 Subject: [PATCH 10/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conditions/AbstractChainWrapper.java | 2 +- .../interfaces/Inject/InjectQuery.java | 33 ++++++++++++ .../conditions/query/QueryChainWrapper.java | 7 ++- .../anwen/mongo/execute/AbstractExecute.java | 51 +++++++++++-------- .../execute/inject/InjectAbstractExecute.java | 6 +++ .../execute/instance/SessionExecute.java | 2 +- .../mongo/mapper/MongoPlusMapMapper.java | 31 +++++++++++ .../com/anwen/mongo/service/IService.java | 26 ++++++++++ .../anwen/mongo/service/impl/ServiceImpl.java | 18 ++++++- 9 files changed, 151 insertions(+), 25 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java index 6b92c8f8..d334c69c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java @@ -24,7 +24,7 @@ import java.util.List; * @author JiaChaoYang * @date 2023/6/24/024 0:49 */ -public class AbstractChainWrapper> implements Compare { +public abstract class AbstractChainWrapper> implements Compare { protected final Children typedThis = (Children) this; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Inject/InjectQuery.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Inject/InjectQuery.java index d0a8e47c..40fa7ed5 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Inject/InjectQuery.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Inject/InjectQuery.java @@ -407,6 +407,39 @@ public interface InjectQuery extends CommInjectQuery { */ List> queryCommand(String database,String collectionName,String command); + + /** + * 是否存在 + * @param id id + * @return java.lang.Boolean + * @author JiaChaoYang + * @date 2024/2/3 13:42 + */ + Boolean exist(String collectionName,Serializable id); + + Boolean exist(String database,String collectionName,Serializable id); + + /** + * 是否存在 + * @param queryChainWrapper wrapper条件 + * @return java.lang.Boolean + * @author JiaChaoYang + * @date 2024/2/3 13:41 + */ + Boolean exist(String collectionName,QueryChainWrapper,?> queryChainWrapper); + + Boolean exist(String database,String collectionName,QueryChainWrapper,?> queryChainWrapper); + + + /** + * 根据条件修改 + * @author JiaChaoYang + * @date 2024/2/3 13:10 + */ + Boolean update(String collectionName,Map entityMap,QueryChainWrapper,?> queryChainWrapper); + + Boolean update(String database,String collectionName,Map entityMap,QueryChainWrapper,?> queryChainWrapper); + /** * 创建索引 * @param bson 描述索引键的对象,该对象不能为 null diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java index 3c0d1cbf..1b0327a7 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java @@ -8,7 +8,12 @@ import com.anwen.mongo.support.SFunction; import java.util.List; -public class QueryChainWrapper> extends AbstractChainWrapper implements Query { +/** + * AbstractChainWrapper的条件扩展类,查询专有的条件,使用类构造条件时,使用QueryChainWrapper的子类,{@link QueryWrapper} + * @author JiaChaoYang + * @date 2024/2/3 13:10 +*/ +public abstract class QueryChainWrapper> extends AbstractChainWrapper implements Query { @Override public Children project(Projection... projection) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index 8af24443..1ad01908 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -30,6 +30,7 @@ import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.InsertOneResult; +import javafx.util.Pair; import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; @@ -103,11 +104,8 @@ public abstract class AbstractExecute implements Execute { public Boolean saveOrUpdateWrapper(T entity,QueryChainWrapper queryChainWrapper){ long count = count(queryChainWrapper, entity.getClass()); if (count > 0){ - BasicDBObject queryBasic = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - Document document = DocumentUtil.checkUpdateField(entity,false); - document.remove(SqlOperationConstant._ID); - BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return executeUpdate(queryBasic,updateField,collectionManager.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return executeUpdate(updatePair.getKey(),updatePair.getValue(),collectionManager.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; } return save(entity); } @@ -119,8 +117,8 @@ public abstract class AbstractExecute implements Execute { if (StringUtils.isBlank(idByEntity)){ writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } else { - Map basicDBObjectMap = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"))); + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); } }); BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); @@ -133,11 +131,8 @@ public abstract class AbstractExecute implements Execute { entityList.forEach(entity -> { long count = count(queryChainWrapper, clazz); if (count > 0){ - BasicDBObject queryBasic = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - Document document = DocumentUtil.checkUpdateField(entity,false); - document.remove(SqlOperationConstant._ID); - BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - writeModelList.add(new UpdateManyModel<>(queryBasic,updateField)); + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); } else { writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } @@ -146,31 +141,32 @@ public abstract class AbstractExecute implements Execute { return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); } + public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return executeUpdate(updatePair.getKey(),updatePair.getValue(),collectionManager.getCollection(entity.getClass())).getModifiedCount() > 0; + } public Boolean updateById(T entity) { - Map basicDBObjectMap = getUpdate(entity); + Pair basicDBObjectPair = getUpdate(entity); MongoCollection collection = collectionManager.getCollection(ClassTypeUtil.getClass(entity)); - return executeUpdate(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"),collection).getModifiedCount() >= 1; + return executeUpdate(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),collection).getModifiedCount() >= 1; } public Boolean updateBatchByIds(Collection entityList) { List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { - Map basicDBObjectMap = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectMap.get("filter"),basicDBObjectMap.get("update"))); + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); }); BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); return bulkWriteResult.getModifiedCount() == entityList.size(); } - public Map getUpdate(T entity){ + public Pair getUpdate(T entity){ Document document = DocumentUtil.checkUpdateField(entity,false); BasicDBObject filter = ExecuteUtil.getFilter(document); BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new HashMap(){{ - put("filter",filter); - put("update",update); - }}; + return new Pair<>(filter,update); } public Boolean updateByColumn(T entity, SFunction column) { @@ -280,6 +276,11 @@ public abstract class AbstractExecute implements Execute { return executeExist(queryBasic, collectionManager.getCollection(clazz)) >= 1; } + public boolean isExist(QueryChainWrapper queryChainWrapper,Class clazz){ + BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); + return executeExist(basicDBObject,collectionManager.getCollection(clazz)) >= 1; + } + public List getByIds(Collection ids,Class clazz) { BasicDBObject basicDBObject = checkIdType(ids); FindIterable iterable = doGetById(basicDBObject, collectionManager.getCollection(clazz)); @@ -408,6 +409,14 @@ public abstract class AbstractExecute implements Execute { return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } + protected Pair getUpdateCondition(List compareConditionList, T entity){ + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); + Document document = DocumentUtil.checkUpdateField(entity,false); + document.remove(SqlOperationConstant._ID); + BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new Pair<>(queryBasic,updateField); + } + protected Document processIdField(T entity,Boolean skip){ Document tableFieldMap = DocumentUtil.checkTableField(entity); fillId(entity, tableFieldMap); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java index f76abad7..4cfc9c19 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java @@ -4,6 +4,7 @@ import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.interfaces.condition.Order; +import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.convert.Converter; @@ -189,6 +190,11 @@ public class InjectAbstractExecute { return execute.executeExist(queryBasic,collectionManager.getCollection(collectionName)) >= 1; } + public boolean isExist(String collectionName,QueryChainWrapper queryChainWrapper){ + BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); + return execute.executeExist(basicDBObject,collectionManager.getCollection(collectionName)) >= 1; + } + public List> getByColumn(String collectionName,String column,Object value){ Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); return Converter.convertDocumentToMap(execute.doGetByColumn(filter,collectionManager.getCollection(collectionName),Map.class)); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index d3c4edf6..ce7acd14 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -93,7 +93,7 @@ public class SessionExecute extends AbstractExecute { @Override public FindIterable doGetByIds(BasicDBObject queryBasic, MongoCollection collection, Class clazz) { - return collection.find(queryBasic,clazz); + return collection.find(clientSession,queryBasic,clazz); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java index 9f6b1731..e57fac6b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java @@ -16,6 +16,7 @@ import com.mongodb.client.model.CreateIndexOptions; import com.mongodb.client.model.DropIndexOptions; import com.mongodb.client.model.IndexModel; import com.mongodb.client.model.IndexOptions; +import com.sun.xml.internal.ws.util.xml.CDATA; import org.bson.Document; import org.bson.conversions.Bson; @@ -340,6 +341,36 @@ public class MongoPlusMapMapper implements InjectQuery { return factory.getInjectExecute(database).queryCommand(collectionName,command); } + @Override + public Boolean exist(String collectionName, Serializable id) { + return exist(EMPTY,collectionName,id); + } + + @Override + public Boolean exist(String database, String collectionName, Serializable id) { + return factory.getInjectExecute(database).isExist(collectionName,id); + } + + @Override + public Boolean exist(String collectionName, QueryChainWrapper, ?> queryChainWrapper) { + return exist(EMPTY,collectionName,queryChainWrapper); + } + + @Override + public Boolean exist(String database, String collectionName, QueryChainWrapper, ?> queryChainWrapper) { + return factory.getInjectExecute(database).isExist(collectionName,queryChainWrapper); + } + + @Override + public Boolean update(String collectionName, Map entityMap, QueryChainWrapper, ?> queryChainWrapper) { + return update(EMPTY,collectionName,entityMap,queryChainWrapper); + } + + @Override + public Boolean update(String database, String collectionName, Map entityMap, QueryChainWrapper, ?> queryChainWrapper) { + return null; + } + @Override public String createIndex(String collectionName,Bson bson) { return createIndex(EMPTY,collectionName,bson); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java index e39e956e..20dbf656 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java @@ -4,6 +4,7 @@ import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; import com.anwen.mongo.conditions.aggregate.LambdaAggregateChainWrapper; 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.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.model.PageParam; @@ -124,6 +125,13 @@ public interface IService { */ Boolean update(UpdateChainWrapper updateChainWrapper); + /** + * 根据条件修改 + * @author JiaChaoYang + * @date 2024/2/3 13:10 + */ + Boolean update(T entity,QueryChainWrapper queryChainWrapper); + /** * 根据id删除 * @param id 数据id @@ -278,6 +286,24 @@ public interface IService { */ List getByColumn(String field,Object fieldValue); + /** + * 是否存在 + * @param id id + * @return java.lang.Boolean + * @author JiaChaoYang + * @date 2024/2/3 13:42 + */ + Boolean exist(Serializable id); + + /** + * 是否存在 + * @param queryChainWrapper wrapper条件 + * @return java.lang.Boolean + * @author JiaChaoYang + * @date 2024/2/3 13:41 + */ + Boolean exist(QueryChainWrapper queryChainWrapper); + /** * 创建索引 * @param bson 描述索引键的对象,该对象不能为 null 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 2522761b..b3e66f9c 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 @@ -5,6 +5,7 @@ import com.anwen.mongo.conditions.aggregate.LambdaAggregateChainWrapper; 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.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.execute.ExecutorFactory; @@ -152,6 +153,11 @@ public class ServiceImpl implements IService{ return factory.getExecute(database).update(updateChainWrapper,clazz); } + @Override + public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { + return factory.getExecute(database).update(entity,queryChainWrapper); + } + @Override public Boolean removeById(Serializable id) { return factory.getExecute(database).removeById(id,clazz); @@ -244,7 +250,7 @@ public class ServiceImpl implements IService{ @Override public PageResult page(Integer pageNum, Integer pageSize) { - return page(new QueryChainWrapper<>(),pageNum,pageSize); + return page(new QueryWrapper<>(),pageNum,pageSize); } @Override @@ -277,6 +283,16 @@ public class ServiceImpl implements IService{ return factory.getExecute(database).getByColumn(field,fieldValue,clazz); } + @Override + public Boolean exist(Serializable id) { + return factory.getExecute(database).isExist(id,clazz); + } + + @Override + public Boolean exist(QueryChainWrapper queryChainWrapper) { + return factory.getExecute(database).isExist(queryChainWrapper,clazz); + } + @Override public String createIndex(Bson bson) { return factory.getExecute(database).createIndex(bson,clazz); -- Gitee From c9c2ccfa90842261782b4a7e077a99130227ccb1 Mon Sep 17 00:00:00 2001 From: jiachaoyang Date: Mon, 5 Feb 2024 10:35:30 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mongo-plus-annotation/pom.xml | 4 +- mongo-plus-boot-starter/pom.xml | 4 +- mongo-plus-core/pom.xml | 4 +- .../update/LambdaUpdateChainWrapper.java | 7 +--- .../anwen/mongo/execute/ExecutorFactory.java | 10 ++++- .../com/anwen/mongo/mapper/BaseMapper.java | 4 +- .../mongo/mapper/MongoPlusMapMapper.java | 1 - .../com/anwen/mongo/proxy/ExecutorProxy.java | 37 +++++++++++++++++++ .../anwen/mongo/toolkit/ChainWrappers.java | 4 +- mongo-plus-parent/pom.xml | 4 +- mongo-plus-solon-plugin/pom.xml | 4 +- 11 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java diff --git a/mongo-plus-annotation/pom.xml b/mongo-plus-annotation/pom.xml index 4cc4acad..a812b49d 100644 --- a/mongo-plus-annotation/pom.xml +++ b/mongo-plus-annotation/pom.xml @@ -105,7 +105,7 @@ - + diff --git a/mongo-plus-boot-starter/pom.xml b/mongo-plus-boot-starter/pom.xml index 0bb91ce3..fb30e75c 100644 --- a/mongo-plus-boot-starter/pom.xml +++ b/mongo-plus-boot-starter/pom.xml @@ -134,7 +134,7 @@ - + diff --git a/mongo-plus-core/pom.xml b/mongo-plus-core/pom.xml index ee768c0b..1b5f065f 100644 --- a/mongo-plus-core/pom.xml +++ b/mongo-plus-core/pom.xml @@ -127,7 +127,7 @@ - + diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java index b8d6a582..fa18a55b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java @@ -22,15 +22,12 @@ public class LambdaUpdateChainWrapper extends UpdateChainWrapper compareConditionList = new ArrayList<>(); - compareConditionList.addAll(getCompareList()); - compareConditionList.addAll(getUpdateCompareList()); - return factory.getExecute(database).update(compareConditionList,clazz); + return factory.getExecute(database).update(this,clazz); } @Override public boolean remove() { - return factory.getExecute(database).remove(getCompareList(),clazz); + return factory.getExecute(database).remove(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java index a7a6c4d3..88e28bef 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java @@ -8,12 +8,14 @@ import com.anwen.mongo.execute.instance.DefaultExecute; import com.anwen.mongo.execute.instance.SessionExecute; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.BaseProperty; +import com.anwen.mongo.proxy.ExecutorProxy; import com.anwen.mongo.toolkit.StringPool; import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.ClientSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Proxy; import java.util.Map; import java.util.Objects; @@ -68,10 +70,14 @@ public class ExecutorFactory { public AbstractExecute getExecute(CollectionManager collectionManager){ ClientSession clientSessionContext = MongoTransactionContext.getClientSessionContext(); + AbstractExecute abstractExecute; if (clientSessionContext != null) { - return new SessionExecute(collectionNameConvert,collectionManager,clientSessionContext); + abstractExecute = new SessionExecute(collectionNameConvert,collectionManager,clientSessionContext); + }else { + abstractExecute = new DefaultExecute(collectionNameConvert, collectionManager); } - return new DefaultExecute(collectionNameConvert,collectionManager); + Class clazz = abstractExecute.getClass(); + return (AbstractExecute) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),new ExecutorProxy(abstractExecute)); } public InjectAbstractExecute getInjectExecute(String database){ diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index 582308b7..1d4563ba 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -1,11 +1,9 @@ package com.anwen.mongo.mapper; -import com.anwen.mongo.service.impl.ServiceImpl; - /** * mapper层,待完善,占位 * * @author JiaChaoYang **/ -public class BaseMapper extends ServiceImpl { +public interface BaseMapper{ } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java index e57fac6b..152c2f9e 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java @@ -16,7 +16,6 @@ import com.mongodb.client.model.CreateIndexOptions; import com.mongodb.client.model.DropIndexOptions; import com.mongodb.client.model.IndexModel; import com.mongodb.client.model.IndexOptions; -import com.sun.xml.internal.ws.util.xml.CDATA; import org.bson.Document; import org.bson.conversions.Bson; 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 new file mode 100644 index 00000000..0d44ead2 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -0,0 +1,37 @@ +package com.anwen.mongo.proxy; + +import com.alibaba.fastjson.JSON; +import com.anwen.mongo.execute.Execute; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * 执行器代理 + * + * @author JiaChaoYang + * @project mongo-plus + * @date 2024-02-05 09:15 + **/ +public class ExecutorProxy implements InvocationHandler { + + Logger logger = LoggerFactory.getLogger(ExecutorProxy.class); + + private final Execute target; + + public ExecutorProxy(Execute target) { + this.target = target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + logger.info("目标:{}",proxy); + logger.info("方法:{}",method); + logger.info("参数:{}", JSON.toJSONString(args)); + Object invoke = method.invoke(target, args); + logger.info("执行结束"); + return invoke; + } +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java index 8e0c3fb7..127dbb5e 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java @@ -44,11 +44,11 @@ public final class ChainWrappers { } public static QueryChainWrapper> lambdaQueryChain(){ - return new QueryChainWrapper<>(); + return new QueryWrapper<>(); } public static QueryChainWrapper, InjectQueryWrapper> lambdaQueryChainInject(){ - return new QueryChainWrapper<>(); + return new InjectQueryWrapper(); } public static AggregateChainWrapper> lambdaAggregateChain(){ diff --git a/mongo-plus-parent/pom.xml b/mongo-plus-parent/pom.xml index b94818bb..5cdfc9fb 100644 --- a/mongo-plus-parent/pom.xml +++ b/mongo-plus-parent/pom.xml @@ -143,7 +143,7 @@ - + diff --git a/mongo-plus-solon-plugin/pom.xml b/mongo-plus-solon-plugin/pom.xml index 2f950005..1dcfdddc 100644 --- a/mongo-plus-solon-plugin/pom.xml +++ b/mongo-plus-solon-plugin/pom.xml @@ -118,7 +118,7 @@ - + -- Gitee From 48725cacc5e345859155360726ff7ef3712ac8cc Mon Sep 17 00:00:00 2001 From: jiachaoyang Date: Mon, 5 Feb 2024 17:42:03 +0800 Subject: [PATCH 12/20] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MongoPlusAutoConfiguration.java | 28 +- .../mongo/config/MongoPlusConfiguration.java | 45 +- .../LambdaAggregateChainWrapper.java | 13 +- .../LambdaAggregateChainInjectWrapper.java | 6 +- .../query/LambdaQueryChainInjectWrapper.java | 25 +- .../LambdaUpdateChainInjectWrapper.java | 4 +- .../query/LambdaQueryChainWrapper.java | 26 +- .../update/LambdaUpdateChainWrapper.java | 18 +- .../anwen/mongo/execute/AbstractExecute.java | 57 +- .../java/com/anwen/mongo/execute/Execute.java | 42 +- .../anwen/mongo/execute/ExecutorFactory.java | 156 +---- .../execute/inject/InjectAbstractExecute.java | 72 +- .../execute/instance/DefaultExecute.java | 102 +-- .../execute/instance/SessionExecute.java | 99 +-- .../anwen/mongo/manager/MongoPlusClient.java | 54 ++ .../com/anwen/mongo/mapper/BaseMapper.java | 108 ++- .../mongo/mapper/DefaultBaseMapperImpl.java | 629 ++++++++++++++++++ .../mongo/mapper/MongoPlusMapMapper.java | 24 +- .../com/anwen/mongo/proxy/ExecutorProxy.java | 5 +- .../anwen/mongo/service/impl/ServiceImpl.java | 190 ++++-- .../anwen/mongo/toolkit/ChainWrappers.java | 13 +- mongo-plus-parent/pom.xml | 2 +- .../config/MongoPlusAutoConfiguration.java | 10 +- 23 files changed, 1133 insertions(+), 595 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.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 77a87700..70e62f3f 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 @@ -13,6 +13,7 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.interceptor.business.BlockAttackInnerInterceptor; import com.anwen.mongo.interceptor.business.LogInterceptor; import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBLogProperty; import com.anwen.mongo.service.IService; @@ -42,31 +43,31 @@ import java.util.stream.Collectors; @EnableConfigurationProperties(MongoDBLogProperty.class) public class MongoPlusAutoConfiguration implements InitializingBean { - private final ExecutorFactory factory; - private final MongoPlusClient mongoPlusClient; private final ApplicationContext applicationContext; - private final MongoDBLogProperty mongoDBLogProperty; + private final MongoDBLogProperty mongodbLogProperty; - private final MongoDBCollectionProperty mongoDBCollectionProperty; + private final MongoDBCollectionProperty mongodbCollectionProperty; private final CollectionNameConvert collectionNameConvert; + private final BaseMapper baseMapper; + Logger logger = LoggerFactory.getLogger(MongoPlusAutoConfiguration.class); - public MongoPlusAutoConfiguration(MongoDBLogProperty mongoDBLogProperty, MongoDBCollectionProperty mongoDBCollectionProperty, ExecutorFactory factory, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { + public MongoPlusAutoConfiguration(MongoDBLogProperty mongodbLogProperty, MongoDBCollectionProperty mongodbCollectionProperty, BaseMapper baseMapper, MongoPlusClient mongoPlusClient, ApplicationContext applicationContext, CollectionNameConvert collectionNameConvert) { this.mongoPlusClient = mongoPlusClient; this.applicationContext = applicationContext; - this.mongoDBLogProperty = mongoDBLogProperty; - this.mongoDBCollectionProperty = mongoDBCollectionProperty; - this.factory = factory; + this.mongodbLogProperty = mongodbLogProperty; + this.mongodbCollectionProperty = mongodbCollectionProperty; this.collectionNameConvert = collectionNameConvert; setConversion(); setMetaObjectHandler(); setDocumentHandler(); setInterceptor(); + this.baseMapper = baseMapper; } @Override @@ -82,9 +83,8 @@ public class MongoPlusAutoConfiguration implements InitializingBean { serviceImpl.setClazz(clazz); String database = initFactory(clazz); //这里需要将MongoPlusClient给工厂 - factory.setMongoPlusClient(mongoPlusClient); serviceImpl.setDatabase(database); - serviceImpl.setFactory(factory); + serviceImpl.setBaseMapper(baseMapper); } public String initFactory(Class clazz) { @@ -103,11 +103,11 @@ public class MongoPlusAutoConfiguration implements InitializingBean { String database = mongoPlusClient.getBaseProperty().getDatabase(); Arrays.stream(database.split(",")).collect(Collectors.toList()).forEach(db -> { CollectionManager collectionManager = new CollectionManager(mongoPlusClient.getMongoClient(), collectionNameConvert, db); - ConnectMongoDB connectMongoDB = new ConnectMongoDB(mongoPlusClient.getMongoClient(), db, finalCollectionName); + ConnectMongoDB connectMongodb = new ConnectMongoDB(mongoPlusClient.getMongoClient(), db, finalCollectionName); MongoDatabase mongoDatabase = mongoPlusClient.getMongoClient().getDatabase(db); mongoDatabaseList.add(mongoDatabase); if (Objects.equals(db, finalDataBaseName[0])){ - MongoCollection collection = connectMongoDB.open(mongoDatabase); + MongoCollection collection = connectMongodb.open(mongoDatabase); collectionManager.setCollectionMap(finalCollectionName,collection); } put(db,collectionManager); @@ -170,10 +170,10 @@ public class MongoPlusAutoConfiguration implements InitializingBean { */ private void setInterceptor(){ List interceptors = new ArrayList<>(); - if (mongoDBLogProperty.getLog()){ + if (mongodbLogProperty.getLog()){ interceptors.add(new LogInterceptor()); } - if (mongoDBCollectionProperty.getBlockAttackInner()){ + if (mongodbCollectionProperty.getBlockAttackInner()){ interceptors.add(new BlockAttackInnerInterceptor()); } Collection interceptorCollection = applicationContext.getBeansOfType(Interceptor.class).values(); diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index a084acf1..c5eb36ed 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -2,10 +2,10 @@ package com.anwen.mongo.config; import com.anwen.mongo.cache.global.MongoPlusClientCache; import com.anwen.mongo.convert.CollectionNameConvert; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.interceptor.BaseInterceptor; import com.anwen.mongo.manager.MongoPlusClient; -import com.anwen.mongo.mapper.MongoPlusMapMapper; +import com.anwen.mongo.mapper.BaseMapper; +import com.anwen.mongo.mapper.DefaultBaseMapperImpl; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBConfigurationProperty; import com.anwen.mongo.property.MongoDBConnectProperty; @@ -16,15 +16,11 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; -import org.springframework.beans.factory.FactoryBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import java.util.Arrays; import java.util.Collections; -import java.util.stream.Collectors; /** * @author JiaChaoYang @@ -40,10 +36,10 @@ public class MongoPlusConfiguration { private final MongoDBConfigurationProperty mongoDBConfigurationProperty; - public MongoPlusConfiguration(MongoDBConnectProperty mongoDBConnectProperty, MongoDBCollectionProperty mongoDBCollectionProperty, MongoDBConfigurationProperty mongoDBConfigurationProperty) { - this.mongoDBConnectProperty = mongoDBConnectProperty; - this.mongoDBCollectionProperty = mongoDBCollectionProperty; - this.mongoDBConfigurationProperty = mongoDBConfigurationProperty; + public MongoPlusConfiguration(MongoDBConnectProperty mongodbConnectProperty, MongoDBCollectionProperty mongodbCollectionProperty, MongoDBConfigurationProperty mongodbConfigurationProperty) { + this.mongoDBConnectProperty = mongodbConnectProperty; + this.mongoDBCollectionProperty = mongodbCollectionProperty; + this.mongoDBConfigurationProperty = mongodbConfigurationProperty; } /** @@ -58,12 +54,19 @@ public class MongoPlusConfiguration { .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseInterceptor())).build()); } + @Bean + @ConditionalOnMissingBean(CollectionNameConvert.class) + public CollectionNameConvert collectionNameConvert(){ + return MongoCollectionUtils.build(mongoDBCollectionProperty.getMappingStrategy()); + } + @Bean @ConditionalOnMissingBean(MongoPlusClient.class) - public MongoPlusClient mongoPlusClient(MongoClient mongo){ + public MongoPlusClient mongoPlusClient(MongoClient mongo,CollectionNameConvert collectionNameConvert){ MongoPlusClient mongoPlusClient = new MongoPlusClient(); mongoPlusClient.setMongoClient(mongo); mongoPlusClient.setBaseProperty(mongoDBConnectProperty); + mongoPlusClient.setCollectionNameConvert(collectionNameConvert); MongoPlusClientCache.mongoPlusClient = mongoPlusClient; if (mongoDBConfigurationProperty.getBanner()){ System.out.println("___ ___ ______ _ \n" + @@ -79,26 +82,16 @@ public class MongoPlusConfiguration { } @Bean - @ConditionalOnMissingBean(CollectionNameConvert.class) - public CollectionNameConvert collectionNameConvert(){ - return MongoCollectionUtils.build(mongoDBCollectionProperty.getMappingStrategy()); - } - - @Bean - @ConditionalOnMissingBean - public ExecutorFactory factory(CollectionNameConvert collectionNameConvert,MongoPlusClient mongoPlusClient){ - return ExecutorFactory.builder() - .baseProperty(mongoDBConnectProperty) - .mongoPlusClient(mongoPlusClient) - .collectionNameConvert(collectionNameConvert) - .build(); + @ConditionalOnMissingBean(BaseMapper.class) + public BaseMapper baseMapper(MongoPlusClient mongoPlusClient){ + return new DefaultBaseMapperImpl(mongoPlusClient); } - @Bean("mongoPlusMapMapper") +/* @Bean("mongoPlusMapMapper") @ConditionalOnMissingBean public MongoPlusMapMapper mongoPlusMapMapper(ExecutorFactory factory) { return new MongoPlusMapMapper(factory); - } + }*/ @Bean("mongoTransactionalAspect") @ConditionalOnMissingBean diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java index a0717ecc..4c3b6957 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/aggregate/LambdaAggregateChainWrapper.java @@ -1,6 +1,6 @@ package com.anwen.mongo.conditions.aggregate; -import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.mapper.BaseMapper; import java.util.List; @@ -9,20 +9,17 @@ import java.util.List; **/ public class LambdaAggregateChainWrapper extends AggregateChainWrapper> implements ChainAggregate { - private final ExecutorFactory factory; - - private final String database; + private final BaseMapper baseMapper; private final Class clazz; - public LambdaAggregateChainWrapper(ExecutorFactory factory,Class clazz,String database) { - this.factory = factory; + public LambdaAggregateChainWrapper(BaseMapper baseMapper, Class clazz) { + this.baseMapper = baseMapper; this.clazz = clazz; - this.database = database; } @Override public List list() { - return factory.getExecute(database).aggregateList(this,clazz); + return baseMapper.aggregateList(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java index 68239b24..28314fd8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java @@ -26,7 +26,8 @@ public class LambdaAggregateChainInjectWrapper extends AggregateChainWrapper List list(String database, String collectionName, Class clazz) { - return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject(),clazz); +// return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject(),clazz); + return null; } @Override @@ -36,6 +37,7 @@ public class LambdaAggregateChainInjectWrapper extends AggregateChainWrapper> list(String database, String collectionName) { - return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject()); +// return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject()); + return null; } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java index eacb9b65..5d09b00b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java @@ -2,6 +2,7 @@ package com.anwen.mongo.conditions.inject.query; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; @@ -18,10 +19,10 @@ import static com.anwen.mongo.toolkit.StringPool.EMPTY; **/ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper, LambdaQueryChainInjectWrapper> implements ChainInject { - private final ExecutorFactory factory; + private final BaseMapper baseMapper; - public LambdaQueryChainInjectWrapper(ExecutorFactory factory) { - this.factory = factory; + public LambdaQueryChainInjectWrapper(BaseMapper baseMapper) { + this.baseMapper = baseMapper; } @Override @@ -31,7 +32,8 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> list(String database, String collectionName) { - return factory.getInjectExecute(database).list(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList()); +// return factory.getInjectExecute(database).list(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList()); + return null; } @Override @@ -41,7 +43,8 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper limitOne(String database, String collectionName) { - return factory.getInjectExecute(database).limitOne(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList(),getOrderList()); +// return factory.getInjectExecute(database).limitOne(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList(),getOrderList()); + return null; } @Override @@ -51,7 +54,8 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> page(String database, String collectionName, PageParam pageParam) { - return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize()); +// return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize()); + return null; } @Override @@ -61,7 +65,8 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> page(String database, String collectionName, Integer pageNum, Integer pageSize) { - return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageNum,pageSize); +// return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageNum,pageSize); + return null; } @Override @@ -71,7 +76,8 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper one(String database, String collectionName) { - return factory.getInjectExecute(database).one(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList()); +// return factory.getInjectExecute(database).one(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList()); + return null; } @Override @@ -81,6 +87,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper getUpdateCompareList() { return updateCompareList; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index cfd5bc36..7c3ae8c7 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -1,6 +1,7 @@ package com.anwen.mongo.conditions.query; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; @@ -13,56 +14,53 @@ import java.util.List; */ public class LambdaQueryChainWrapper extends QueryChainWrapper> implements ChainQuery { - private final ExecutorFactory factory; + private final BaseMapper baseMapper; private final Class clazz; - private final String database; - - public LambdaQueryChainWrapper(ExecutorFactory factory, Class clazz,String database){ - this.factory = factory; + public LambdaQueryChainWrapper(BaseMapper baseMapper, Class clazz){ + this.baseMapper = baseMapper; this.clazz = clazz; - this.database = database; } @Override public List list() { - return factory.getExecute(database).list(this,clazz); + return baseMapper.list(this,clazz); } @Override public T one() { - return factory.getExecute(database).one(this,clazz); + return baseMapper.one(this,clazz); } @Override public T limitOne() { - return factory.getExecute(database).limitOne(this,clazz); + return baseMapper.limitOne(this,clazz); } @Override public PageResult page(PageParam pageParam) { - return factory.getExecute(database).page(this,pageParam.getPageNum(),pageParam.getPageSize(),clazz); + return baseMapper.page(this,pageParam.getPageNum(),pageParam.getPageSize(),clazz); } @Override public PageResult page(Integer pageNum, Integer pageSize) { - return factory.getExecute(database).page(this,pageNum,pageSize,clazz); + return baseMapper.page(this,pageNum,pageSize,clazz); } @Override public PageResult page(PageParam pageParam, Integer recentPageNum) { - return factory.getExecute(database).page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum, clazz); + return baseMapper.page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum, clazz); } @Override public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { - return factory.getExecute(database).page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageNum, pageSize, recentPageNum, clazz); + return baseMapper.page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageNum, pageSize, recentPageNum, clazz); } @Override public long count() { - return factory.getExecute(database).count(this,clazz); + return baseMapper.count(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java index fa18a55b..c51f752f 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java @@ -1,33 +1,27 @@ package com.anwen.mongo.conditions.update; -import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.execute.ExecutorFactory; - -import java.util.ArrayList; -import java.util.List; +import com.anwen.mongo.mapper.BaseMapper; public class LambdaUpdateChainWrapper extends UpdateChainWrapper> implements ChainUpdate { - private final ExecutorFactory factory; + private final BaseMapper baseMapper; private final Class clazz; - private final String database; - - public LambdaUpdateChainWrapper(ExecutorFactory factory,Class clazz,String database) { - this.factory = factory; + public LambdaUpdateChainWrapper(BaseMapper baseMapper, Class clazz) { + this.baseMapper = baseMapper; this.clazz = clazz; - this.database = database; } @Override public boolean update(){ - return factory.getExecute(database).update(this,clazz); + return baseMapper.update(this,clazz); } @Override public boolean remove() { - return factory.getExecute(database).remove(this,clazz); + return baseMapper.remove(this,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index 1ad01908..bea5b982 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -17,7 +17,6 @@ import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.domain.MongoQueryException; import com.anwen.mongo.enums.AggregateOptionsEnum; import com.anwen.mongo.enums.IdTypeEnum; -import com.anwen.mongo.enums.QueryOperatorEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.model.*; import com.anwen.mongo.strategy.convert.ConversionService; @@ -29,6 +28,7 @@ import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; +import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.InsertOneResult; import javafx.util.Pair; import org.bson.Document; @@ -36,7 +36,6 @@ import org.bson.conversions.Bson; import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sun.security.ec.point.ProjectivePoint; import java.io.Serializable; import java.lang.reflect.Field; @@ -73,9 +72,9 @@ public abstract class AbstractExecute implements Execute { public boolean save(T entity){ try { Document document = processIdField(entity,false); - InsertOneResult insertOneResult = doSave(document, collectionManager.getCollection(ClassTypeUtil.getClass(entity))); + InsertManyResult insertManyResult = executeSave(Collections.singletonList(document), collectionManager.getCollection(ClassTypeUtil.getClass(entity))); setBackIdValue(document, entity); - return insertOneResult.wasAcknowledged(); + return insertManyResult.wasAcknowledged(); } catch (Exception e) { logger.error("save fail , error info : {}", e.getMessage(), e); return false; @@ -86,7 +85,7 @@ public abstract class AbstractExecute implements Execute { try { List documentList = processIdFieldList(entityList); MongoCollection collection = collectionManager.getCollection(entityList.iterator().next().getClass()); - return doSaveBatch(documentList,collection).getInsertedIds().size() == entityList.size(); + return executeSave(documentList,collection).getInsertedIds().size() == entityList.size(); } catch (Exception e) { logger.error("saveBatch fail , error info : {}", e.getMessage(), e); return false; @@ -121,7 +120,7 @@ public abstract class AbstractExecute implements Execute { writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); } }); - BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); + BulkWriteResult bulkWriteResult = executeBulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); } @@ -137,7 +136,7 @@ public abstract class AbstractExecute implements Execute { writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } }); - BulkWriteResult bulkWriteResult = bulkWrite(writeModelList, collectionManager.getCollection(clazz)); + BulkWriteResult bulkWriteResult = executeBulkWrite(writeModelList, collectionManager.getCollection(clazz)); return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); } @@ -158,7 +157,7 @@ public abstract class AbstractExecute implements Execute { Pair basicDBObjectPair = getUpdate(entity); writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); }); - BulkWriteResult bulkWriteResult = bulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); + BulkWriteResult bulkWriteResult = executeBulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); return bulkWriteResult.getModifiedCount() == entityList.size(); } @@ -183,10 +182,10 @@ public abstract class AbstractExecute implements Execute { } public Boolean removeById(Serializable id, Class clazz) { - return executeRemove( id, collectionManager.getCollection(clazz)); + return buildRemove( id, collectionManager.getCollection(clazz)); } - private Boolean executeRemove(Serializable id, MongoCollection collection) { + 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 executeRemove(filterId,collection).getDeletedCount() >= 1; } @@ -217,12 +216,12 @@ public abstract class AbstractExecute implements Execute { } public List list(Class clazz) { - return DocumentMapperConvert.mapDocumentList(doList(collectionManager.getCollection(clazz)),clazz); + return DocumentMapperConvert.mapDocumentList(executeQuery(null,null,null,collectionManager.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(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); + return lambdaOperate.getLambdaQueryResult(executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz),Document.class),clazz); } public List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz){ @@ -234,14 +233,14 @@ public abstract class AbstractExecute implements Execute { addAll(basicDBObjectList); }}; aggregateConditionList.sort(Comparator.comparingInt(AggregateBasicDBObject::getOrder)); - AggregateIterable aggregateIterable = doAggregateList(aggregateConditionList, collectionManager.getCollection(clazz)); + AggregateIterable aggregateIterable = executeAggregate(aggregateConditionList, collectionManager.getCollection(clazz),Document.class); aggregateOptions(aggregateIterable,optionsBasicDBObject); return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(),clazz); } public T one(QueryChainWrapper queryChainWrapper,Class clazz) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - List result = lambdaOperate.getLambdaQueryResult(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); + List result = lambdaOperate.getLambdaQueryResult(executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz),Document.class),clazz); if (result.size() > 1) { throw new MongoQueryException("query result greater than one line"); } @@ -250,40 +249,40 @@ public abstract class AbstractExecute implements Execute { public T limitOne(QueryChainWrapper queryChainWrapper,Class clazz) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - List result = lambdaOperate.getLambdaQueryResult(doList(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz)),clazz); + List result = lambdaOperate.getLambdaQueryResult(executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),collectionManager.getCollection(clazz),Document.class),clazz); return !result.isEmpty() ? result.get(0) : null; } public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize,Class clazz) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - FindIterable iterable = doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz)); + FindIterable iterable = executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz),Document.class); return lambdaOperate.getLambdaQueryResultPage(iterable,count(queryChainWrapper,clazz),new PageParam(pageNum,pageSize),clazz); } public PageResult page(List compareConditionList, List orderList,List projectionList,List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); - FindIterable iterable = doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz)); + FindIterable iterable = executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(clazz),Document.class); return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(compareConditionList,clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),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(doGetById(queryBasic,collectionManager.getCollection(clazz)).first(),clazz); + return DocumentMapperConvert.mapDocument(executeQuery(queryBasic,null,null,collectionManager.getCollection(clazz),Document.class).first(),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 executeExist(queryBasic, collectionManager.getCollection(clazz)) >= 1; + return executeCount(queryBasic,null, collectionManager.getCollection(clazz)) >= 1; } public boolean isExist(QueryChainWrapper queryChainWrapper,Class clazz){ BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - return executeExist(basicDBObject,collectionManager.getCollection(clazz)) >= 1; + return executeCount(basicDBObject,null,collectionManager.getCollection(clazz)) >= 1; } public List getByIds(Collection ids,Class clazz) { BasicDBObject basicDBObject = checkIdType(ids); - FindIterable iterable = doGetById(basicDBObject, collectionManager.getCollection(clazz)); + FindIterable iterable = executeQuery(basicDBObject,null,null, collectionManager.getCollection(clazz),Document.class); return DocumentMapperConvert.mapDocumentList(iterable, clazz); } @@ -310,7 +309,7 @@ public abstract class AbstractExecute implements Execute { } public long count(QueryChainWrapper queryChainWrapper,Class clazz){ - return executeCountByCondition(BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()),collectionManager.getCollection(clazz)); + return executeCount(BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()),null,collectionManager.getCollection(clazz)); } /** @@ -332,29 +331,29 @@ public abstract class AbstractExecute implements Execute { 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 = executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList), collectionManager.getCollection(clazz), countOptions); + long isExists = executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, collectionManager.getCollection(clazz)); //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 if (isExists == 0) { // 查询真实总条数 CountOptions countOptionsReal = new CountOptions(); countOptionsReal.limit(limitParam); - return executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList), collectionManager.getCollection(clazz), countOptionsReal); + return executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, collectionManager.getCollection(clazz)); } return limitParam; } public long count(Class clazz){ - return doCount(collectionManager.getCollection(clazz)); + return executeCount(null,null,collectionManager.getCollection(clazz)); } public List queryCommand(String command,Class clazz){ - FindIterable iterable = doQueryCommand(BasicDBObject.parse(command), collectionManager.getCollection(clazz)); + FindIterable iterable = executeQuery(BasicDBObject.parse(command),null,null, collectionManager.getCollection(clazz),Document.class); return lambdaOperate.getLambdaQueryResult(iterable,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(doGetByColumn(filter,collectionManager.getCollection(clazz)),clazz); + return DocumentMapperConvert.mapDocumentList(executeQuery(filter,null,null,collectionManager.getCollection(clazz),Document.class),clazz); } public String createIndex(Bson bson,Class clazz){ @@ -523,6 +522,10 @@ public abstract class AbstractExecute implements Execute { } protected void aggregateOptions(AggregateIterable aggregateIterable,BasicDBObject optionsBasicDBObject){ + options(aggregateIterable, optionsBasicDBObject); + } + + public static void options(AggregateIterable aggregateIterable, BasicDBObject optionsBasicDBObject) { Set keyedSet = optionsBasicDBObject.keySet(); for (String key : keyedSet) { AggregateOptionsEnum aggregateOptionsEnum = AggregateOptionsEnum.getByOptions(key); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java index 59ff2ade..a0311353 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java @@ -17,55 +17,25 @@ import org.bson.conversions.Bson; import java.util.List; /** - * 抽象的执行器 + * 执行器接口 * * @author JiaChaoYang **/ public interface Execute { - InsertOneResult doSave(Document document, MongoCollection collection); - - InsertManyResult doSaveBatch(List documentList, MongoCollection collection); - - BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection); + InsertManyResult executeSave(List documentList, MongoCollection collection); DeleteResult executeRemove(Bson filter, MongoCollection collection); - FindIterable doList(MongoCollection collection); - - FindIterable doList(MongoCollection collection,Class clazz); - - FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection); - - FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection,Class clazz); - - AggregateIterable doAggregateList(List aggregateConditionList,MongoCollection collection); - - AggregateIterable doAggregateList(List aggregateConditionList,MongoCollection collection,Class clazz); - - FindIterable doGetById(BasicDBObject queryBasic,MongoCollection collection); - - FindIterable doGetByIds(BasicDBObject queryBasic, MongoCollection collection, Class clazz); - - long executeExist(BasicDBObject queryBasic, MongoCollection collection); - UpdateResult executeUpdate(Bson queryBasic,Bson updateBasic,MongoCollection collection); - DeleteResult executeRemove(BasicDBObject deleteBasic,MongoCollection collection); - - long executeCountByCondition(BasicDBObject basicDBObject,MongoCollection collection); - - long executeCountByCondition(BasicDBObject basicDBObject,MongoCollection collection, CountOptions var2); - - long doCount(MongoCollection collection); - - FindIterable doQueryCommand(BasicDBObject basicDBObject,MongoCollection collection); + FindIterable executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection, Class clazz); - FindIterable doQueryCommand(BasicDBObject basicDBObject,MongoCollection collection,Class clazz); + AggregateIterable executeAggregate(List aggregateConditionList, MongoCollection collection, Class clazz); - FindIterable doGetByColumn(Bson filter,MongoCollection collection); + long executeCount(BasicDBObject queryBasic,CountOptions countOptions,MongoCollection collection); - FindIterable doGetByColumn(Bson filter,MongoCollection collection,Class clazz); + BulkWriteResult executeBulkWrite(List> writeModelList, MongoCollection collection); String doCreateIndex(Bson bson,MongoCollection collection); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java index 88e28bef..e6577f50 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java @@ -7,9 +7,10 @@ import com.anwen.mongo.execute.inject.InjectAbstractExecute; import com.anwen.mongo.execute.instance.DefaultExecute; import com.anwen.mongo.execute.instance.SessionExecute; import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.mapper.BaseMapper; +import com.anwen.mongo.mapper.DefaultBaseMapperImpl; import com.anwen.mongo.model.BaseProperty; import com.anwen.mongo.proxy.ExecutorProxy; -import com.anwen.mongo.toolkit.StringPool; import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.ClientSession; import org.slf4j.Logger; @@ -18,6 +19,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.Proxy; import java.util.Map; import java.util.Objects; +import java.util.Optional; import static com.anwen.mongo.toolkit.StringPool.EMPTY; @@ -31,61 +33,39 @@ public class ExecutorFactory { private final Logger logger = LoggerFactory.getLogger(ExecutorFactory.class); - /** - * 属性配置 - * @author JiaChaoYang - * @date 2023/12/28 10:59 - */ - private BaseProperty baseProperty; - - /** - * 集合名策略 - * @author JiaChaoYang - * @date 2023/12/28 11:44 - */ - private CollectionNameConvert collectionNameConvert; - - private MongoPlusClient mongoPlusClient; - /** * 获取执行器 * @author JiaChaoYang * @date 2023/12/28 14:49 */ - public AbstractExecute getExecute(String database) { - return getExecute(getCollectionManager(database)); - } - - public AbstractExecute getExecute(){ - return getExecute(getCollectionManager(EMPTY)); - } +/* public BaseMapper getBaseMapper(String database) { + return getBaseMapper(getCollectionManager(database)); + }*/ - public Execute getExecuteInterface(String database){ - return getExecute(getCollectionManager(database)); +/* public Execute getExecuteInterface(String database){ + return getBaseMapper(getCollectionManager(database)); } public Execute getExecuteInterface(){ - return getExecute(getCollectionManager(EMPTY)); - } + return getBaseMapper(getCollectionManager(EMPTY)); + }*/ - public AbstractExecute getExecute(CollectionManager collectionManager){ + public Execute getExecute(){ ClientSession clientSessionContext = MongoTransactionContext.getClientSessionContext(); - AbstractExecute abstractExecute; - if (clientSessionContext != null) { - abstractExecute = new SessionExecute(collectionNameConvert,collectionManager,clientSessionContext); - }else { - abstractExecute = new DefaultExecute(collectionNameConvert, collectionManager); - } - Class clazz = abstractExecute.getClass(); - return (AbstractExecute) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),new ExecutorProxy(abstractExecute)); + Execute execute = Optional.ofNullable(clientSessionContext) + .map(clientSession -> (Execute) new SessionExecute(clientSession)) + .orElseGet(DefaultExecute::new); + Class clazz = execute.getClass(); + return (Execute) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),new ExecutorProxy(execute)); + } - public InjectAbstractExecute getInjectExecute(String database){ +/* public InjectAbstractExecute getInjectExecute(String database){ CollectionManager collectionManager = getCollectionManager(database); - return new InjectAbstractExecute(collectionManager,getExecute(collectionManager)); - } + return new InjectAbstractExecute(collectionManager, getBaseMapper(collectionManager)); + }*/ - public CollectionManager getCollectionManager(String database){ +/* public CollectionManager getCollectionManager(String database){ Map managerMap = mongoPlusClient.getCollectionManager(); if (StringUtils.isBlank(database)){ database = managerMap.keySet().stream().findFirst().get(); @@ -97,7 +77,7 @@ public class ExecutorFactory { mongoPlusClient.getCollectionManager().put(database,collectionManager); } return collectionManager; - } + }*/ // /** // * 获取自定义执行器 @@ -123,100 +103,8 @@ public class ExecutorFactory { // } // } - public static ExecuteFactoryBuilder builder() { - return new ExecuteFactoryBuilder(); - } - - public BaseProperty getBaseProperty() { - return this.baseProperty; - } - - public CollectionNameConvert getCollectionNameConvert() { - return this.collectionNameConvert; - } - - public void setBaseProperty(BaseProperty baseProperty) { - this.baseProperty = baseProperty; - } - - public void setCollectionNameConvert(CollectionNameConvert collectionNameConvert) { - this.collectionNameConvert = collectionNameConvert; - } - - public void setMongoPlusClient(MongoPlusClient mongoPlusClient){ - this.mongoPlusClient = mongoPlusClient; - } - - public MongoPlusClient getMongoPlusClient(){ - return this.mongoPlusClient; - } - - protected boolean canEqual(Object other) { - return other instanceof ExecutorFactory; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof ExecutorFactory)) { - return false; - } - ExecutorFactory that = (ExecutorFactory) o; - return Objects.equals(logger, that.logger) && Objects.equals(getBaseProperty(), that.getBaseProperty()) && Objects.equals(getCollectionNameConvert(), that.getCollectionNameConvert()) && Objects.equals(getMongoPlusClient(), that.getMongoPlusClient()); - } - - @Override - public int hashCode() { - return Objects.hash(logger, getBaseProperty(), getCollectionNameConvert(), getMongoPlusClient()); - } - - @Override - public String toString() { - return "ExecutorFactory{" + - "baseProperty=" + baseProperty + - ", collectionNameConvert=" + collectionNameConvert + - ", mongoPlusClient=" + mongoPlusClient + - '}'; - } - - public ExecutorFactory(BaseProperty baseProperty, CollectionNameConvert collectionNameConvert, MongoPlusClient mongoPlusClient) { - this.baseProperty = baseProperty; - this.collectionNameConvert = collectionNameConvert; - this.mongoPlusClient = mongoPlusClient; - } - public ExecutorFactory() { } - public static class ExecuteFactoryBuilder { - private BaseProperty baseProperty; - private CollectionNameConvert collectionNameConvert; - - private MongoPlusClient mongoPlusClient; - - ExecuteFactoryBuilder() { - } - - public ExecuteFactoryBuilder baseProperty(BaseProperty baseProperty) { - this.baseProperty = baseProperty; - return this; - } - - public ExecuteFactoryBuilder collectionNameConvert(CollectionNameConvert collectionNameConvert) { - this.collectionNameConvert = collectionNameConvert; - return this; - } - - public ExecuteFactoryBuilder mongoPlusClient(MongoPlusClient mongoPlusClient){ - this.mongoPlusClient = mongoPlusClient; - return this; - } - - public ExecutorFactory build() { - return new ExecutorFactory(this.baseProperty, this.collectionNameConvert, mongoPlusClient); - } - } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java index 4cfc9c19..db7735f3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java @@ -12,6 +12,7 @@ import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.domain.MongoQueryException; import com.anwen.mongo.enums.AggregateOptionsEnum; import com.anwen.mongo.enums.SpecialConditionEnum; +import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.model.*; import com.anwen.mongo.toolkit.*; @@ -53,7 +54,7 @@ public class InjectAbstractExecute { public Boolean save(String collectionName, Map entityMap) { try { - return execute.doSave(DocumentUtil.handleMap(entityMap,true),collectionManager.getCollection(collectionName)).wasAcknowledged(); + return execute.executeSave(Collections.singletonList(DocumentUtil.handleMap(entityMap, true)),collectionManager.getCollection(collectionName)).wasAcknowledged(); } catch (Exception e) { logger.error("save fail , error info : {}", e.getMessage(), e); return false; @@ -63,7 +64,7 @@ public class InjectAbstractExecute { public Boolean saveBatch(String collectionName, Collection> entityList) { try { List documentList = DocumentUtil.handleMapList(entityList,true); - return execute.doSaveBatch(documentList, collectionManager.getCollection(collectionName)).getInsertedIds().size() == entityList.size(); + return execute.executeSave(documentList, collectionManager.getCollection(collectionName)).getInsertedIds().size() == entityList.size(); } catch (Exception e) { logger.error("saveBatch fail , error info : {}", e.getMessage(), e); return false; @@ -155,24 +156,24 @@ public class InjectAbstractExecute { } public List> list(String collectionName) { - return Converter.convertDocumentToMap(execute.doList(collectionManager.getCollection(collectionName), Map.class)); + return Converter.convertDocumentToMap(execute.executeQuery(null,null,null,collectionManager.getCollection(collectionName), Map.class)); } public List> list(String collectionName, List compareConditionList, List orderList, List projectionList, List basicDBObjectList) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); - FindIterable mapFindIterable = execute.doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class); + FindIterable mapFindIterable = execute.executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class); return Converter.convertDocumentToMap(mapFindIterable); } public PageResult> page(String collectionName, List compareConditionList, List orderList, List projectionList, List basicDBObjectList, Integer pageNum, Integer pageSize) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); - FindIterable mapFindIterable = execute.doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class); + FindIterable mapFindIterable = execute.executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class); return lambdaOperate.getLambdaQueryResultPage(mapFindIterable,count(collectionName,compareConditionList),new PageParam(pageNum,pageSize)); } public Map one(String collectionName, List compareConditionList,List projectionList,List basicDBObjectList) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, null, projectionList, basicDBObjectList); - List> result = Converter.convertDocumentToMap(execute.doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class)); + List> result = Converter.convertDocumentToMap(execute.executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class)); if (result.size() > 1) { throw new MongoQueryException("query result greater than one line"); } @@ -181,33 +182,33 @@ public class InjectAbstractExecute { public Map limitOne(String collectionName, List compareConditionList,List projectionList,List basicDBObjectList,List orderList) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, null, projectionList, basicDBObjectList); - List> result = Converter.convertDocumentToMap(execute.doList(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class)); + List> result = Converter.convertDocumentToMap(execute.executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), collectionManager.getCollection(collectionName), Map.class)); return !result.isEmpty() ? result.get(0) : new HashMap<>(); } public boolean isExist(String collectionName, Serializable id){ BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return execute.executeExist(queryBasic,collectionManager.getCollection(collectionName)) >= 1; + return execute.executeCount(queryBasic,null,collectionManager.getCollection(collectionName)) >= 1; } public boolean isExist(String collectionName,QueryChainWrapper queryChainWrapper){ BasicDBObject basicDBObject = BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()); - return execute.executeExist(basicDBObject,collectionManager.getCollection(collectionName)) >= 1; + return execute.executeCount(basicDBObject,null,collectionManager.getCollection(collectionName)) >= 1; } public List> getByColumn(String collectionName,String column,Object value){ Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); - return Converter.convertDocumentToMap(execute.doGetByColumn(filter,collectionManager.getCollection(collectionName),Map.class)); + return Converter.convertDocumentToMap(execute.executeQuery(filter,null,null,collectionManager.getCollection(collectionName),Map.class)); } public Map getById(String collectionName,Serializable id) { BasicDBObject queryBasic = new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.EQ.getCondition(), ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id)); - return execute.doGetById(queryBasic,collectionManager.getCollection(collectionName)).first(); + return execute.executeQuery(queryBasic,null,null,collectionManager.getCollection(collectionName),Map.class).first(); } public List> getByIds(String collectionName,Collection ids) { BasicDBObject basicDBObject = checkIdType(ids); - FindIterable iterable = execute.doGetByIds(basicDBObject, collectionManager.getCollection(collectionName),Map.class); + FindIterable iterable = execute.executeQuery(basicDBObject,null,null, collectionManager.getCollection(collectionName),Map.class); return Converter.convertDocumentToMap(iterable); } @@ -220,7 +221,7 @@ public class InjectAbstractExecute { public List> queryCommand(String collectionName,String sql){ BasicDBObject basicDBObject = BasicDBObject.parse(sql); - return Converter.convertDocumentToMap(execute.doQueryCommand(basicDBObject,collectionManager.getCollection(collectionName),Map.class)); + return Converter.convertDocumentToMap(execute.executeQuery(basicDBObject,null,null,collectionManager.getCollection(collectionName),Map.class)); } public Boolean update(String collectionName,List compareConditionList){ @@ -243,7 +244,7 @@ public class InjectAbstractExecute { } public long count(String collectionName,List compareConditionList){ - return execute.executeCountByCondition(BuildCondition.buildQueryCondition(compareConditionList),collectionManager.getCollection(collectionName)); + return execute.executeCount(BuildCondition.buildQueryCondition(compareConditionList),null,collectionManager.getCollection(collectionName)); } public List> aggregateList(String collectionName, List aggregateList, List basicDBObjectList, BasicDBObject optionsBasicDBObject){ @@ -252,7 +253,7 @@ public class InjectAbstractExecute { addAll(basicDBObjectList); }}; aggregateConditionList.sort(Comparator.comparingInt(AggregateBasicDBObject::getOrder)); - AggregateIterable aggregateIterable = execute.doAggregateList(aggregateConditionList, collectionManager.getCollection(collectionName), Map.class); + AggregateIterable aggregateIterable = execute.executeAggregate(aggregateConditionList, collectionManager.getCollection(collectionName), Map.class); aggregateOptions(aggregateIterable,optionsBasicDBObject); return Converter.convertDocumentToMap(aggregateIterable.iterator()); } @@ -263,13 +264,13 @@ public class InjectAbstractExecute { addAll(basicDBObjectList); }}; aggregateConditionList.sort(Comparator.comparingInt(AggregateBasicDBObject::getOrder)); - AggregateIterable aggregateIterable = execute.doAggregateList(aggregateConditionList, collectionManager.getCollection(collectionName)); + AggregateIterable aggregateIterable = execute.executeAggregate(aggregateConditionList, collectionManager.getCollection(collectionName),Document.class); aggregateOptions(aggregateIterable,optionsBasicDBObject); return DocumentMapperConvert.mapDocumentList(aggregateIterable.iterator(),clazz); } public long count(String collectionName){ - return execute.doCount(collectionManager.getCollection(collectionName)); + return execute.executeCount(null,null,collectionManager.getCollection(collectionName)); } public String createIndex(String collectionName,Bson bson){ @@ -318,42 +319,7 @@ public class InjectAbstractExecute { } protected void aggregateOptions(AggregateIterable aggregateIterable,BasicDBObject optionsBasicDBObject){ - Set keyedSet = optionsBasicDBObject.keySet(); - for (String key : keyedSet) { - AggregateOptionsEnum aggregateOptionsEnum = AggregateOptionsEnum.getByOptions(key); - switch (Objects.requireNonNull(aggregateOptionsEnum)){ - case ALLOW_DISK_USE: - aggregateIterable.allowDiskUse(optionsBasicDBObject.getBoolean(key)); - break; - case COLLATION: - aggregateIterable.collation((Collation) optionsBasicDBObject.get(key)); - break; - case BATCH_SIZE: - aggregateIterable.batchSize(optionsBasicDBObject.getInt(key)); - break; - case MAX_TIME_MS: - aggregateIterable.maxTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); - break; - case MAX_AWAIT_TIME_MS: - aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key),TimeUnit.MILLISECONDS); - break; - case BYPASS_DOCUMENT_VALIDATION: - aggregateIterable.bypassDocumentValidation(optionsBasicDBObject.getBoolean(key)); - break; - case COMMENT: - aggregateIterable.comment(String.valueOf(optionsBasicDBObject.get(key))); - break; - case COMMENT_STR: - aggregateIterable.comment(optionsBasicDBObject.getString(key)); - break; - case HINT: - aggregateIterable.hint((Bson) optionsBasicDBObject.get(key)); - break; - case LET: - aggregateIterable.let((Bson) optionsBasicDBObject.get(key)); - break; - } - } + AbstractExecute.options(aggregateIterable, optionsBasicDBObject); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java index 85c75b04..181c0a68 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java @@ -4,6 +4,7 @@ import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.execute.AbstractExecute; +import com.anwen.mongo.execute.Execute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; import com.mongodb.bulk.BulkWriteResult; @@ -19,6 +20,7 @@ import org.bson.Document; import org.bson.conversions.Bson; import java.util.List; +import java.util.Optional; /** * 默认执行器实例 @@ -27,25 +29,15 @@ import java.util.List; * @project mongo-plus * @date 2023-12-28 11:03 **/ -public class DefaultExecute extends AbstractExecute { - - - public DefaultExecute(CollectionNameConvert collectionNameConvert, CollectionManager collectionManager) { - super(collectionNameConvert, collectionManager); - } - - @Override - public InsertOneResult doSave(Document document, MongoCollection collection) { - return collection.insertOne(document); - } +public class DefaultExecute implements Execute { @Override - public InsertManyResult doSaveBatch(List documentList, MongoCollection collection) { + public InsertManyResult executeSave(List documentList, MongoCollection collection) { return collection.insertMany(documentList); } @Override - public BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection) { + public BulkWriteResult executeBulkWrite(List> writeModelList, MongoCollection collection) { return collection.bulkWrite(writeModelList); } @@ -55,48 +47,22 @@ public class DefaultExecute extends AbstractExecute { } @Override - public FindIterable doList(MongoCollection collection) { - return collection.find(); - } - - @Override - public FindIterable doList(MongoCollection collection, Class clazz) { - return collection.find(clazz); - } - - @Override - public FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection) { - return collection.find(basicDBObject).projection(projectionList).sort(sortCond); + public FindIterable executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection, Class clazz) { + return Optional.ofNullable(queryBasic) + .map(qb -> collection.find(qb,clazz)) + .orElseGet(() -> collection.find(clazz)) + .projection(projectionList) + .sort(sortCond); } @Override - public FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection, Class clazz) { - return collection.find(basicDBObject,clazz).projection(projectionList).sort(sortCond); - } - - @Override - public AggregateIterable doAggregateList(List aggregateConditionList, MongoCollection collection) { - return collection.aggregate(aggregateConditionList); - } - - @Override - public AggregateIterable doAggregateList(List aggregateConditionList, MongoCollection collection, Class clazz) { + public AggregateIterable executeAggregate(List aggregateConditionList, MongoCollection collection, Class clazz) { return collection.aggregate(aggregateConditionList, clazz); } @Override - public FindIterable doGetById(BasicDBObject queryBasic, MongoCollection collection) { - return collection.find(queryBasic); - } - - @Override - public FindIterable doGetByIds(BasicDBObject queryBasic, MongoCollection collection, Class clazz) { - return collection.find(queryBasic,clazz); - } - - @Override - public long executeExist(BasicDBObject queryBasic, MongoCollection collection) { - return collection.countDocuments(queryBasic); + public long executeCount(BasicDBObject queryBasic, CountOptions countOptions, MongoCollection collection) { + return Optional.ofNullable(countOptions).map(co -> collection.countDocuments(queryBasic,co)).orElseGet(() -> collection.countDocuments(queryBasic)); } @Override @@ -104,46 +70,6 @@ public class DefaultExecute extends AbstractExecute { return collection.updateMany(queryBasic,updateBasic); } - @Override - public DeleteResult executeRemove(BasicDBObject deleteBasic, MongoCollection collection) { - return collection.deleteMany(deleteBasic); - } - - @Override - public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.countDocuments(basicDBObject); - } - - @Override - public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection, CountOptions var2) { - return collection.countDocuments(basicDBObject, var2); - } - - @Override - public long doCount(MongoCollection collection) { - return collection.countDocuments(); - } - - @Override - public FindIterable doQueryCommand(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.find(basicDBObject); - } - - @Override - public FindIterable doQueryCommand(BasicDBObject basicDBObject, MongoCollection collection, Class clazz) { - return collection.find(basicDBObject,clazz); - } - - @Override - public FindIterable doGetByColumn(Bson filter, MongoCollection collection) { - return collection.find(filter); - } - - @Override - public FindIterable doGetByColumn(Bson filter, MongoCollection collection, Class clazz) { - return collection.find(filter,clazz); - } - @Override public String doCreateIndex(Bson bson, MongoCollection collection) { return collection.createIndex(bson); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index ce7acd14..68b1c00d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -4,6 +4,7 @@ import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.execute.AbstractExecute; +import com.anwen.mongo.execute.Execute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; import com.mongodb.bulk.BulkWriteResult; @@ -20,6 +21,7 @@ import org.bson.Document; import org.bson.conversions.Bson; import java.util.List; +import java.util.Optional; /** * session实例 @@ -28,27 +30,21 @@ import java.util.List; * @project mongo-plus * @date 2023-12-28 11:03 **/ -public class SessionExecute extends AbstractExecute { +public class SessionExecute implements Execute { private final ClientSession clientSession; - public SessionExecute(CollectionNameConvert collectionNameConvert, CollectionManager collectionManager, ClientSession clientSession) { - super(collectionNameConvert, collectionManager); + public SessionExecute(ClientSession clientSession) { this.clientSession = clientSession; } @Override - public InsertOneResult doSave(Document document, MongoCollection collection) { - return collection.insertOne(clientSession,document); - } - - @Override - public InsertManyResult doSaveBatch(List documentList, MongoCollection collection) { + public InsertManyResult executeSave(List documentList, MongoCollection collection) { return collection.insertMany(clientSession,documentList); } @Override - public BulkWriteResult bulkWrite(List> writeModelList, MongoCollection collection) { + public BulkWriteResult executeBulkWrite(List> writeModelList, MongoCollection collection) { return collection.bulkWrite(clientSession,writeModelList); } @@ -58,47 +54,22 @@ public class SessionExecute extends AbstractExecute { } @Override - public FindIterable doList(MongoCollection collection) { - return collection.find(clientSession); - } - - @Override - public FindIterable doList(MongoCollection collection, Class clazz) { - return collection.find(clientSession,clazz); - } - - @Override - public FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection) { - return collection.find(clientSession,basicDBObject).projection(projectionList).sort(sortCond); - } - - @Override - public FindIterable doList(BasicDBObject basicDBObject, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection, Class clazz) { - return collection.find(clientSession,basicDBObject,clazz).projection(projectionList).sort(sortCond); - } - - @Override - public AggregateIterable doAggregateList(List aggregateConditionList, MongoCollection collection) { - return collection.aggregate(clientSession,aggregateConditionList); + public FindIterable executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection, Class clazz) { + return Optional.ofNullable(queryBasic) + .map(qb -> collection.find(clientSession,qb,clazz)) + .orElseGet(() -> collection.find(clientSession,clazz)) + .projection(projectionList) + .sort(sortCond); } @Override - public AggregateIterable doAggregateList(List aggregateConditionList, MongoCollection collection, Class clazz) { + public AggregateIterable executeAggregate(List aggregateConditionList, MongoCollection collection, Class clazz) { return collection.aggregate(clientSession,aggregateConditionList, clazz); } - @Override - public FindIterable doGetById(BasicDBObject queryBasic, MongoCollection collection) { - return collection.find(clientSession,queryBasic); - } @Override - public FindIterable doGetByIds(BasicDBObject queryBasic, MongoCollection collection, Class clazz) { - return collection.find(clientSession,queryBasic,clazz); - } - - @Override - public long executeExist(BasicDBObject queryBasic, MongoCollection collection) { - return collection.countDocuments(clientSession,queryBasic); + public long executeCount(BasicDBObject queryBasic, CountOptions countOptions, MongoCollection collection) { + return Optional.ofNullable(countOptions).map(co -> collection.countDocuments(clientSession, queryBasic,co)).orElseGet(() -> collection.countDocuments(clientSession, queryBasic)); } @Override @@ -106,46 +77,6 @@ public class SessionExecute extends AbstractExecute { return collection.updateMany(clientSession,queryBasic,updateBasic); } - @Override - public DeleteResult executeRemove(BasicDBObject deleteBasic, MongoCollection collection) { - return collection.deleteMany(clientSession,deleteBasic); - } - - @Override - public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.countDocuments(clientSession,basicDBObject); - } - - @Override - public long executeCountByCondition(BasicDBObject basicDBObject, MongoCollection collection, CountOptions var2) { - return collection.countDocuments(clientSession, basicDBObject, var2); - } - - @Override - public long doCount(MongoCollection collection) { - return collection.countDocuments(clientSession); - } - - @Override - public FindIterable doQueryCommand(BasicDBObject basicDBObject, MongoCollection collection) { - return collection.find(clientSession,basicDBObject); - } - - @Override - public FindIterable doQueryCommand(BasicDBObject basicDBObject, MongoCollection collection, Class clazz) { - return collection.find(clientSession,basicDBObject,clazz); - } - - @Override - public FindIterable doGetByColumn(Bson filter, MongoCollection collection) { - return collection.find(clientSession,filter); - } - - @Override - public FindIterable doGetByColumn(Bson filter, MongoCollection collection, Class clazz) { - return collection.find(clientSession,filter,clazz); - } - @Override public String doCreateIndex(Bson bson, MongoCollection collection) { return collection.createIndex(clientSession,bson); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/manager/MongoPlusClient.java b/mongo-plus-core/src/main/java/com/anwen/mongo/manager/MongoPlusClient.java index 116972c4..ce33ffaf 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/manager/MongoPlusClient.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/manager/MongoPlusClient.java @@ -1,9 +1,14 @@ package com.anwen.mongo.manager; +import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.conn.CollectionManager; +import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.model.BaseProperty; +import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +import org.bson.Document; import java.util.List; import java.util.Map; @@ -28,10 +33,59 @@ public class MongoPlusClient { */ private Map collectionManager; + private CollectionNameConvert collectionNameConvert; + + public CollectionNameConvert getCollectionNameConvert() { + return collectionNameConvert; + } + + public void setCollectionNameConvert(CollectionNameConvert collectionNameConvert) { + this.collectionNameConvert = collectionNameConvert; + } + public Map getCollectionManager() { return collectionManager; } + public MongoCollection getCollection(Class clazz){ + return getCollectionManager(clazz).getCollection(clazz); + } + + public MongoCollection getCollection(Class clazz,String collectionName){ + return getCollectionManager(clazz).getCollection(collectionName); + } + + public MongoCollection getCollection(String database,String collectionName){ + return getCollectionManager(database).getCollection(collectionName); + } + + public MongoCollection getCollection(String database,Class clazz){ + return getCollectionManager(database).getCollection(clazz); + } + + public CollectionManager getCollectionManager(Class clazz){ + String database = ""; + CollectionName collectionName = clazz.getAnnotation(CollectionName.class); + if (collectionName != null){ + database = collectionName.database(); + } + return getCollectionManager(database); + } + + public CollectionManager getCollectionManager(String database){ + Map managerMap = getCollectionManager(); + if (StringUtils.isBlank(database)){ + database = managerMap.keySet().stream().findFirst().get(); + } + CollectionManager collectionManager = managerMap.get(database); + if (null == collectionManager){ + collectionManager = new CollectionManager(getMongoClient(), collectionNameConvert, database); + getMongoDatabase().add(getMongoClient().getDatabase(database)); + getCollectionManager().put(database,collectionManager); + } + return collectionManager; + } + public void setCollectionManager(Map collectionManager) { this.collectionManager = collectionManager; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index 1d4563ba..ea5765a7 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -1,9 +1,113 @@ package com.anwen.mongo.mapper; +import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; +import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; +import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; +import com.anwen.mongo.conditions.interfaces.condition.Order; +import com.anwen.mongo.conditions.query.QueryChainWrapper; +import com.anwen.mongo.conditions.update.UpdateChainWrapper; +import com.anwen.mongo.execute.Execute; +import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.model.PageResult; +import com.mongodb.BasicDBObject; +import com.mongodb.client.model.*; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + + /** - * mapper层,待完善,占位 - * + * mapper层 + * TODO 名称待定,方法留CRUD * @author JiaChaoYang **/ public interface BaseMapper{ + + MongoPlusClient getMongoPlusClient(); + + default Execute getExecute(){ + return new ExecutorFactory().getExecute(); + } + + Document processIdField(T entity,Boolean skip); + + boolean save(T entity); + + Boolean saveBatch(Collection entityList); + + Long update(Bson queryBasic,Bson updateBasic,Class clazz); + + Integer bulkWrite(List> writeModelList,Class clazz); + + Boolean update(T entity,QueryChainWrapper queryChainWrapper); + + Boolean updateByColumn(T entity, String column); + + Boolean removeByColumn(String column, Object value,Class clazz); + + List list(Class clazz); + + List list(QueryChainWrapper queryChainWrapper, Class clazz); + + List aggregateList(AggregateChainWrapper queryChainWrapper, Class clazz); + + T one(QueryChainWrapper queryChainWrapper,Class clazz); + + T limitOne(QueryChainWrapper queryChainWrapper,Class clazz); + + PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz); + + PageResult page(List compareConditionList, List orderList, List projectionList, List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz); + + T getById(Serializable id,Class clazz); + + boolean isExist(Serializable id,Class clazz); + + boolean isExist(QueryChainWrapper queryChainWrapper,Class clazz); + + List getByIds(Collection ids,Class clazz); + + Boolean update(UpdateChainWrapper updateChainWrapper, Class clazz); + + Boolean remove(UpdateChainWrapper updateChainWrapper, Class clazz); + + Long remove(Bson filter,Class clazz); + + long count(QueryChainWrapper queryChainWrapper,Class clazz); + + long recentPageCount(List compareConditionList,Class clazz, Integer pageNum, Integer pageSize, Integer recentPageNum); + + long count(Class clazz); + + List queryCommand(String command,Class clazz); + + List getByColumn(String column,Object value,Class clazz); + + String createIndex(Bson bson,Class clazz); + + String createIndex(Bson bson, IndexOptions indexOptions, Class clazz); + + List createIndexes(List indexes,Class clazz); + + + List createIndexes(List indexes, CreateIndexOptions createIndexOptions,Class clazz); + + List listIndexes(Class clazz); + + void dropIndex(String indexName,Class clazz); + + void dropIndex(String indexName,DropIndexOptions dropIndexOptions,Class clazz); + + void dropIndex(Bson keys,Class clazz); + + void dropIndex(Bson keys,DropIndexOptions dropIndexOptions,Class clazz); + + void dropIndexes(Class clazz); + + void dropIndexes(DropIndexOptions dropIndexOptions,Class clazz); + } 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 new file mode 100644 index 00000000..6ce46064 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/DefaultBaseMapperImpl.java @@ -0,0 +1,629 @@ +package com.anwen.mongo.mapper; + +import com.anwen.mongo.annotation.ID; +import com.anwen.mongo.cache.global.HandlerCache; +import com.anwen.mongo.conditions.BuildCondition; +import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; +import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; +import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; +import com.anwen.mongo.conditions.interfaces.condition.Order; +import com.anwen.mongo.conditions.query.QueryChainWrapper; +import com.anwen.mongo.conditions.update.UpdateChainWrapper; +import com.anwen.mongo.constant.SqlOperationConstant; +import com.anwen.mongo.context.MongoTransactionContext; +import com.anwen.mongo.convert.CollectionNameConvert; +import com.anwen.mongo.convert.DocumentMapperConvert; +import com.anwen.mongo.domain.MongoQueryException; +import com.anwen.mongo.enums.AggregateOptionsEnum; +import com.anwen.mongo.enums.IdTypeEnum; +import com.anwen.mongo.enums.SpecialConditionEnum; +import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.model.*; +import com.anwen.mongo.strategy.convert.ConversionService; +import com.anwen.mongo.support.SFunction; +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.*; +import com.mongodb.client.result.InsertManyResult; +import javafx.util.Pair; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.bson.types.ObjectId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import static com.anwen.mongo.toolkit.BeanMapUtilByReflect.getIdField; + +/** + * baseMapper默认实现 + * + * @author JiaChaoYang + * @project mongo-plus + * @date 2024-02-05 11:47 + **/ +public class DefaultBaseMapperImpl implements BaseMapper { + private final Logger logger = LoggerFactory.getLogger(DefaultBaseMapperImpl.class); + + private final CollectionNameConvert collectionNameConvert; + + private final MongoPlusClient mongoPlusClient; + + private final LambdaOperate lambdaOperate = new LambdaOperate(); + + private final ExecutorFactory factory = new ExecutorFactory(); + + public DefaultBaseMapperImpl(MongoPlusClient mongoPlusClient) { + this.collectionNameConvert = mongoPlusClient.getCollectionNameConvert(); + this.mongoPlusClient = mongoPlusClient; + } + + @Override + public MongoPlusClient getMongoPlusClient() { + return mongoPlusClient; + } + + @Override + public boolean save(T entity){ + try { + Document document = processIdField(entity,false); + InsertManyResult insertManyResult = factory.getExecute().executeSave(Collections.singletonList(document), mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))); + setBackIdValue(document, entity); + return insertManyResult.wasAcknowledged(); + } catch (Exception e) { + logger.error("save fail , error info : {}", e.getMessage(), e); + return false; + } + } + + @Override + public Boolean saveBatch(Collection entityList) { + try { + List documentList = processIdFieldList(entityList); + MongoCollection collection = mongoPlusClient.getCollection(entityList.iterator().next().getClass()); + InsertManyResult insertManyResult = factory.getExecute().executeSave(documentList, collection); + return insertManyResult.getInsertedIds().size() == entityList.size(); + } catch (Exception e) { + logger.error("saveBatch fail , error info : {}", e.getMessage(), e); + return false; + } + } + + @Override + public Long update(Bson queryBasic, Bson updateBasic, Class clazz) { + return factory.getExecute().executeUpdate( + queryBasic, + updateBasic, + mongoPlusClient.getCollection(clazz) + ).getModifiedCount(); + } + + @Override + public Boolean saveOrUpdateWrapper(T entity,QueryChainWrapper queryChainWrapper){ + long count = count(queryChainWrapper, entity.getClass()); + if (count > 0){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return factory.getExecute().executeUpdate(updatePair.getKey(),updatePair.getValue(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; + } + return save(entity); + } + + @Override + public Boolean saveOrUpdateBatch(Collection entityList) { + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); + if (StringUtils.isBlank(idByEntity)){ + writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); + } else { + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + } + }); + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(entityList.stream().findFirst().get().getClass())); + return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); + } + + @Override + public Integer bulkWrite(List> writeModelList, Class clazz) { + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(clazz)); + return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); + } + + @Override + public Boolean saveOrUpdateBatchWrapper(Collection entityList,QueryChainWrapper queryChainWrapper){ + Class clazz = entityList.stream().findFirst().get().getClass(); + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + long count = count(queryChainWrapper, clazz); + if (count > 0){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); + } else { + writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); + } + }); + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); + return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); + } + + @Override + public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return factory.getExecute().executeUpdate(updatePair.getKey(),updatePair.getValue(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; + } + + @Override + public Boolean updateById(T entity) { + Pair basicDBObjectPair = getUpdate(entity); + MongoCollection collection = mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity)); + return factory.getExecute().executeUpdate(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),collection).getModifiedCount() >= 1; + } + + @Override + public Boolean updateBatchByIds(Collection entityList) { + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + }); + BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(entityList.stream().findFirst().get().getClass())); + return bulkWriteResult.getModifiedCount() == entityList.size(); + } + + @Override + public Boolean updateByColumn(T entity, SFunction column) { + return updateByColumn(entity,column.getFieldNameLine()); + } + + @Override + public Boolean updateByColumn(T entity, String 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); + MongoCollection collection = mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity)); + return factory.getExecute().executeUpdate(filter,document,collection).getModifiedCount() >= 1; + } + + @Override + public Boolean removeById(Serializable id, Class clazz) { + return buildRemove( id, mongoPlusClient.getCollection(clazz)); + } + + 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; + } + + @Override + public Boolean removeByColumn(SFunction column, Object value,Class clazz) { + return removeByColumn(column.getFieldNameLine(),value,clazz); + } + + @Override + public Boolean removeByColumn(String column, Object value,Class clazz) { + return executeRemoveByColumn(column,value,mongoPlusClient.getCollection(clazz)); + } + + 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; + } + + @Override + public Boolean removeBatchByIds(Collection idList,Class clazz) { + return executeRemoveBatchByIds(idList,mongoPlusClient.getCollection(clazz)); + } + + 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; + } + + @Override + public List list(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); + } + + @Override + 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()))); + 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); + } + + @Override + public T one(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + List result = lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); + if (result.size() > 1) { + throw new MongoQueryException("query result greater than one line"); + } + return !result.isEmpty() ? result.get(0) : null; + } + + @Override + public T limitOne(QueryChainWrapper queryChainWrapper,Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); + List result = lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); + return !result.isEmpty() ? result.get(0) : null; + } + + @Override + public PageResult page(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); + return lambdaOperate.getLambdaQueryResultPage(iterable,count(queryChainWrapper,clazz),new PageParam(pageNum,pageSize),clazz); + } + + @Override + public PageResult page(List compareConditionList, List orderList,List projectionList,List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { + BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz),Document.class); + return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(compareConditionList,clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),clazz); + } + + @Override + 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); + } + + @Override + 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; + } + + @Override + public boolean isExist(QueryChainWrapper queryChainWrapper,Class 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) { + BasicDBObject basicDBObject = checkIdType(ids); + 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) { + 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)){ + append(SpecialConditionEnum.SET.getCondition(), BuildCondition.buildUpdateValue(setConditionList)); + } + if (CollUtil.isNotEmpty(pushConditionList)){ + append(SpecialConditionEnum.PUSH.getCondition(), BuildCondition.buildPushUpdateValue(pushConditionList)); + } + }}; + 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; + } + + @Override + public Long remove(Bson filter, Class clazz) { + return factory.getExecute().executeRemove(filter,mongoPlusClient.getCollection(clazz)).getDeletedCount(); + } + + @Override + public long count(QueryChainWrapper queryChainWrapper,Class clazz){ + return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()),null,mongoPlusClient.getCollection(clazz)); + } + + /** + * 分页查询 查询总条数 + * @param compareConditionList 条件集合 + * @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){ + if (recentPageNum == null || !(recentPageNum <= 50 && recentPageNum >= 5)) { + // 返回-1 表示不查询总条数 + return -1L; + } + //分页查询 不查询实际总条数 需要单独查询 是否有数据 + //如果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)); + //如果查询结果为空 则查询总条数,如果不为空则 limitParam为总条数 + if (isExists == 0) { + // 查询真实总条数 + CountOptions countOptionsReal = new CountOptions(); + countOptionsReal.limit(limitParam); + return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(compareConditionList),countOptions, mongoPlusClient.getCollection(clazz)); + } + return limitParam; + } + + @Override + public long count(Class clazz){ + return factory.getExecute().executeCount(null,null,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); + } + + @Override + 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); + } + + @Override + 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)); + } + + @Override + 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)); + } + + @Override + 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)); + } + + @Override + 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)); + } + + @Override + public void dropIndex(Bson keys,DropIndexOptions dropIndexOptions,Class clazz){ + factory.getExecute().doDropIndex(keys,dropIndexOptions,mongoPlusClient.getCollection(clazz)); + } + + @Override + 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)); + } + + protected Pair getUpdate(T entity){ + Document document = DocumentUtil.checkUpdateField(entity,false); + BasicDBObject filter = ExecuteUtil.getFilter(document); + BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new Pair<>(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()); + return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); + } + + protected Pair getUpdateCondition(List compareConditionList, T entity){ + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); + Document document = DocumentUtil.checkUpdateField(entity,false); + document.remove(SqlOperationConstant._ID); + BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new Pair<>(queryBasic,updateField); + } + + @Override + public Document processIdField(T entity,Boolean skip){ + Document tableFieldMap = DocumentUtil.checkTableField(entity); + fillId(entity, tableFieldMap); + if (HandlerCache.documentHandler != null && !skip){ + //经过一下Document处理器 + tableFieldMap = HandlerCache.documentHandler.insertInvoke(Collections.singletonList(tableFieldMap)).get(0); + } + return tableFieldMap; + } + + protected Integer getAutoId(Class clazz) { + String collectionName = collectionNameConvert.convert(clazz); + // 每个Collection单独加锁 + synchronized (collectionName.intern()) { + 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))); + int finalNum = 1; + if (document == null) { + Map map = new HashMap<>(); + map.put(SqlOperationConstant._ID, collectionNameConvert.convert(clazz)); + map.put(SqlOperationConstant.AUTO_NUM, finalNum); + collection.insertOne(new Document(map)); + } else { + finalNum = Integer.parseInt(String.valueOf(document.get(SqlOperationConstant.AUTO_NUM))); + } + return finalNum; + } + } + + protected void fillId(T entity, Document document) { + // 用户自行设置了id字段 + if (document.containsKey(SqlOperationConstant._ID)) { + // 检查一边id的入库类型 + Object idObj = document.get(SqlOperationConstant._ID); + if (ObjectId.isValid(String.valueOf(idObj)) && !idObj.getClass().equals(ObjectId.class)) { + document.put(SqlOperationConstant._ID, new ObjectId(String.valueOf(idObj))); + } + return; + } + java.lang.reflect.Field idField = getIdField(ClassTypeUtil.getClass(entity)); + // 没有指定id字段 + if (idField == null) { + return; + } + ID annotation = idField.getAnnotation(ID.class); + Object _idValue; + if (annotation.type() == IdTypeEnum.AUTO) { + _idValue = getAutoId(ClassTypeUtil.getClass(entity)); + } else { + if (annotation.type() == IdTypeEnum.OBJECT_ID){ + return; + } + _idValue = Generate.generateId(annotation.type()); + } + try { + 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); + } + } 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); + throw new RuntimeException(e); + } + } + + protected void setBackIdValue(Document document, T entity) { + Object idValue = document.get(SqlOperationConstant._ID); + if (idValue == null) { + return; + } + Field idField = getIdField(ClassTypeUtil.getClass(entity)); + if (idField == null) { + return; + } + if (ReflectionUtils.getFieldValue(entity, idField) != null) { + return; + } + try { + //使用策略转换器回写id + ConversionService.setValue(idField,entity,idValue); + } catch (Exception e) { + logger.error("set back id field value error, error message: {}", e.getMessage()); + } + } + + protected void ifPresentOrElse(T value, Consumer action, Runnable emptyAction) { + if (value != null) { + action.accept(value); + } else { + emptyAction.run(); + } + } + + 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){ + options(aggregateIterable, optionsBasicDBObject); + } + + public static void options(AggregateIterable aggregateIterable, BasicDBObject optionsBasicDBObject) { + Set keyedSet = optionsBasicDBObject.keySet(); + for (String key : keyedSet) { + AggregateOptionsEnum aggregateOptionsEnum = AggregateOptionsEnum.getByOptions(key); + switch (Objects.requireNonNull(aggregateOptionsEnum)){ + case ALLOW_DISK_USE: + aggregateIterable.allowDiskUse(optionsBasicDBObject.getBoolean(key)); + break; + case COLLATION: + aggregateIterable.collation((Collation) optionsBasicDBObject.get(key)); + break; + case BATCH_SIZE: + aggregateIterable.batchSize(optionsBasicDBObject.getInt(key)); + break; + case MAX_TIME_MS: + aggregateIterable.maxTime(optionsBasicDBObject.getLong(key), TimeUnit.MILLISECONDS); + break; + case MAX_AWAIT_TIME_MS: + aggregateIterable.maxAwaitTime(optionsBasicDBObject.getLong(key),TimeUnit.MILLISECONDS); + break; + case BYPASS_DOCUMENT_VALIDATION: + aggregateIterable.bypassDocumentValidation(optionsBasicDBObject.getBoolean(key)); + break; + case COMMENT: + aggregateIterable.comment(String.valueOf(optionsBasicDBObject.get(key))); + break; + case COMMENT_STR: + aggregateIterable.comment(optionsBasicDBObject.getString(key)); + break; + case HINT: + aggregateIterable.hint((Bson) optionsBasicDBObject.get(key)); + break; + case LET: + aggregateIterable.let((Bson) optionsBasicDBObject.get(key)); + break; + } + } + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java index 152c2f9e..b687e69a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java @@ -1,3 +1,4 @@ +/* package com.anwen.mongo.mapper; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; @@ -9,6 +10,7 @@ import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; import com.mongodb.client.MongoCollection; @@ -27,30 +29,39 @@ import java.util.Map; import static com.anwen.mongo.toolkit.StringPool.EMPTY; +*/ /** * @author JiaChaoYang - **/ + **//* + public class MongoPlusMapMapper implements InjectQuery { private final ExecutorFactory factory; - public MongoPlusMapMapper(ExecutorFactory factory) { + private final MongoPlusClient mongoPlusClient; + + public MongoPlusMapMapper(ExecutorFactory factory, MongoPlusClient mongoPlusClient) { this.factory = factory; + this.mongoPlusClient = mongoPlusClient; } - /** + */ +/** * 获取当前操作对象的连接,以便使用MongoDriver的语法 * @author JiaChaoYang * @date 2023/11/15 13:43 - */ + *//* + public MongoCollection getMongoCollection(String database,String collectionName){ return factory.getCollectionManager(database).getCollection(collectionName); } - /** + */ +/** * 获取当前操作对象的连接,以便使用MongoDriver的语法 * @author JiaChaoYang * @date 2023/11/15 13:43 - */ + *//* + public MongoCollection getMongoCollection(String collectionName){ return factory.getCollectionManager(EMPTY).getCollection(collectionName); } @@ -490,3 +501,4 @@ public class MongoPlusMapMapper implements InjectQuery { return factory.getInjectExecute(database).count(collectionName); } } +*/ 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 0d44ead2..b05f9169 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 @@ -27,9 +27,10 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - logger.info("目标:{}",proxy); + logger.info("目标:{}",JSON.toJSONString(proxy)); logger.info("方法:{}",method); - logger.info("参数:{}", JSON.toJSONString(args)); + logger.info("参数:{}",JSON.toJSONString(args[0])); + logger.info("参数2:{}",args[1].getClass()); Object invoke = method.invoke(target, args); logger.info("执行结束"); return invoke; 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 b3e66f9c..7666876a 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 @@ -1,5 +1,6 @@ package com.anwen.mongo.service.impl; +import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; import com.anwen.mongo.conditions.aggregate.LambdaAggregateChainWrapper; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; @@ -8,19 +9,22 @@ import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conditions.query.QueryWrapper; import com.anwen.mongo.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; +import com.anwen.mongo.constant.SqlOperationConstant; +import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.mapper.BaseMapper; 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.ChainWrappers; +import com.anwen.mongo.toolkit.*; +import com.mongodb.BasicDBObject; import com.mongodb.client.MongoCollection; -import com.mongodb.client.model.CreateIndexOptions; -import com.mongodb.client.model.DropIndexOptions; -import com.mongodb.client.model.IndexModel; -import com.mongodb.client.model.IndexOptions; +import com.mongodb.client.model.*; +import javafx.util.Pair; import org.bson.Document; import org.bson.conversions.Bson; +import org.bson.types.ObjectId; import java.io.Serializable; import java.lang.reflect.ParameterizedType; @@ -29,6 +33,7 @@ import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; /** * @author JiaChaoYang @@ -37,14 +42,10 @@ import java.util.List; **/ public class ServiceImpl implements IService{ - private ExecutorFactory factory; + private BaseMapper baseMapper; - public void setFactory(ExecutorFactory factory){ - this.factory = factory; - } - - public ExecutorFactory getFactory(){ - return factory; + public void setBaseMapper(BaseMapper baseMapper){ + this.baseMapper = baseMapper; } private Class clazz; @@ -85,142 +86,203 @@ public class ServiceImpl implements IService{ @Override public MongoCollection getCollection() { - return factory.getCollectionManager(database).getCollection(clazz); + return baseMapper.getMongoPlusClient().getCollection(database,clazz); } @Override public MongoCollection getCollection(String database) { - return factory.getCollectionManager(database).getCollection(clazz); + return baseMapper.getMongoPlusClient().getCollection(database,clazz); } @Override public Boolean save(T entity) { - return factory.getExecute(database).save(entity); + return baseMapper.save(entity); } @Override public Boolean saveBatch(Collection entityList) { - return factory.getExecute(database).saveBatch(entityList); + return baseMapper.saveBatch(entityList); } @Override public Boolean saveOrUpdate(T entity) { - return factory.getExecute(database).saveOrUpdate(entity); + String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); + if (StringUtils.isBlank(idByEntity)){ + return save(entity); + } + return updateById(entity); } @Override public Boolean saveOrUpdateWrapper(T entity, QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).saveOrUpdateWrapper(entity,queryChainWrapper); + long count = count(queryChainWrapper); + if (count > 0){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return baseMapper.update(updatePair.getKey(),updatePair.getValue(),ClassTypeUtil.getClass(entity)) >= 1; + } + return save(entity); + } + + protected Pair getUpdateCondition(List compareConditionList, T entity){ + BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); + Document document = DocumentUtil.checkUpdateField(entity,false); + document.remove(SqlOperationConstant._ID); + BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new Pair<>(queryBasic,updateField); } @Override public Boolean saveOrUpdateBatch(Collection entityList) { - return factory.getExecute(database).saveOrUpdateBatch(entityList); + 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))); + } else { + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + } + }); + return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override public Boolean saveOrUpdateBatchWrapper(Collection entityList, QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).saveOrUpdateBatchWrapper(entityList,queryChainWrapper); + Class clazz = entityList.stream().findFirst().get().getClass(); + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + long count = baseMapper.count(queryChainWrapper, clazz); + if (count > 0){ + Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); + } else { + writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity,false))); + } + }); + return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override public Boolean updateById(T entity) { - return factory.getExecute(database).updateById(entity); + Pair basicDBObjectPair = getUpdate(entity); + return baseMapper.update(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),ClassTypeUtil.getClass(entity)) >= 1; + } + + protected Pair getUpdate(T entity) { + Document document = DocumentUtil.checkUpdateField(entity,false); + BasicDBObject filter = ExecuteUtil.getFilter(document); + BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); + return new Pair<>(filter,update); } @Override public Boolean updateBatchByIds(Collection entityList) { - return factory.getExecute(database).updateBatchByIds(entityList); + List> writeModelList = new ArrayList<>(); + entityList.forEach(entity -> { + Pair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + }); + return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); } @Override public Boolean updateByColumn(T entity, SFunction column) { - return factory.getExecute(database).updateByColumn(entity,column); + return updateByColumn(entity,column.getFieldNameLine()); } @Override public Boolean updateByColumn(T entity, String column) { - return factory.getExecute(database).updateByColumn(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; } @Override public Boolean remove(UpdateChainWrapper updateChainWrapper) { - return factory.getExecute(database).remove(updateChainWrapper,clazz); + return baseMapper.remove(updateChainWrapper,clazz); } @Override public Boolean update(UpdateChainWrapper updateChainWrapper) { - return factory.getExecute(database).update(updateChainWrapper,clazz); + return baseMapper.update(updateChainWrapper,clazz); } @Override public Boolean update(T entity, QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).update(entity,queryChainWrapper); + return baseMapper.update(entity,queryChainWrapper); } @Override public Boolean removeById(Serializable id) { - return factory.getExecute(database).removeById(id,clazz); + Bson filterId = Filters.eq(SqlOperationConstant._ID, ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id); + return baseMapper.remove(filterId,clazz) >= 1; } @Override public Boolean removeByColumn(SFunction column, Object value) { - return factory.getExecute(database).removeByColumn(column,value,clazz); + return removeByColumn(column.getFieldNameLine(),value); } @Override public Boolean removeByColumn(String column, Object value) { - return factory.getExecute(database).removeByColumn(column,value,clazz); + Bson filter = Filters.eq(column, ObjectId.isValid(String.valueOf(value)) ? new ObjectId(String.valueOf(value)) : value); + return baseMapper.remove(filter,clazz) >= 1; } @Override public Boolean removeBatchByIds(Collection idList) { - return factory.getExecute(database).removeBatchByIds(idList,clazz); + 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 baseMapper.remove(objectIdBson,clazz) >= 1; } @Override public List list() { - return factory.getExecute(database).list(clazz); + return baseMapper.list(clazz); } @Override public List aggregateList(AggregateChainWrapper queryChainWrapper) { - return factory.getExecute(database).aggregateList(queryChainWrapper,clazz); + return baseMapper.aggregateList(queryChainWrapper,clazz); } @Override public T one(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).one(queryChainWrapper,clazz); + return baseMapper.one(queryChainWrapper,clazz); } @Override public T limitOne(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).limitOne(queryChainWrapper,clazz); + return baseMapper.limitOne(queryChainWrapper,clazz); } @Override public List list(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).list(queryChainWrapper,clazz); + return baseMapper.list(queryChainWrapper,clazz); } @Override public List list(AggregateChainWrapper queryChainWrapper) { - return factory.getExecute(database).aggregateList(queryChainWrapper,clazz); + return baseMapper.aggregateList(queryChainWrapper,clazz); } @Override public long count() { - return factory.getExecute(database).count(clazz); + return baseMapper.count(clazz); } @Override public long count(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).count(queryChainWrapper,clazz); + return baseMapper.count(queryChainWrapper,clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize){ - return factory.getExecute(database).page(queryChainWrapper, pageNum,pageSize,clazz); + return baseMapper.page(queryChainWrapper, pageNum,pageSize,clazz); } @Override @@ -230,12 +292,12 @@ public class ServiceImpl implements IService{ @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum){ - return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(), pageNum,pageSize,recentPageNum,clazz); + return baseMapper.page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(), pageNum,pageSize,recentPageNum,clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum) { - return factory.getExecute(database).page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum,clazz); + return baseMapper.page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum,clazz); } @Override @@ -255,97 +317,97 @@ public class ServiceImpl implements IService{ @Override public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { - return factory.getExecute(database).page(null,null,null,null,pageNum,pageSize,recentPageNum,clazz); + return baseMapper.page(null,null,null,null,pageNum,pageSize,recentPageNum,clazz); } @Override public T getById(Serializable id) { - return factory.getExecute(database).getById(id,clazz); + return baseMapper.getById(id,clazz); } @Override public List getByIds(Collection ids) { - return factory.getExecute(database).getByIds(ids,clazz); + return baseMapper.getByIds(ids,clazz); } @Override public List queryCommand(String command) { - return factory.getExecute(database).queryCommand(command,clazz); + return baseMapper.queryCommand(command,clazz); } @Override public List getByColumn(SFunction field, Object fieldValue) { - return factory.getExecute(database).getByColumn(field.getFieldNameLine(), fieldValue,clazz); + return baseMapper.getByColumn(field.getFieldNameLine(), fieldValue,clazz); } @Override public List getByColumn(String field, Object fieldValue) { - return factory.getExecute(database).getByColumn(field,fieldValue,clazz); + return baseMapper.getByColumn(field,fieldValue,clazz); } @Override public Boolean exist(Serializable id) { - return factory.getExecute(database).isExist(id,clazz); + return baseMapper.isExist(id,clazz); } @Override public Boolean exist(QueryChainWrapper queryChainWrapper) { - return factory.getExecute(database).isExist(queryChainWrapper,clazz); + return baseMapper.isExist(queryChainWrapper,clazz); } @Override public String createIndex(Bson bson) { - return factory.getExecute(database).createIndex(bson,clazz); + return baseMapper.createIndex(bson,clazz); } @Override public String createIndex(Bson bson, IndexOptions indexOptions) { - return factory.getExecute(database).createIndex(bson,indexOptions,clazz); + return baseMapper.createIndex(bson,indexOptions,clazz); } @Override public List createIndexes(List indexes) { - return factory.getExecute(database).createIndexes(indexes,clazz); + return baseMapper.createIndexes(indexes,clazz); } @Override public List createIndexes(List indexes, CreateIndexOptions createIndexOptions) { - return factory.getExecute(database).createIndexes(indexes,createIndexOptions,clazz); + return baseMapper.createIndexes(indexes,createIndexOptions,clazz); } @Override public List listIndexes() { - return factory.getExecute(database).listIndexes(clazz); + return baseMapper.listIndexes(clazz); } @Override public void dropIndex(String indexName) { - factory.getExecute(database).dropIndex(indexName,clazz); + baseMapper.dropIndex(indexName,clazz); } @Override public void dropIndex(String indexName, DropIndexOptions dropIndexOptions) { - factory.getExecute(database).dropIndex(indexName,dropIndexOptions,clazz); + baseMapper.dropIndex(indexName,dropIndexOptions,clazz); } @Override public void dropIndex(Bson keys) { - factory.getExecute(database).dropIndex(keys,clazz); + baseMapper.dropIndex(keys,clazz); } @Override public void dropIndex(Bson keys, DropIndexOptions dropIndexOptions) { - factory.getExecute(database).dropIndex(keys,dropIndexOptions,clazz); + baseMapper.dropIndex(keys,dropIndexOptions,clazz); } @Override public void dropIndexes() { - factory.getExecute(database).dropIndexes(clazz); + baseMapper.dropIndexes(clazz); } @Override public void dropIndexes(DropIndexOptions dropIndexOptions) { - factory.getExecute(database).dropIndexes(dropIndexOptions,clazz); + baseMapper.dropIndexes(dropIndexOptions,clazz); } public Class getClazz() { @@ -354,16 +416,16 @@ public class ServiceImpl implements IService{ @Override public LambdaQueryChainWrapper lambdaQuery() { - return ChainWrappers.lambdaQueryChain(factory,clazz,database); + return ChainWrappers.lambdaQueryChain(baseMapper,clazz); } @Override public LambdaAggregateChainWrapper lambdaAggregate() { - return ChainWrappers.lambdaAggregateChain(factory,clazz,database); + return ChainWrappers.lambdaAggregateChain(baseMapper,clazz); } @Override public LambdaUpdateChainWrapper lambdaUpdate() { - return ChainWrappers.lambdaUpdateChain(factory,clazz,database); + return ChainWrappers.lambdaUpdateChain(baseMapper,clazz); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java index 127dbb5e..e779ace9 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java @@ -13,6 +13,7 @@ import com.anwen.mongo.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateWrapper; import com.anwen.mongo.execute.ExecutorFactory; +import com.anwen.mongo.mapper.BaseMapper; import java.util.Map; @@ -23,16 +24,16 @@ import java.util.Map; */ public final class ChainWrappers { - public static LambdaQueryChainWrapper lambdaQueryChain(ExecutorFactory factory, Class clazz,String database){ - return new LambdaQueryChainWrapper<>(factory, clazz,database); + public static LambdaQueryChainWrapper lambdaQueryChain(BaseMapper baseMapper, Class clazz){ + return new LambdaQueryChainWrapper<>(baseMapper, clazz); } - public static LambdaAggregateChainWrapper lambdaAggregateChain(ExecutorFactory factory,Class clazz,String database){ - return new LambdaAggregateChainWrapper<>(factory,clazz,database); + public static LambdaAggregateChainWrapper lambdaAggregateChain(BaseMapper baseMapper, Class clazz){ + return new LambdaAggregateChainWrapper<>(baseMapper, clazz); } - public static LambdaUpdateChainWrapper lambdaUpdateChain(ExecutorFactory factory,Class clazz,String database){ - return new LambdaUpdateChainWrapper<>(factory,clazz,database); + public static LambdaUpdateChainWrapper lambdaUpdateChain(BaseMapper baseMapper, Class clazz){ + return new LambdaUpdateChainWrapper<>(baseMapper, clazz); } public static UpdateChainWrapper> lambdaUpdateChain(){ diff --git a/mongo-plus-parent/pom.xml b/mongo-plus-parent/pom.xml index 5cdfc9fb..02ace85f 100644 --- a/mongo-plus-parent/pom.xml +++ b/mongo-plus-parent/pom.xml @@ -17,7 +17,7 @@ ../mongo-plus-annotation ../mongo-plus-core ../mongo-plus-boot-starter - ../mongo-plus-solon-plugin + 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 e0983b82..a601a23f 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 @@ -13,6 +13,7 @@ import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.interceptor.business.BlockAttackInnerInterceptor; import com.anwen.mongo.interceptor.business.LogInterceptor; import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBLogProperty; import com.anwen.mongo.service.IService; @@ -41,7 +42,7 @@ import java.util.stream.Collectors; **/ public class MongoPlusAutoConfiguration { - private final ExecutorFactory factory; + private final BaseMapper baseMapper; private final MongoPlusClient mongoPlusClient; @@ -53,13 +54,13 @@ public class MongoPlusAutoConfiguration { Logger logger = LoggerFactory.getLogger(MongoPlusAutoConfiguration.class); - public MongoPlusAutoConfiguration(ExecutorFactory factory, MongoPlusClient mongoPlusClient, @Inject CollectionNameConvert collectionNameConvert, MongoDBLogProperty mongoDBLogProperty, MongoDBCollectionProperty mongoDBCollectionProperty){ + public MongoPlusAutoConfiguration(BaseMapper baseMapper, MongoPlusClient mongoPlusClient, @Inject CollectionNameConvert collectionNameConvert, MongoDBLogProperty mongoDBLogProperty, MongoDBCollectionProperty mongoDBCollectionProperty){ mongoDBCollectionProperty = Optional.ofNullable(mongoDBCollectionProperty).orElseGet(MongoDBCollectionProperty::new); - this.factory = factory; this.collectionNameConvert = collectionNameConvert; this.mongoPlusClient = mongoPlusClient; this.mongoDBLogProperty = mongoDBLogProperty; this.mongoDBCollectionProperty = mongoDBCollectionProperty; + this.baseMapper = baseMapper; AppContext context = Solon.context(); context.subBeansOfType(IService.class, bean -> { if (bean instanceof ServiceImpl){ @@ -85,9 +86,8 @@ public class MongoPlusAutoConfiguration { serviceImpl.setClazz(clazz); String database = initFactory(clazz); //这里需要将MongoPlusClient给工厂 - factory.setMongoPlusClient(mongoPlusClient); serviceImpl.setDatabase(database); - serviceImpl.setFactory(factory); + serviceImpl.setBaseMapper(baseMapper); } public String initFactory(Class clazz) { -- Gitee From ead5c9c23675ab3327c7d178994d4b7815e5f7ab Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Tue, 6 Feb 2024 01:14:37 +0800 Subject: [PATCH 13/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E5=AE=9E=E7=8E=B0=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anwen/mongo/enums/ExecuteMethodEnum.java | 35 ++++++ .../config/MongoPlusAutoConfiguration.java | 23 ++-- .../mongo/config/MongoPlusConfiguration.java | 13 +-- .../mongo/cache/global/InterceptorCache.java | 6 +- .../mongo/cache/global/ListenerCache.java | 18 ++++ .../LambdaAggregateChainInjectWrapper.java | 6 +- .../query/LambdaQueryChainInjectWrapper.java | 24 ++--- .../LambdaUpdateChainInjectWrapper.java | 4 +- .../query/LambdaQueryChainWrapper.java | 4 +- .../anwen/mongo/execute/ExecutorFactory.java | 80 +++----------- .../anwen/mongo/interceptor/Interceptor.java | 72 ++++--------- .../BaseListener.java} | 8 +- .../com/anwen/mongo/listener/Listener.java | 59 ++++++++++ .../MongoPlusListener.java} | 12 +-- .../business/BlockAttackInnerListener.java} | 8 +- .../business/LogListener.java} | 6 +- .../com/anwen/mongo/mapper/BaseMapper.java | 6 +- .../mongo/mapper/DefaultBaseMapperImpl.java | 102 +----------------- .../mongo/mapper/MongoPlusMapMapper.java | 26 ++--- .../com/anwen/mongo/proxy/ExecutorProxy.java | 41 +++++-- .../anwen/mongo/service/impl/ServiceImpl.java | 16 +-- .../config/MongoPlusAutoConfiguration.java | 23 ++-- .../mongo/config/MongoPlusConfiguration.java | 23 ++-- 23 files changed, 274 insertions(+), 341 deletions(-) create mode 100644 mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/ExecuteMethodEnum.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java rename mongo-plus-core/src/main/java/com/anwen/mongo/{interceptor/BaseInterceptor.java => listener/BaseListener.java} (85%) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/listener/Listener.java rename mongo-plus-core/src/main/java/com/anwen/mongo/{interceptor/MongoPlusInterceptor.java => listener/MongoPlusListener.java} (56%) rename mongo-plus-core/src/main/java/com/anwen/mongo/{interceptor/business/BlockAttackInnerInterceptor.java => listener/business/BlockAttackInnerListener.java} (85%) rename mongo-plus-core/src/main/java/com/anwen/mongo/{interceptor/business/LogInterceptor.java => listener/business/LogListener.java} (94%) diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/ExecuteMethodEnum.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/ExecuteMethodEnum.java new file mode 100644 index 00000000..a0a583b2 --- /dev/null +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/ExecuteMethodEnum.java @@ -0,0 +1,35 @@ +package com.anwen.mongo.enums; + +/** + * 执行器方法枚举 + * + * @author JiaChaoYang + **/ +public enum ExecuteMethodEnum { + + SAVE("executeSave"), + + REMOVE("executeRemove"), + + UPDATE("executeUpdate"), + + QUERY("executeQuery"), + + AGGREGATE("executeAggregate"), + + COUNT("executeCount"), + + BULK_WRITE("executeBulkWrite") + + ; + + private final String method; + + ExecuteMethodEnum(String method) { + this.method = method; + } + + public String getMethod() { + return method; + } +} 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 70e62f3f..15b8ef8d 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 @@ -2,16 +2,15 @@ package com.anwen.mongo.config; import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.cache.global.HandlerCache; -import com.anwen.mongo.cache.global.InterceptorCache; +import com.anwen.mongo.cache.global.ListenerCache; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.conn.ConnectMongoDB; import com.anwen.mongo.convert.CollectionNameConvert; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.handlers.DocumentHandler; import com.anwen.mongo.handlers.MetaObjectHandler; -import com.anwen.mongo.interceptor.Interceptor; -import com.anwen.mongo.interceptor.business.BlockAttackInnerInterceptor; -import com.anwen.mongo.interceptor.business.LogInterceptor; +import com.anwen.mongo.listener.Listener; +import com.anwen.mongo.listener.business.BlockAttackInnerListener; +import com.anwen.mongo.listener.business.LogListener; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; @@ -169,18 +168,18 @@ public class MongoPlusAutoConfiguration implements InitializingBean { * @date 2023/11/22 18:39 */ private void setInterceptor(){ - List interceptors = new ArrayList<>(); + List listeners = new ArrayList<>(); if (mongodbLogProperty.getLog()){ - interceptors.add(new LogInterceptor()); + listeners.add(new LogListener()); } if (mongodbCollectionProperty.getBlockAttackInner()){ - interceptors.add(new BlockAttackInnerInterceptor()); + listeners.add(new BlockAttackInnerListener()); } - Collection interceptorCollection = applicationContext.getBeansOfType(Interceptor.class).values(); - if (CollUtil.isNotEmpty(interceptorCollection)){ - interceptors.addAll(interceptorCollection); + Collection listenerCollection = applicationContext.getBeansOfType(Listener.class).values(); + if (CollUtil.isNotEmpty(listenerCollection)){ + listeners.addAll(listenerCollection); } - InterceptorCache.interceptors = interceptors.stream().sorted(Comparator.comparingInt(Interceptor::getOrder)).collect(Collectors.toList()); + ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); } } diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index c5eb36ed..8b7b431c 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -2,10 +2,11 @@ package com.anwen.mongo.config; import com.anwen.mongo.cache.global.MongoPlusClientCache; import com.anwen.mongo.convert.CollectionNameConvert; -import com.anwen.mongo.interceptor.BaseInterceptor; +import com.anwen.mongo.listener.BaseListener; 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.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBConfigurationProperty; import com.anwen.mongo.property.MongoDBConnectProperty; @@ -51,7 +52,7 @@ public class MongoPlusConfiguration { @ConditionalOnMissingBean public MongoClient mongo(){ return MongoClients.create(MongoClientSettings.builder() - .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseInterceptor())).build()); + .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseListener())).build()); } @Bean @@ -87,11 +88,11 @@ public class MongoPlusConfiguration { return new DefaultBaseMapperImpl(mongoPlusClient); } -/* @Bean("mongoPlusMapMapper") + @Bean("mongoPlusMapMapper") @ConditionalOnMissingBean - public MongoPlusMapMapper mongoPlusMapMapper(ExecutorFactory factory) { - return new MongoPlusMapMapper(factory); - }*/ + public MongoPlusMapMapper mongoPlusMapMapper(MongoPlusClient mongoPlusClient) { + return new MongoPlusMapMapper(mongoPlusClient); + } @Bean("mongoTransactionalAspect") @ConditionalOnMissingBean 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 825280ad..4b9646bd 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 @@ -1,15 +1,15 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.listener.Listener; import java.util.ArrayList; import java.util.List; /** + * 拦截器 + * * @author JiaChaoYang - * @project mongo-plus - * @description 拦截器 - * @date 2023-11-22 17:13 **/ public class InterceptorCache { 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 new file mode 100644 index 00000000..f8cb3929 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ListenerCache.java @@ -0,0 +1,18 @@ +package com.anwen.mongo.cache.global; + +import com.anwen.mongo.listener.Listener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author JiaChaoYang + * @project mongo-plus + * @description 监听器 + * @date 2023-11-22 17:13 + **/ +public class ListenerCache { + + public static List listeners = new ArrayList<>(); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java index 28314fd8..68239b24 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/aggregate/LambdaAggregateChainInjectWrapper.java @@ -26,8 +26,7 @@ public class LambdaAggregateChainInjectWrapper extends AggregateChainWrapper List list(String database, String collectionName, Class clazz) { -// return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject(),clazz); - return null; + return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject(),clazz); } @Override @@ -37,7 +36,6 @@ public class LambdaAggregateChainInjectWrapper extends AggregateChainWrapper> list(String database, String collectionName) { -// return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject()); - return null; + return factory.getInjectExecute(database).aggregateList(collectionName,super.getBaseAggregateList(),super.getBasicDBObjectList(),super.getOptionsBasicDBObject()); } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java index 5d09b00b..741a4a6a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java @@ -19,10 +19,10 @@ import static com.anwen.mongo.toolkit.StringPool.EMPTY; **/ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper, LambdaQueryChainInjectWrapper> implements ChainInject { - private final BaseMapper baseMapper; + private final ExecutorFactory factory; - public LambdaQueryChainInjectWrapper(BaseMapper baseMapper) { - this.baseMapper = baseMapper; + public LambdaQueryChainInjectWrapper(ExecutorFactory factory) { + this.factory = factory; } @Override @@ -32,8 +32,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> list(String database, String collectionName) { -// return factory.getInjectExecute(database).list(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList()); - return null; + return factory.getInjectExecute(database).list(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList()); } @Override @@ -43,8 +42,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper limitOne(String database, String collectionName) { -// return factory.getInjectExecute(database).limitOne(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList(),getOrderList()); - return null; + return factory.getInjectExecute(database).limitOne(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList(),getOrderList()); } @Override @@ -54,8 +52,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> page(String database, String collectionName, PageParam pageParam) { -// return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize()); - return null; + return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize()); } @Override @@ -65,8 +62,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper> page(String database, String collectionName, Integer pageNum, Integer pageSize) { -// return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageNum,pageSize); - return null; + return factory.getInjectExecute(database).page(collectionName,getCompareList(),getOrderList(),getProjectionList(),getBasicDBObjectList(),pageNum,pageSize); } @Override @@ -76,8 +72,7 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper one(String database, String collectionName) { -// return factory.getInjectExecute(database).one(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList()); - return null; + return factory.getInjectExecute(database).one(collectionName,getCompareList(),getProjectionList(),getBasicDBObjectList()); } @Override @@ -87,7 +82,6 @@ public class LambdaQueryChainInjectWrapper extends QueryChainWrapper getUpdateCompareList() { return updateCompareList; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index 7c3ae8c7..1b214e8b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -50,12 +50,12 @@ public class LambdaQueryChainWrapper extends QueryChainWrapper page(PageParam pageParam, Integer recentPageNum) { - return baseMapper.page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum, clazz); + return baseMapper.page(this, pageParam.getPageNum(), pageParam.getPageSize(), recentPageNum, clazz); } @Override public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { - return baseMapper.page(getCompareList(), getOrderList(), getProjectionList(), getBasicDBObjectList(), pageNum, pageSize, recentPageNum, clazz); + return baseMapper.page(this, pageNum, pageSize, recentPageNum, clazz); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java index e6577f50..4af9067d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/ExecutorFactory.java @@ -1,28 +1,18 @@ package com.anwen.mongo.execute; -import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.context.MongoTransactionContext; -import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.execute.inject.InjectAbstractExecute; import com.anwen.mongo.execute.instance.DefaultExecute; import com.anwen.mongo.execute.instance.SessionExecute; import com.anwen.mongo.manager.MongoPlusClient; -import com.anwen.mongo.mapper.BaseMapper; -import com.anwen.mongo.mapper.DefaultBaseMapperImpl; -import com.anwen.mongo.model.BaseProperty; import com.anwen.mongo.proxy.ExecutorProxy; -import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.ClientSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Proxy; -import java.util.Map; -import java.util.Objects; import java.util.Optional; -import static com.anwen.mongo.toolkit.StringPool.EMPTY; - /** * 执行器工厂 * @author JiaChaoYang @@ -33,22 +23,14 @@ public class ExecutorFactory { private final Logger logger = LoggerFactory.getLogger(ExecutorFactory.class); - /** - * 获取执行器 - * @author JiaChaoYang - * @date 2023/12/28 14:49 - */ -/* public BaseMapper getBaseMapper(String database) { - return getBaseMapper(getCollectionManager(database)); - }*/ + private MongoPlusClient mongoPlusClient; -/* public Execute getExecuteInterface(String database){ - return getBaseMapper(getCollectionManager(database)); + public ExecutorFactory() { } - public Execute getExecuteInterface(){ - return getBaseMapper(getCollectionManager(EMPTY)); - }*/ + public ExecutorFactory(MongoPlusClient mongoPlusClient){ + this.mongoPlusClient = mongoPlusClient; + } public Execute getExecute(){ ClientSession clientSessionContext = MongoTransactionContext.getClientSessionContext(); @@ -60,51 +42,13 @@ public class ExecutorFactory { } -/* public InjectAbstractExecute getInjectExecute(String database){ - CollectionManager collectionManager = getCollectionManager(database); - return new InjectAbstractExecute(collectionManager, getBaseMapper(collectionManager)); - }*/ - -/* public CollectionManager getCollectionManager(String database){ - Map managerMap = mongoPlusClient.getCollectionManager(); - if (StringUtils.isBlank(database)){ - database = managerMap.keySet().stream().findFirst().get(); - } - CollectionManager collectionManager = managerMap.get(database); - if (null == collectionManager){ - collectionManager = new CollectionManager(mongoPlusClient.getMongoClient(), collectionNameConvert, database); - mongoPlusClient.getMongoDatabase().add(mongoPlusClient.getMongoClient().getDatabase(database)); - mongoPlusClient.getCollectionManager().put(database,collectionManager); - } - return collectionManager; - }*/ - -// /** -// * 获取自定义执行器 -// * @param clazz 执行器class -// * @param expandParam 拓展参数 -// * @return com.anwen.mongo.execute.Execute -// * @author JiaChaoYang -// * @date 2023/12/28 16:03 -// */ -// public AbstractExecute getExecute(Class clazz, Map expandParam){ -// Constructor constructor; -// try { -// constructor = clazz.getConstructor(CollectionNameConvert.class,CollectionManager.class,Map.class); -// } catch (NoSuchMethodException e) { -// logger.error("In the class of an extended executor, there must be a constructor with the following parameters: ‘MongoClient MongoClient, BaseProperty BaseProperty, CollectionNameConvert CollectionNameConvert, CollectionManager CollectionManager, MapexpandExecuteMap’"); -// throw new RuntimeException(e); -// } -// try { -// return (AbstractExecute) constructor.newInstance(collectionNameConvert,collectionManagerMap.get(),expandParam); -// } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { -// logger.error("Instance creation failed, exception reason: {}",e.getMessage()); -// throw new RuntimeException(e); -// } -// } - - public ExecutorFactory() { + public InjectAbstractExecute getInjectExecute(String database){ + ClientSession clientSessionContext = MongoTransactionContext.getClientSessionContext(); + Execute execute = Optional.ofNullable(clientSessionContext) + .map(clientSession -> (Execute) new SessionExecute(clientSession)) + .orElseGet(DefaultExecute::new); + Class clazz = execute.getClass(); + return new InjectAbstractExecute(mongoPlusClient.getCollectionManager(database), (Execute) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),new ExecutorProxy(execute))); } - } 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 6c63ea2c..f4b48af6 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 @@ -1,59 +1,33 @@ package com.anwen.mongo.interceptor; -import com.anwen.mongo.model.command.CommandFailed; -import com.anwen.mongo.model.command.CommandStarted; -import com.anwen.mongo.model.command.CommandSucceeded; +import com.anwen.mongo.model.AggregateBasicDBObject; +import com.mongodb.BasicDBObject; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.WriteModel; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.util.List; /** + * 拦截器 + * * @author JiaChaoYang - * @project mongo-plus - * @description 拦截器,实际上是通过mongo的命令监听器实现,MongoDB团队并不推荐这么做 - * @date 2023-11-22 14:12 **/ public interface Interceptor { - /** - * 最高优先级 - * @see java.lang.Integer#MIN_VALUE - */ - int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; - - /** - * 最低优先级 - * @see java.lang.Integer#MAX_VALUE - */ - int LOWEST_PRECEDENCE = Integer.MAX_VALUE; - - /** - * 处理命令开始信息 - * @param commandStarted 命令执行开始信息对象 - * @author JiaChaoYang - * @date 2023/11/22 14:34 - */ - void commandStarted(CommandStarted commandStarted); - - /** - * 处理命令成功信息 - * @param commandSucceeded 命令成功信息对象 - * @author JiaChaoYang - * @date 2023/11/22 14:35 - */ - void commandSucceeded(CommandSucceeded commandSucceeded); - - /** - * 处理命令失败信息 - * @param commandFailed 处理命令失败信息对象 - * @author JiaChaoYang - * @date 2023/11/22 14:35 - */ - void commandFailed(CommandFailed commandFailed); - - /** - * 指定拦截器排序 - * @return int - * @author JiaChaoYang - * @date 2023/11/22 16:27 - */ - int getOrder(); + void executeSave(List documentList); + + void executeRemove(Bson filter); + + void executeUpdate(Bson queryBasic, Bson updateBasic); + + void executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond); + + void executeAggregate(List aggregateConditionList); + + void executeCount(BasicDBObject queryBasic, CountOptions countOptions); + + void executeBulkWrite(List> writeModelList); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/BaseInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/BaseListener.java similarity index 85% rename from mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/BaseInterceptor.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/listener/BaseListener.java index f34cac3d..1f4ffa42 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/BaseInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/BaseListener.java @@ -1,4 +1,4 @@ -package com.anwen.mongo.interceptor; +package com.anwen.mongo.listener; import com.anwen.mongo.domain.MongoPlusInterceptorException; import com.anwen.mongo.model.command.CommandFailed; @@ -11,11 +11,11 @@ import com.mongodb.event.CommandSucceededEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class BaseInterceptor implements CommandListener { +public class BaseListener implements CommandListener { - private final MongoPlusInterceptor mongoPlusInterceptor = new MongoPlusInterceptor(); + private final MongoPlusListener mongoPlusInterceptor = new MongoPlusListener(); - private final Logger logger = LoggerFactory.getLogger(BaseInterceptor.class); + private final Logger logger = LoggerFactory.getLogger(BaseListener.class); @Override public void commandStarted(CommandStartedEvent event) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/listener/Listener.java b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/Listener.java new file mode 100644 index 00000000..308b3adb --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/Listener.java @@ -0,0 +1,59 @@ +package com.anwen.mongo.listener; + +import com.anwen.mongo.model.command.CommandFailed; +import com.anwen.mongo.model.command.CommandStarted; +import com.anwen.mongo.model.command.CommandSucceeded; + +/** + * @author JiaChaoYang + * @project mongo-plus + * @description 拦截器,实际上是通过mongo的命令监听器实现,MongoDB团队并不推荐这么做 + * @date 2023-11-22 14:12 + **/ +public interface Listener { + + /** + * 最高优先级 + * @see java.lang.Integer#MIN_VALUE + */ + int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; + + /** + * 最低优先级 + * @see java.lang.Integer#MAX_VALUE + */ + int LOWEST_PRECEDENCE = Integer.MAX_VALUE; + + /** + * 处理命令开始信息 + * @param commandStarted 命令执行开始信息对象 + * @author JiaChaoYang + * @date 2023/11/22 14:34 + */ + void commandStarted(CommandStarted commandStarted); + + /** + * 处理命令成功信息 + * @param commandSucceeded 命令成功信息对象 + * @author JiaChaoYang + * @date 2023/11/22 14:35 + */ + void commandSucceeded(CommandSucceeded commandSucceeded); + + /** + * 处理命令失败信息 + * @param commandFailed 处理命令失败信息对象 + * @author JiaChaoYang + * @date 2023/11/22 14:35 + */ + void commandFailed(CommandFailed commandFailed); + + /** + * 指定拦截器排序 + * @return int + * @author JiaChaoYang + * @date 2023/11/22 16:27 + */ + int getOrder(); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/MongoPlusInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/MongoPlusListener.java similarity index 56% rename from mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/MongoPlusInterceptor.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/listener/MongoPlusListener.java index c687939d..f89bac23 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/MongoPlusInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/MongoPlusListener.java @@ -1,6 +1,6 @@ -package com.anwen.mongo.interceptor; +package com.anwen.mongo.listener; -import com.anwen.mongo.cache.global.InterceptorCache; +import com.anwen.mongo.cache.global.ListenerCache; import com.anwen.mongo.model.command.CommandFailed; import com.anwen.mongo.model.command.CommandStarted; import com.anwen.mongo.model.command.CommandSucceeded; @@ -11,21 +11,21 @@ import com.anwen.mongo.model.command.CommandSucceeded; * @description MongoPlus拦截器 * @date 2023-11-22 14:55 **/ -public class MongoPlusInterceptor implements Interceptor { +public class MongoPlusListener implements Listener { @Override public void commandStarted(CommandStarted commandStarted) { - InterceptorCache.interceptors.forEach(interceptor -> interceptor.commandStarted(commandStarted)); + ListenerCache.listeners.forEach(interceptor -> interceptor.commandStarted(commandStarted)); } @Override public void commandSucceeded(CommandSucceeded commandSucceeded) { - InterceptorCache.interceptors.forEach(interceptor -> interceptor.commandSucceeded(commandSucceeded)); + ListenerCache.listeners.forEach(interceptor -> interceptor.commandSucceeded(commandSucceeded)); } @Override public void commandFailed(CommandFailed commandFailed) { - InterceptorCache.interceptors.forEach(interceptor -> interceptor.commandFailed(commandFailed)); + ListenerCache.listeners.forEach(interceptor -> interceptor.commandFailed(commandFailed)); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/BlockAttackInnerInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/BlockAttackInnerListener.java similarity index 85% rename from mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/BlockAttackInnerInterceptor.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/BlockAttackInnerListener.java index 83ca3c17..bf15fd56 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/BlockAttackInnerInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/BlockAttackInnerListener.java @@ -1,7 +1,7 @@ -package com.anwen.mongo.interceptor.business; +package com.anwen.mongo.listener.business; import com.anwen.mongo.cache.global.OrderCache; -import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.listener.Listener; import com.anwen.mongo.model.command.CommandFailed; import com.anwen.mongo.model.command.CommandStarted; import com.anwen.mongo.model.command.CommandSucceeded; @@ -14,9 +14,9 @@ import org.slf4j.LoggerFactory; * * @author JiaChaoYang **/ -public class BlockAttackInnerInterceptor implements Interceptor { +public class BlockAttackInnerListener implements Listener { - Logger logger = LoggerFactory.getLogger(BlockAttackInnerInterceptor.class); + Logger logger = LoggerFactory.getLogger(BlockAttackInnerListener.class); @Override public void commandStarted(CommandStarted commandStarted) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/LogInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/LogListener.java similarity index 94% rename from mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/LogInterceptor.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/LogListener.java index 1339f05e..986657e4 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/business/LogInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/listener/business/LogListener.java @@ -1,11 +1,11 @@ -package com.anwen.mongo.interceptor.business; +package com.anwen.mongo.listener.business; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.anwen.mongo.cache.global.OrderCache; import com.anwen.mongo.cache.global.PropertyCache; -import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.listener.Listener; import com.anwen.mongo.model.command.CommandFailed; import com.anwen.mongo.model.command.CommandStarted; import com.anwen.mongo.model.command.CommandSucceeded; @@ -17,7 +17,7 @@ import java.util.Objects; * @author JiaChaoYang * @date 2023/11/22 10:54 */ -public class LogInterceptor implements Interceptor { +public class LogListener implements Listener { private String formattingStatement(String statement){ return PropertyCache.format ? JSON.toJSONString(JSONObject.parse(statement), SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index ea5765a7..c2a377c3 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -45,10 +45,6 @@ public interface BaseMapper{ Boolean update(T entity,QueryChainWrapper queryChainWrapper); - Boolean updateByColumn(T entity, String column); - - Boolean removeByColumn(String column, Object value,Class clazz); - List list(Class clazz); List list(QueryChainWrapper queryChainWrapper, Class clazz); @@ -61,7 +57,7 @@ public interface BaseMapper{ PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz); - PageResult page(List compareConditionList, List orderList, List projectionList, List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz); + PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz); T getById(Serializable id,Class clazz); 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 6ce46064..91eaa0d3 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 @@ -110,124 +110,28 @@ public class DefaultBaseMapperImpl implements BaseMapper { ).getModifiedCount(); } - @Override - public Boolean saveOrUpdateWrapper(T entity,QueryChainWrapper queryChainWrapper){ - long count = count(queryChainWrapper, entity.getClass()); - if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return factory.getExecute().executeUpdate(updatePair.getKey(),updatePair.getValue(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; - } - return save(entity); - } - - @Override - public Boolean saveOrUpdateBatch(Collection entityList) { - List> writeModelList = new ArrayList<>(); - entityList.forEach(entity -> { - String idByEntity = ClassTypeUtil.getIdByEntity(entity, true); - if (StringUtils.isBlank(idByEntity)){ - writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); - } else { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); - } - }); - BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(entityList.stream().findFirst().get().getClass())); - return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); - } - @Override public Integer bulkWrite(List> writeModelList, Class clazz) { BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(clazz)); return bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount(); } - @Override - public Boolean saveOrUpdateBatchWrapper(Collection entityList,QueryChainWrapper queryChainWrapper){ - Class clazz = entityList.stream().findFirst().get().getClass(); - List> writeModelList = new ArrayList<>(); - entityList.forEach(entity -> { - long count = count(queryChainWrapper, clazz); - if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); - } else { - writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); - } - }); - BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList, mongoPlusClient.getCollection(clazz)); - return (bulkWriteResult.getModifiedCount() + bulkWriteResult.getInsertedCount()) == entityList.size(); - } - @Override public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); return factory.getExecute().executeUpdate(updatePair.getKey(),updatePair.getValue(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } - @Override - public Boolean updateById(T entity) { - Pair basicDBObjectPair = getUpdate(entity); - MongoCollection collection = mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity)); - return factory.getExecute().executeUpdate(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),collection).getModifiedCount() >= 1; - } - - @Override - public Boolean updateBatchByIds(Collection entityList) { - List> writeModelList = new ArrayList<>(); - entityList.forEach(entity -> { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); - }); - BulkWriteResult bulkWriteResult = factory.getExecute().executeBulkWrite(writeModelList,mongoPlusClient.getCollection(entityList.stream().findFirst().get().getClass())); - return bulkWriteResult.getModifiedCount() == entityList.size(); - } - - @Override - public Boolean updateByColumn(T entity, SFunction column) { - return updateByColumn(entity,column.getFieldNameLine()); - } - - @Override - public Boolean updateByColumn(T entity, String 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); - MongoCollection collection = mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity)); - return factory.getExecute().executeUpdate(filter,document,collection).getModifiedCount() >= 1; - } - - @Override - public Boolean removeById(Serializable id, Class clazz) { - return buildRemove( id, mongoPlusClient.getCollection(clazz)); - } - 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; } - @Override - public Boolean removeByColumn(SFunction column, Object value,Class clazz) { - return removeByColumn(column.getFieldNameLine(),value,clazz); - } - - @Override - public Boolean removeByColumn(String column, Object value,Class clazz) { - return executeRemoveByColumn(column,value,mongoPlusClient.getCollection(clazz)); - } - 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; } - @Override - public Boolean removeBatchByIds(Collection idList,Class clazz) { - return executeRemoveBatchByIds(idList,mongoPlusClient.getCollection(clazz)); - } - private Boolean executeRemoveBatchByIds(Collection idList,MongoCollection collection){ List convertedIds = idList.stream() .map(id -> ObjectId.isValid(String.valueOf(id)) ? new ObjectId(String.valueOf(id)) : id) @@ -287,10 +191,10 @@ public class DefaultBaseMapperImpl implements BaseMapper { } @Override - public PageResult page(List compareConditionList, List orderList,List projectionList,List basicDBObjectList, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz) { - BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(compareConditionList, orderList, projectionList, basicDBObjectList); + 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()); FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz),Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(compareConditionList,clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),clazz); + return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(queryChainWrapper.getCompareList(),clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),clazz); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java index b687e69a..601b4c00 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/MongoPlusMapMapper.java @@ -1,4 +1,4 @@ -/* + package com.anwen.mongo.mapper; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; @@ -29,41 +29,36 @@ import java.util.Map; import static com.anwen.mongo.toolkit.StringPool.EMPTY; -*/ /** * @author JiaChaoYang - **//* + **/ public class MongoPlusMapMapper implements InjectQuery { private final ExecutorFactory factory; private final MongoPlusClient mongoPlusClient; - public MongoPlusMapMapper(ExecutorFactory factory, MongoPlusClient mongoPlusClient) { - this.factory = factory; + public MongoPlusMapMapper(MongoPlusClient mongoPlusClient) { this.mongoPlusClient = mongoPlusClient; + factory = new ExecutorFactory(); } - */ -/** + /** * 获取当前操作对象的连接,以便使用MongoDriver的语法 * @author JiaChaoYang * @date 2023/11/15 13:43 - *//* - + */ public MongoCollection getMongoCollection(String database,String collectionName){ - return factory.getCollectionManager(database).getCollection(collectionName); + return mongoPlusClient.getCollection(database,collectionName); } - */ -/** + /** * 获取当前操作对象的连接,以便使用MongoDriver的语法 * @author JiaChaoYang * @date 2023/11/15 13:43 - *//* - + */ public MongoCollection getMongoCollection(String collectionName){ - return factory.getCollectionManager(EMPTY).getCollection(collectionName); + return mongoPlusClient.getCollection(EMPTY,collectionName); } public LambdaQueryChainInjectWrapper lambdaQuery(){ @@ -501,4 +496,3 @@ public class MongoPlusMapMapper implements InjectQuery { return factory.getInjectExecute(database).count(collectionName); } } -*/ 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 b05f9169..1d23b4e9 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,12 +1,21 @@ package com.anwen.mongo.proxy; import com.alibaba.fastjson.JSON; +import com.anwen.mongo.cache.global.InterceptorCache; +import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.execute.Execute; +import com.anwen.mongo.model.AggregateBasicDBObject; +import com.mongodb.BasicDBObject; +import com.mongodb.client.model.CountOptions; +import com.mongodb.client.model.WriteModel; +import org.bson.Document; +import org.bson.conversions.Bson; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.util.List; /** * 执行器代理 @@ -27,12 +36,30 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - logger.info("目标:{}",JSON.toJSONString(proxy)); - logger.info("方法:{}",method); - logger.info("参数:{}",JSON.toJSONString(args[0])); - logger.info("参数2:{}",args[1].getClass()); - Object invoke = method.invoke(target, args); - logger.info("执行结束"); - return invoke; + String name = method.getName(); + InterceptorCache.interceptors.forEach(interceptor -> { + if (name.equals(ExecuteMethodEnum.SAVE.getMethod())){ + interceptor.executeSave((List) args[0]); + } + if (name.equals(ExecuteMethodEnum.REMOVE.getMethod())){ + interceptor.executeRemove((Bson) args[0]); + } + if (name.equals(ExecuteMethodEnum.UPDATE.getMethod())){ + interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); + } + if (name.equals(ExecuteMethodEnum.QUERY.getMethod())){ + interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2]); + } + if (name.equals(ExecuteMethodEnum.AGGREGATE.getMethod())){ + interceptor.executeAggregate((List) args[0]); + } + if (name.equals(ExecuteMethodEnum.COUNT.getMethod())){ + interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); + } + if (name.equals(ExecuteMethodEnum.BULK_WRITE.getMethod())){ + interceptor.executeBulkWrite((List>) args[0]); + } + }); + return method.invoke(target, args); } } 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 7666876a..cdc588df 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 @@ -240,11 +240,6 @@ public class ServiceImpl implements IService{ return baseMapper.remove(objectIdBson,clazz) >= 1; } - @Override - public List list() { - return baseMapper.list(clazz); - } - @Override public List aggregateList(AggregateChainWrapper queryChainWrapper) { return baseMapper.aggregateList(queryChainWrapper,clazz); @@ -260,6 +255,11 @@ public class ServiceImpl implements IService{ return baseMapper.limitOne(queryChainWrapper,clazz); } + @Override + public List list() { + return baseMapper.list(clazz); + } + @Override public List list(QueryChainWrapper queryChainWrapper) { return baseMapper.list(queryChainWrapper,clazz); @@ -292,12 +292,12 @@ public class ServiceImpl implements IService{ @Override public PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum){ - return baseMapper.page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(), pageNum,pageSize,recentPageNum,clazz); + return baseMapper.page(queryChainWrapper, pageNum,pageSize,recentPageNum,clazz); } @Override public PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum) { - return baseMapper.page(queryChainWrapper.getCompareList(),queryChainWrapper.getOrderList(),queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList(),pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum,clazz); + return page(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum); } @Override @@ -317,7 +317,7 @@ public class ServiceImpl implements IService{ @Override public PageResult page(Integer pageNum, Integer pageSize, Integer recentPageNum) { - return baseMapper.page(null,null,null,null,pageNum,pageSize,recentPageNum,clazz); + return baseMapper.page(new QueryWrapper<>(),pageNum,pageSize,recentPageNum,clazz); } @Override 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 a601a23f..418f6536 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 @@ -2,16 +2,15 @@ package com.anwen.mongo.config; import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.cache.global.HandlerCache; -import com.anwen.mongo.cache.global.InterceptorCache; +import com.anwen.mongo.cache.global.ListenerCache; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.conn.ConnectMongoDB; import com.anwen.mongo.convert.CollectionNameConvert; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.handlers.DocumentHandler; import com.anwen.mongo.handlers.MetaObjectHandler; -import com.anwen.mongo.interceptor.Interceptor; -import com.anwen.mongo.interceptor.business.BlockAttackInnerInterceptor; -import com.anwen.mongo.interceptor.business.LogInterceptor; +import com.anwen.mongo.listener.Listener; +import com.anwen.mongo.listener.business.BlockAttackInnerListener; +import com.anwen.mongo.listener.business.LogListener; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; @@ -167,18 +166,18 @@ public class MongoPlusAutoConfiguration { * @date 2023/11/22 18:39 */ private void setInterceptor(AppContext context){ - List interceptors = new ArrayList<>(); + List listeners = new ArrayList<>(); if (mongoDBLogProperty.getLog()){ - interceptors.add(new LogInterceptor()); + listeners.add(new LogListener()); } if (mongoDBCollectionProperty.getBlockAttackInner()){ - interceptors.add(new BlockAttackInnerInterceptor()); + listeners.add(new BlockAttackInnerListener()); } - List interceptorCollection = context.getBeansOfType(Interceptor.class); - if (CollUtil.isNotEmpty(interceptorCollection)){ - interceptors.addAll(interceptorCollection); + List listenerCollection = context.getBeansOfType(Listener.class); + if (CollUtil.isNotEmpty(listenerCollection)){ + listeners.addAll(listenerCollection); } - InterceptorCache.interceptors = interceptors.stream().sorted(Comparator.comparingInt(Interceptor::getOrder)).collect(Collectors.toList()); + ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); } } diff --git a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index 470c02d4..22409061 100644 --- a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -2,9 +2,9 @@ package com.anwen.mongo.config; import com.anwen.mongo.cache.global.MongoPlusClientCache; import com.anwen.mongo.convert.CollectionNameConvert; -import com.anwen.mongo.execute.ExecutorFactory; -import com.anwen.mongo.interceptor.BaseInterceptor; +import com.anwen.mongo.listener.BaseListener; import com.anwen.mongo.manager.MongoPlusClient; +import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.mapper.MongoPlusMapMapper; import com.anwen.mongo.property.MongoDBCollectionProperty; import com.anwen.mongo.property.MongoDBConnectProperty; @@ -47,7 +47,7 @@ public class MongoPlusConfiguration { @Condition(onMissingBean = MongoClient.class) public MongoClient mongoClient(){ return MongoClients.create(MongoClientSettings.builder() - .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseInterceptor())).build()); + .applyConnectionString(new ConnectionString(new UrlJoint(mongoDBConnectProperty).jointMongoUrl())).commandListenerList(Collections.singletonList(new BaseListener())).build()); } @Bean @@ -67,19 +67,10 @@ public class MongoPlusConfiguration { return MongoCollectionUtils.build(mongoDBCollectionProperty.getMappingStrategy()); } - @Bean - @Condition(onMissingBean = ExecutorFactory.class) - public ExecutorFactory executeFactory(CollectionNameConvert collectionNameConvert){ - return ExecutorFactory.builder() - .baseProperty(mongoDBConnectProperty) - .collectionNameConvert(collectionNameConvert) - .build(); - } - @Bean @Condition(onMissingBean = MongoPlusMapMapper.class) - public MongoPlusMapMapper mongoPlusMapMapper(ExecutorFactory factory) { - return new MongoPlusMapMapper(factory); + public MongoPlusMapMapper mongoPlusMapMapper(MongoPlusClient mongoPlusClient) { + return new MongoPlusMapMapper(mongoPlusClient); } @Bean("mongoTransactionalAspect") @@ -90,11 +81,11 @@ public class MongoPlusConfiguration { } @Bean - public MongoPlusAutoConfiguration mongoPlusAutoConfiguration(@Inject ExecutorFactory factory, + public MongoPlusAutoConfiguration mongoPlusAutoConfiguration(@Inject BaseMapper baseMapper, @Inject MongoPlusClient mongoPlusClient, @Inject CollectionNameConvert collectionNameConvert, @Inject("${mongo-plus}") MongoDBLogProperty mongoDBLogProperty){ - return new MongoPlusAutoConfiguration(factory,mongoPlusClient,collectionNameConvert,mongoDBLogProperty,mongoDBCollectionProperty); + return new MongoPlusAutoConfiguration(baseMapper,mongoPlusClient,collectionNameConvert,mongoDBLogProperty,mongoDBCollectionProperty); } } -- Gitee From 9bcce3f04e7a6033113c762a2d918fcf186afbd0 Mon Sep 17 00:00:00 2001 From: wangxiaoyan Date: Mon, 19 Feb 2024 10:05:44 +0800 Subject: [PATCH 14/20] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E5=99=A8=E6=94=B9=E4=B8=BA=E5=8E=9F=E6=A0=B7=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=AD=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../convert/impl/StringConversionStrategy.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java index 56d1148b..7966ff2e 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java @@ -18,12 +18,17 @@ public class StringConversionStrategy implements ConversionStrategy { @Override public String convertValue(Field field, Object obj, Object fieldValue) throws IllegalAccessException { - String value = null; try { - value = StringUtils.isNotBlankAndConvert(fieldValue); + if (fieldValue == null) { + return null; + } + if (fieldValue instanceof String) { + return (String) fieldValue; + } + return String.valueOf(fieldValue); } catch (Exception e) { logger.error("Conversion to String failed, exception message: {}",e.getMessage()); } - return value; + return null; } } -- Gitee From 64254d5bde10e721612e5a7afe314b325bd57a41 Mon Sep 17 00:00:00 2001 From: sxl <1051783464@qq.com> Date: Tue, 27 Feb 2024 11:26:58 +0800 Subject: [PATCH 15/20] =?UTF-8?q?feat:=20map=E8=BD=AC=E6=8D=A2=E5=80=BC?= =?UTF-8?q?=E6=97=B6=E5=8C=BA=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/anwen/mongo/convert/Converter.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/convert/Converter.java b/mongo-plus-core/src/main/java/com/anwen/mongo/convert/Converter.java index 3dec6456..a28dfc73 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/convert/Converter.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/convert/Converter.java @@ -1,6 +1,7 @@ package com.anwen.mongo.convert; import com.anwen.mongo.cache.global.PropertyCache; +import com.anwen.mongo.toolkit.InstantUtil; import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; @@ -8,6 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -18,11 +20,12 @@ public class Converter { /** * 将FindIterable转换为List>。 + * * @param iterable 待转换的FindIterable对象 - * @return java.util.List> 转换后的List>对象 + * @return java.util.List> 转换后的List>对象 * @author JiaChaoYang * @date 2023/6/29/029 - */ + */ public static List> convertDocumentToMap(FindIterable iterable) { List> resultList = new ArrayList<>(); try (MongoCursor cursor = iterable.iterator()) { @@ -41,24 +44,30 @@ public class Converter { return resultList; } - public static List> convertDocumentToMap(FindIterable iterable,Integer total) { + public static List> convertDocumentToMap(FindIterable iterable, Integer total) { List> resultList = new ArrayList<>(total); - for (Map map : iterable.batchSize(total)) { + for (Map map : iterable.batchSize(total)) { resultList.add(convertKeysToCamelCase(map)); } return resultList; } public static Map convertKeysToCamelCase(Map map) { - if (!PropertyCache.mapUnderscoreToCamelCase){ - return map; - } return map.entrySet().stream() .collect(Collectors.toMap( - entry -> StringUtils.convertToCamelCase(entry.getKey()), - Map.Entry::getValue) - ); + entry -> convertToCamelCaseIfNeeded(entry.getKey()), + entry -> convertValue(entry.getValue()) + )); } + private static String convertToCamelCaseIfNeeded(String key) { + return PropertyCache.mapUnderscoreToCamelCase ? StringUtils.convertToCamelCase(key) : key; + } + private static Object convertValue(Object value) { + if (value instanceof Date) { + return InstantUtil.convertTimestampToLocalDateTime(((Date) value).toInstant()); + } + return value; + } } -- Gitee From c5c759ff3387019ba2efa41c10606d2d6d5569fd Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Sat, 2 Mar 2024 13:07:34 +0800 Subject: [PATCH 16/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8DunionWith=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E4=BF=AE=E5=A4=8Dand=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/anwen/mongo/enums/AggregateTypeEnum.java | 2 +- .../com/anwen/mongo/enums/SpecialConditionEnum.java | 2 ++ .../com/anwen/mongo/conditions/BuildCondition.java | 5 +++++ .../com/anwen/mongo/conditions/interfaces/Query.java | 4 ++++ .../mongo/conditions/query/QueryChainWrapper.java | 10 ++++++++++ .../com/anwen/mongo/mapper/MongoPlusMapMapper.java | 2 +- .../main/java/com/anwen/mongo/proxy/ExecutorProxy.java | 2 -- 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/AggregateTypeEnum.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/AggregateTypeEnum.java index 2a5b88c2..64442d00 100644 --- a/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/AggregateTypeEnum.java +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/AggregateTypeEnum.java @@ -27,7 +27,7 @@ public enum AggregateTypeEnum { SAMPLE("sample"), - UNION_WITH("unionWith"), + UNION_WITH("$unionWith"), OUT("out") diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/SpecialConditionEnum.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/SpecialConditionEnum.java index 9d0f5482..7eb5daa2 100644 --- a/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/SpecialConditionEnum.java +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/enums/SpecialConditionEnum.java @@ -5,6 +5,8 @@ public enum SpecialConditionEnum { OR("$or"), + AND("$and"), + NOR("$nor"), SET("$set"), diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java index e5712766..1582f32a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java @@ -57,6 +57,11 @@ public class BuildCondition { compare.setChildCondition(Collections.singletonList(compare)); } put(SpecialConditionEnum.OR.getCondition(), buildOrQueryCondition(compare.getChildCondition())); + } else if (Objects.equals(compare.getLogicType(), LogicTypeEnum.AND.getKey())) { + if (null == compare.getChildCondition() || compare.getChildCondition().isEmpty()) { + compare.setChildCondition(Collections.singletonList(compare)); + } + put(SpecialConditionEnum.AND.getCondition(), buildOrQueryCondition(compare.getChildCondition())); } else if (Objects.equals(compare.getLogicType(), LogicTypeEnum.NOR.getKey())) { put(SpecialConditionEnum.NOR.getCondition(), buildQueryCondition(compare.getChildCondition())); } else if (Objects.equals(compare.getLogicType(), LogicTypeEnum.ELEMMATCH.getKey())) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Query.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Query.java index 267c5ee1..106e8664 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Query.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Query.java @@ -40,4 +40,8 @@ public interface Query extends Project { */ Children orderByDesc(String column); + Children limit(long limit); + + Children skip(long skip); + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java index 1b0327a7..2d44d4c1 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/QueryChainWrapper.java @@ -99,4 +99,14 @@ public abstract class QueryChainWrapper Date: Thu, 14 Mar 2024 10:09:41 +0800 Subject: [PATCH 17/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0and?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conditions/AbstractChainWrapper.java | 9 ++-- .../mongo/conditions/BuildCondition.java | 47 +++++++++++-------- .../com/anwen/mongo/mapper/BaseMapper.java | 2 +- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java index d334c69c..77de46b1 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java @@ -6,10 +6,7 @@ import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; import com.anwen.mongo.conditions.interfaces.condition.Order; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.constant.SqlOperationConstant; -import com.anwen.mongo.enums.CompareEnum; -import com.anwen.mongo.enums.LogicTypeEnum; -import com.anwen.mongo.enums.ProjectionEnum; -import com.anwen.mongo.enums.TypeEnum; +import com.anwen.mongo.enums.*; import com.anwen.mongo.support.SFunction; import com.mongodb.BasicDBObject; import org.bson.conversions.Bson; @@ -577,13 +574,13 @@ public abstract class AbstractChainWrapper compareConditionList){ - this.compareList.add(CompareCondition.builder().type(CompareEnum.QUERY.getKey()).logicType(LogicTypeEnum.OR.getKey()).childCondition(compareConditionList).build()); + this.compareList.add(CompareCondition.builder().condition(QueryOperatorEnum.OR.getValue()).type(CompareEnum.QUERY.getKey()).logicType(LogicTypeEnum.OR.getKey()).childCondition(compareConditionList).build()); return typedThis; } public Children getBaseAndCondition(List compareConditionList){ CompareCondition compareCondition = new CompareCondition(); - compareCondition.setCondition("and"); + compareCondition.setCondition(QueryOperatorEnum.AND.getValue()); compareCondition.setType(CompareEnum.QUERY.getKey()); compareCondition.setLogicType(LogicTypeEnum.AND.getKey()); compareCondition.setChildCondition(compareConditionList); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java index 1582f32a..337e36f9 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java @@ -91,27 +91,36 @@ public class BuildCondition { */ public static List buildOrQueryCondition(List compareConditionList) { return new ArrayList(){{ - compareConditionList.forEach(compare -> { - add(new MongoPlusBasicDBObject(){{ - if (Objects.equals(compare.getCondition(), QueryOperatorEnum.LIKE.getValue()) && StringUtils.isNotBlank(String.valueOf(compare.getValue()))) { - put(compare.getColumn(), new BasicDBObject(SpecialConditionEnum.REGEX.getCondition(), compare.getValue())); - } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.AND.getValue())) { - add(buildQueryCondition(compare.getChildCondition())); - } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.TEXT.getValue())) { - put(SpecialConditionEnum.TEXT.getCondition(), new BasicDBObject(SpecialConditionEnum.SEARCH.getCondition(), compare.getValue())); - IndexConstant.createIndex = compare.getColumn(); - } else if (Objects.equals(compare.getColumn(), SqlOperationConstant._ID)){ - //如果是objectId - if (ObjectId.isValid(String.valueOf(compare.getValue()))){ - put(compare.getColumn(),new BasicDBObject("$"+compare.getCondition(),new ObjectId(String.valueOf(compare.getValue())))); - } else { - put(compare.getColumn(),new BasicDBObject("$"+compare.getCondition(),String.valueOf(compare.getValue()))); - } + compareConditionList.forEach(compare -> add(new MongoPlusBasicDBObject(){{ + if (Objects.equals(compare.getCondition(), QueryOperatorEnum.LIKE.getValue()) && StringUtils.isNotBlank(String.valueOf(compare.getValue()))) { + put(compare.getColumn(), new BasicDBObject(SpecialConditionEnum.REGEX.getCondition(), compare.getValue())); + } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.OR.getValue())) { + if (null == compare.getChildCondition() || compare.getChildCondition().isEmpty()) { + compare.setChildCondition(Collections.singletonList(compare)); + } + put(SpecialConditionEnum.OR.getCondition(), buildOrQueryCondition(compare.getChildCondition())); + } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.AND.getValue())) { + if (null == compare.getChildCondition() || compare.getChildCondition().isEmpty()) { + compare.setChildCondition(Collections.singletonList(compare)); + } + put(SpecialConditionEnum.AND.getCondition(), buildOrQueryCondition(compare.getChildCondition())); + } else if (Objects.equals(compare.getLogicType(), LogicTypeEnum.NOR.getKey())) { + put(SpecialConditionEnum.NOR.getCondition(), buildQueryCondition(compare.getChildCondition())); + } else if (Objects.equals(compare.getLogicType(), LogicTypeEnum.ELEMMATCH.getKey())) { + put(compare.getColumn(),new BasicDBObject(SpecialConditionEnum.ELEM_MATCH.getCondition(),buildQueryCondition(compare.getChildCondition()))); + } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.TEXT.getValue())) { + put(SpecialConditionEnum.TEXT.getCondition(), new BasicDBObject(SpecialConditionEnum.SEARCH.getCondition(), compare.getValue())); + IndexConstant.createIndex = compare.getColumn(); + } else if (Objects.equals(compare.getColumn(), SqlOperationConstant._ID)) { + if (SpecialConditionEnum.IN.getCondition().equals("$" + compare.getCondition())) { + put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), ObjectIdUtil.convertObjectId((Collection)compare.getValue()))); } else { - put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), compare.getValue())); + put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), ObjectIdUtil.convertObjectId(compare.getValue()))); } - }}); - }); + } else { + put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), compare.getValue())); + } + }})); }}; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index c2a377c3..9974ee5b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -22,7 +22,7 @@ import java.util.List; /** * mapper层 - * TODO 名称待定,方法留CRUD + * TODO 名称待定,方法留CRUD,不同数据库实现该接口 * @author JiaChaoYang **/ public interface BaseMapper{ -- Gitee From c3fe0d0c872f8fc41cbd584e16ba94eb1fb18ecf Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Sat, 16 Mar 2024 23:02:03 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E5=B0=86JDK=E6=8F=90=E4=BE=9B=E7=9A=84Pa?= =?UTF-8?q?ir=E6=9B=BF=E6=8D=A2=E4=B8=BA=E8=87=AA=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/OverrideMongoConfiguration.java | 1 - ...goTransactionManagerAutoConfiguration.java | 1 - .../mongo/cache/global/InterceptorCache.java | 1 - .../mongo/conditions/BuildCondition.java | 1 - .../query/LambdaQueryChainInjectWrapper.java | 1 - .../query/LambdaQueryChainWrapper.java | 1 - .../update/LambdaUpdateChainWrapper.java | 1 - .../anwen/mongo/execute/AbstractExecute.java | 34 +- .../java/com/anwen/mongo/execute/Execute.java | 1 - .../execute/inject/InjectAbstractExecute.java | 2 - .../execute/instance/DefaultExecute.java | 4 - .../execute/instance/SessionExecute.java | 4 - .../com/anwen/mongo/mapper/BaseMapper.java | 3 - .../mongo/mapper/DefaultBaseMapperImpl.java | 16 +- .../com/anwen/mongo/model/MutablePair.java | 105 ++ .../main/java/com/anwen/mongo/model/Pair.java | 124 +++ .../com/anwen/mongo/proxy/ExecutorProxy.java | 3 - .../com/anwen/mongo/service/IService.java | 1 - .../anwen/mongo/service/impl/ServiceImpl.java | 31 +- .../impl/StringConversionStrategy.java | 1 - .../com/anwen/mongo/toolkit/ArrayUtils.java | 35 + .../anwen/mongo/toolkit/ChainWrappers.java | 1 - .../anwen/mongo/toolkit/builder/Builder.java | 19 + .../toolkit/builder/CompareToBuilder.java | 986 ++++++++++++++++++ .../com/anwen/mongo/config/XPluginAuto.java | 1 - 25 files changed, 1306 insertions(+), 72 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/MutablePair.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/Pair.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/Builder.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/CompareToBuilder.java diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java index 5a51f98a..4c2dc4a3 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/OverrideMongoConfiguration.java @@ -6,7 +6,6 @@ import com.mongodb.client.MongoClient; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer; -import org.springframework.context.annotation.DependsOn; /** * 覆盖MongoTemplate的MongoClient diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java index 414106bf..7a854112 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/transactional/MongoTransactionManagerAutoConfiguration.java @@ -4,7 +4,6 @@ import com.mongodb.client.MongoClient; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.DependsOn; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionManager; 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 4b9646bd..7f1a6058 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 @@ -1,7 +1,6 @@ package com.anwen.mongo.cache.global; import com.anwen.mongo.interceptor.Interceptor; -import com.anwen.mongo.listener.Listener; import java.util.ArrayList; import java.util.List; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java index 337e36f9..88387553 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java @@ -15,7 +15,6 @@ import com.anwen.mongo.toolkit.CollUtil; import com.anwen.mongo.toolkit.ObjectIdUtil; import com.anwen.mongo.toolkit.StringUtils; import com.mongodb.BasicDBObject; -import org.bson.types.ObjectId; import java.util.*; import java.util.stream.Collectors; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java index 741a4a6a..eacb9b65 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/inject/query/LambdaQueryChainInjectWrapper.java @@ -2,7 +2,6 @@ package com.anwen.mongo.conditions.inject.query; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.execute.ExecutorFactory; -import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index 1b214e8b..7af6c9cd 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -1,6 +1,5 @@ package com.anwen.mongo.conditions.query; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java index c51f752f..c91b4f55 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/update/LambdaUpdateChainWrapper.java @@ -1,6 +1,5 @@ package com.anwen.mongo.conditions.update; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.mapper.BaseMapper; public class LambdaUpdateChainWrapper extends UpdateChainWrapper> implements ChainUpdate { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java index bea5b982..047ed85c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/AbstractExecute.java @@ -29,8 +29,6 @@ import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; -import javafx.util.Pair; import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; @@ -103,8 +101,8 @@ public abstract class AbstractExecute implements Execute { public Boolean saveOrUpdateWrapper(T entity,QueryChainWrapper queryChainWrapper){ long count = count(queryChainWrapper, entity.getClass()); if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return executeUpdate(updatePair.getKey(),updatePair.getValue(),collectionManager.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return executeUpdate(updatePair.getLeft(),updatePair.getRight(),collectionManager.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() >= 1; } return save(entity); } @@ -116,8 +114,8 @@ public abstract class AbstractExecute implements Execute { if (StringUtils.isBlank(idByEntity)){ writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } else { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); } }); BulkWriteResult bulkWriteResult = executeBulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); @@ -130,8 +128,8 @@ public abstract class AbstractExecute implements Execute { entityList.forEach(entity -> { long count = count(queryChainWrapper, clazz); if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getLeft(),updatePair.getRight())); } else { writeModelList.add(new InsertOneModel<>(processIdField(entity,false))); } @@ -141,31 +139,31 @@ public abstract class AbstractExecute implements Execute { } public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return executeUpdate(updatePair.getKey(),updatePair.getValue(),collectionManager.getCollection(entity.getClass())).getModifiedCount() > 0; + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return executeUpdate(updatePair.getLeft(),updatePair.getRight(),collectionManager.getCollection(entity.getClass())).getModifiedCount() > 0; } public Boolean updateById(T entity) { - Pair basicDBObjectPair = getUpdate(entity); + MutablePair basicDBObjectPair = getUpdate(entity); MongoCollection collection = collectionManager.getCollection(ClassTypeUtil.getClass(entity)); - return executeUpdate(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),collection).getModifiedCount() >= 1; + return executeUpdate(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight(),collection).getModifiedCount() >= 1; } public Boolean updateBatchByIds(Collection entityList) { List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); }); BulkWriteResult bulkWriteResult = executeBulkWrite(writeModelList,collectionManager.getCollection(entityList.stream().findFirst().get().getClass())); return bulkWriteResult.getModifiedCount() == entityList.size(); } - public Pair getUpdate(T entity){ + public 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 Pair<>(filter,update); + return new MutablePair<>(filter,update); } public Boolean updateByColumn(T entity, SFunction column) { @@ -408,12 +406,12 @@ public abstract class AbstractExecute implements Execute { return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } - protected Pair getUpdateCondition(List compareConditionList, T entity){ + protected MutablePair getUpdateCondition(List compareConditionList, T entity){ BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); Document document = DocumentUtil.checkUpdateField(entity,false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new Pair<>(queryBasic,updateField); + return new MutablePair<>(queryBasic,updateField); } protected Document processIdField(T entity,Boolean skip){ diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java index a0311353..cd86e63d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/Execute.java @@ -9,7 +9,6 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.UpdateResult; import org.bson.Document; import org.bson.conversions.Bson; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java index db7735f3..2353f60d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java @@ -10,7 +10,6 @@ import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.convert.Converter; import com.anwen.mongo.convert.DocumentMapperConvert; import com.anwen.mongo.domain.MongoQueryException; -import com.anwen.mongo.enums.AggregateOptionsEnum; import com.anwen.mongo.enums.SpecialConditionEnum; import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.execute.Execute; @@ -29,7 +28,6 @@ import org.slf4j.LoggerFactory; import java.io.Serializable; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java index 181c0a68..09eb72cc 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java @@ -1,9 +1,6 @@ package com.anwen.mongo.execute.instance; -import com.anwen.mongo.conn.CollectionManager; -import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.convert.DocumentMapperConvert; -import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; @@ -14,7 +11,6 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.UpdateResult; import org.bson.Document; import org.bson.conversions.Bson; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index 68b1c00d..a1e9e211 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -1,9 +1,6 @@ package com.anwen.mongo.execute.instance; -import com.anwen.mongo.conn.CollectionManager; -import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.convert.DocumentMapperConvert; -import com.anwen.mongo.execute.AbstractExecute; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.model.AggregateBasicDBObject; import com.mongodb.BasicDBObject; @@ -15,7 +12,6 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.InsertManyResult; -import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.UpdateResult; import org.bson.Document; import org.bson.conversions.Bson; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index 9974ee5b..089c5222 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -1,16 +1,13 @@ package com.anwen.mongo.mapper; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; -import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; -import com.anwen.mongo.conditions.interfaces.condition.Order; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.execute.Execute; import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.PageResult; -import com.mongodb.BasicDBObject; import com.mongodb.client.model.*; import org.bson.Document; import org.bson.conversions.Bson; 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 91eaa0d3..f244f90a 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 @@ -4,9 +4,7 @@ import com.anwen.mongo.annotation.ID; import com.anwen.mongo.cache.global.HandlerCache; import com.anwen.mongo.conditions.BuildCondition; import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; -import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; import com.anwen.mongo.conditions.interfaces.condition.CompareCondition; -import com.anwen.mongo.conditions.interfaces.condition.Order; import com.anwen.mongo.conditions.query.QueryChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.constant.SqlOperationConstant; @@ -21,7 +19,6 @@ import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.model.*; import com.anwen.mongo.strategy.convert.ConversionService; -import com.anwen.mongo.support.SFunction; import com.anwen.mongo.toolkit.*; import com.mongodb.BasicDBObject; import com.mongodb.bulk.BulkWriteResult; @@ -30,7 +27,6 @@ import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; import com.mongodb.client.result.InsertManyResult; -import javafx.util.Pair; import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; @@ -118,8 +114,8 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public Boolean update(T entity,QueryChainWrapper queryChainWrapper){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return factory.getExecute().executeUpdate(updatePair.getKey(),updatePair.getValue(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return factory.getExecute().executeUpdate(updatePair.getLeft(),updatePair.getRight(),mongoPlusClient.getCollection(ClassTypeUtil.getClass(entity))).getModifiedCount() > 0; } private Boolean buildRemove(Serializable id, MongoCollection collection) { @@ -359,11 +355,11 @@ public class DefaultBaseMapperImpl implements BaseMapper { factory.getExecute().doDropIndexes(dropIndexOptions,mongoPlusClient.getCollection(clazz)); } - protected Pair getUpdate(T entity){ + 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 Pair<>(filter,update); + return new MutablePair<>(filter,update); } protected BasicDBObject checkIdType(Collection ids) { @@ -373,12 +369,12 @@ public class DefaultBaseMapperImpl implements BaseMapper { return new BasicDBObject(SqlOperationConstant._ID, new BasicDBObject(SpecialConditionEnum.IN.getCondition(), convertedIds)); } - protected Pair getUpdateCondition(List compareConditionList, T entity){ + protected MutablePair getUpdateCondition(List compareConditionList, T entity){ BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); Document document = DocumentUtil.checkUpdateField(entity,false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new Pair<>(queryBasic,updateField); + return new MutablePair<>(queryBasic,updateField); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/MutablePair.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/MutablePair.java new file mode 100644 index 00000000..32b764a5 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/MutablePair.java @@ -0,0 +1,105 @@ +package com.anwen.mongo.model; + +/** + * 可变的Pair + * + * @author JiaChaoYang + **/ +public class MutablePair extends Pair { + + /** + * 左侧对象 + * @author JiaChaoYang + * @date 2024/3/16 22:49 + */ + public L left; + + /** + * 右侧对象 + * @author JiaChaoYang + * @date 2024/3/16 22:49 + */ + public R right; + + /** + * 从两个推断泛型类型的对象中获得一对不可变的。 + * 这个工厂允许使用推理来创建对,以获得泛型类型。 + * @author JiaChaoYang + * @date 2024/3/16 22:49 + */ + public static MutablePair of(final L left, final R right) { + return new MutablePair<>(left, right); + } + + /** + * 创建两个null的新对实例 + * @author JiaChaoYang + * @date 2024/3/16 22:49 + */ + public MutablePair() { + super(); + } + + /** + * 创建一个新的配对实例。 + * @author JiaChaoYang + * @date 2024/3/16 22:50 + */ + public MutablePair(final L left, final R right) { + super(); + this.left = left; + this.right = right; + } + + //----------------------------------------------------------------------- + /** + * {@inheritDoc} + * @author JiaChaoYang + * @date 2024/3/16 22:50 + */ + @Override + public L getLeft() { + return left; + } + + /** + * 设置该对的左侧元素 + * @author JiaChaoYang + * @date 2024/3/16 22:50 + */ + public void setLeft(final L left) { + this.left = left; + } + + /** + * {@inheritDoc} + * @author JiaChaoYang + * @date 2024/3/16 22:50 + */ + @Override + public R getRight() { + return right; + } + + /** + * 设置对的右侧元素 + * @author JiaChaoYang + * @date 2024/3/16 22:51 + */ + public void setRight(final R right) { + this.right = right; + } + + /** + * 这设置了对中正确的元素 + * @author JiaChaoYang + * @date 2024/3/16 22:51 + */ + @Override + public R setValue(final R value) { + final R result = getRight(); + setRight(value); + return result; + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/Pair.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/Pair.java new file mode 100644 index 00000000..b59bdc85 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/Pair.java @@ -0,0 +1,124 @@ +package com.anwen.mongo.model; + +import com.anwen.mongo.toolkit.builder.CompareToBuilder; + +import java.io.Serializable; +import java.util.Map; +import java.util.Objects; + +/** + * 由两个元素组成的一对。 + * 这个类是定义基本API的抽象实现。它将元素称为“左”和“右”。它还实现了Map。输入接口,其中键为“left”,值为“right”。 + * 子类实现可以是可变的,也可以是不可变的。然而,对可以存储的存储对象的类型没有限制。如果可变对象存储在对中,那么对本身实际上就是可变的。 + * @author JiaChaoYang + **/ +public abstract class Pair implements Map.Entry, Comparable>, Serializable { + + + private static final long serialVersionUID = 5257775966081801053L; + + /** + * 从两个推断泛型类型的对象中获得一对不可变的。 + * 这个工厂允许使用推理来创建对,以获得泛型类型 + * @author JiaChaoYang + * @date 2024/3/16 22:48 + */ + public static Pair of(final L left, final R right) { + return new MutablePair<>(left, right); + } + + /** + * 从该对中获取左侧元素 + * @author JiaChaoYang + * @date 2024/3/16 22:47 + */ + public abstract L getLeft(); + + /** + * 从这对中获取右侧元素 + * @author JiaChaoYang + * @date 2024/3/16 22:47 + */ + public abstract R getRight(); + + /** + * 从这对中获取KEY。 + * @author JiaChaoYang + * @date 2024/3/16 22:47 + */ + @Override + public final L getKey() { + return getLeft(); + } + + /** + * 从该对中获取值 + * @author JiaChaoYang + * @date 2024/3/16 22:47 + */ + @Override + public R getValue() { + return getRight(); + } + + /** + * 比较基于左元素和右元素的对。类型必须是可比较的。 + * @author JiaChaoYang + * @date 2024/3/16 22:47 + */ + @Override + public int compareTo(final Pair other) { + return new CompareToBuilder().append(getLeft(), other.getLeft()) + .append(getRight(), other.getRight()).toComparison(); + } + + /** + * 根据这两个元素将此对与另一对进行比较。 + * @author JiaChaoYang + * @date 2024/3/16 22:46 + */ + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (obj instanceof Map.Entry) { + final Map.Entry other = (Map.Entry) obj; + return Objects.equals(getKey(), other.getKey()) + && Objects.equals(getValue(), other.getValue()); + } + return false; + } + + /** + * 返回合适的哈希代码。哈希代码遵循Map中的定义 + * @author JiaChaoYang + * @date 2024/3/16 22:52 + */ + @Override + public int hashCode() { + // see Map.Entry API specification + return (getKey() == null ? 0 : getKey().hashCode()) ^ + (getValue() == null ? 0 : getValue().hashCode()); + } + + /** + * 使用格式($left,$right)返回此对的字符串表示形式 + * @author JiaChaoYang + * @date 2024/3/16 22:52 + */ + @Override + public String toString() { + return new StringBuilder().append('(').append(getLeft()).append(',').append(getRight()).append(')').toString(); + } + + /** + * 使用给定的格式格式化接收器。 + * 这使用java.util。Formattable以执行格式化。可以使用两个变量来嵌入左元素和右元素。将%1$s用于左侧元素(键),将%2$s用于右侧元素(值)。toString()使用的默认格式是(%1$s,%2$s)。 + * @author JiaChaoYang + * @date 2024/3/16 22:52 + */ + public String toString(final String format) { + return String.format(format, getLeft(), getRight()); + } +} 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 a630bc8f..cbb58f99 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.alibaba.fastjson.JSON; import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.execute.Execute; @@ -10,8 +9,6 @@ import com.mongodb.client.model.CountOptions; import com.mongodb.client.model.WriteModel; import org.bson.Document; import org.bson.conversions.Bson; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java index 20dbf656..224e9a54 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java @@ -4,7 +4,6 @@ import com.anwen.mongo.conditions.aggregate.AggregateChainWrapper; import com.anwen.mongo.conditions.aggregate.LambdaAggregateChainWrapper; 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.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.model.PageParam; 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 cdc588df..486f10da 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 @@ -11,8 +11,8 @@ import com.anwen.mongo.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.enums.SpecialConditionEnum; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.mapper.BaseMapper; +import com.anwen.mongo.model.MutablePair; import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; import com.anwen.mongo.service.IService; @@ -21,7 +21,6 @@ import com.anwen.mongo.toolkit.*; import com.mongodb.BasicDBObject; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.*; -import javafx.util.Pair; import org.bson.Document; import org.bson.conversions.Bson; import org.bson.types.ObjectId; @@ -117,18 +116,18 @@ public class ServiceImpl implements IService{ public Boolean saveOrUpdateWrapper(T entity, QueryChainWrapper queryChainWrapper) { long count = count(queryChainWrapper); if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - return baseMapper.update(updatePair.getKey(),updatePair.getValue(),ClassTypeUtil.getClass(entity)) >= 1; + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + return baseMapper.update(updatePair.getLeft(),updatePair.getRight(),ClassTypeUtil.getClass(entity)) >= 1; } return save(entity); } - protected Pair getUpdateCondition(List compareConditionList, T entity){ + protected MutablePair getUpdateCondition(List compareConditionList, T entity){ BasicDBObject queryBasic = BuildCondition.buildQueryCondition(compareConditionList); Document document = DocumentUtil.checkUpdateField(entity,false); document.remove(SqlOperationConstant._ID); BasicDBObject updateField = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), document); - return new Pair<>(queryBasic,updateField); + return new MutablePair<>(queryBasic,updateField); } @Override @@ -139,8 +138,8 @@ public class ServiceImpl implements IService{ if (StringUtils.isBlank(idByEntity)){ writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity,false))); } else { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); } }); return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); @@ -153,8 +152,8 @@ public class ServiceImpl implements IService{ entityList.forEach(entity -> { long count = baseMapper.count(queryChainWrapper, clazz); if (count > 0){ - Pair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); - writeModelList.add(new UpdateManyModel<>(updatePair.getKey(),updatePair.getValue())); + MutablePair updatePair = getUpdateCondition(queryChainWrapper.getCompareList(), entity); + writeModelList.add(new UpdateManyModel<>(updatePair.getLeft(),updatePair.getRight())); } else { writeModelList.add(new InsertOneModel<>(baseMapper.processIdField(entity,false))); } @@ -164,23 +163,23 @@ public class ServiceImpl implements IService{ @Override public Boolean updateById(T entity) { - Pair basicDBObjectPair = getUpdate(entity); - return baseMapper.update(basicDBObjectPair.getKey(),basicDBObjectPair.getValue(),ClassTypeUtil.getClass(entity)) >= 1; + MutablePair basicDBObjectPair = getUpdate(entity); + return baseMapper.update(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight(),ClassTypeUtil.getClass(entity)) >= 1; } - protected Pair getUpdate(T entity) { + 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 Pair<>(filter,update); + return new MutablePair<>(filter,update); } @Override public Boolean updateBatchByIds(Collection entityList) { List> writeModelList = new ArrayList<>(); entityList.forEach(entity -> { - Pair basicDBObjectPair = getUpdate(entity); - writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getKey(),basicDBObjectPair.getValue())); + MutablePair basicDBObjectPair = getUpdate(entity); + writeModelList.add(new UpdateManyModel<>(basicDBObjectPair.getLeft(),basicDBObjectPair.getRight())); }); return baseMapper.bulkWrite(writeModelList,entityList.stream().findFirst().get().getClass()) == entityList.size(); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java index 7966ff2e..0e873e9d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/convert/impl/StringConversionStrategy.java @@ -1,7 +1,6 @@ package com.anwen.mongo.strategy.convert.impl; import com.anwen.mongo.strategy.convert.ConversionStrategy; -import com.anwen.mongo.toolkit.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ArrayUtils.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ArrayUtils.java index 785f1d32..e1f1b858 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ArrayUtils.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ArrayUtils.java @@ -10,6 +10,10 @@ package com.anwen.mongo.toolkit; */ public final class ArrayUtils { + public static final int INDEX_NOT_FOUND = -1; + + public static final String[] EMPTY_STRING_ARRAY = new String[0]; + private ArrayUtils() { } @@ -34,4 +38,35 @@ public final class ArrayUtils { return !isEmpty(array); } + public static boolean contains(final Object[] array, final Object objectToFind) { + return indexOf(array, objectToFind) != INDEX_NOT_FOUND; + } + + public static int indexOf(final Object[] array, final Object objectToFind) { + return indexOf(array, objectToFind, 0); + } + + public static int indexOf(final Object[] array, final Object objectToFind, int startIndex) { + if (array == null) { + return INDEX_NOT_FOUND; + } + if (startIndex < 0) { + startIndex = 0; + } + if (objectToFind == null) { + for (int i = startIndex; i < array.length; i++) { + if (array[i] == null) { + return i; + } + } + } else if (array.getClass().getComponentType().isInstance(objectToFind)) { + for (int i = startIndex; i < array.length; i++) { + if (objectToFind.equals(array[i])) { + return i; + } + } + } + return INDEX_NOT_FOUND; + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java index e779ace9..9f3d2fe2 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/ChainWrappers.java @@ -12,7 +12,6 @@ import com.anwen.mongo.conditions.query.QueryWrapper; import com.anwen.mongo.conditions.update.LambdaUpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateChainWrapper; import com.anwen.mongo.conditions.update.UpdateWrapper; -import com.anwen.mongo.execute.ExecutorFactory; import com.anwen.mongo.mapper.BaseMapper; import java.util.Map; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/Builder.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/Builder.java new file mode 100644 index 00000000..a63b4830 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/Builder.java @@ -0,0 +1,19 @@ +package com.anwen.mongo.toolkit.builder; + +/** + * 生成器接口用于在生成器设计模式中将类指定为生成器对象。构建器能够创建和配置对象或结果,这些对象或结果通常需要多个步骤才能构建,或者派生起来非常复杂。 + * 生成器接口定义了类必须实现的单个方法build()。此方法的结果应该是执行所有构建操作后的最终配置对象或结果。 + * 建议使用为配置正在构建的对象或结果而提供的方法返回对此的引用,以便将方法调用链接在一起。 + * @author JiaChaoYang + * @date 2024/3/16 22:41 +*/ +public interface Builder { + + /** + * 返回对构建器正在构建的对象或正在计算的结果的引用。 + * @author JiaChaoYang + * @date 2024/3/16 22:41 + */ + T build(); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/CompareToBuilder.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/CompareToBuilder.java new file mode 100644 index 00000000..c5d9a425 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/builder/CompareToBuilder.java @@ -0,0 +1,986 @@ +package com.anwen.mongo.toolkit.builder; + +import com.anwen.mongo.toolkit.ArrayUtils; + +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +/** + * 协助实现Comparable.compareTo(Object)方法。 + * 它与EqualsBuilder和HashCodeBuilder构建的equals(Object)和hashcode()一致。 + * 使用equals(Object)比较相等的两个对象通常也应使用compareTo(Object)进行相等比较。 + * 所有相关字段都应包括在比较的计算中。派生字段可能会被忽略。compareTo(Object)和equals(Object)中应以相同的顺序使用相同的字段。 + * 要使用此类,请编写以下代码: + * 公共类MyClass{ + * 字符串字段1; + * int字段2; + * 布尔字段3; + * ... + * public int compareTo(对象o){ + * MyClass MyClass=(MyClass)o; + * 返回new CompareToBuilder() + * .appendSuper(super.compareTo(o) + * .append(this.field1,myClass.field1) + * .append(this.field2,myClass.field2) + * .append(this.field3,myClass.field3) + * .toComparison(); + * } + * } + * 或者,也有使用反射的reflectionCompare方法 + * @author JiaChaoYang + **/ +public class CompareToBuilder implements Builder { + /** + * Current state of the comparison as appended fields are checked. + */ + private int comparison; + + /** + *

Constructor for CompareToBuilder.

+ * + *

Starts off assuming that the objects are equal. Multiple calls are + * then made to the various append methods, followed by a call to + * {@link #toComparison} to get the result.

+ */ + public CompareToBuilder() { + super(); + comparison = 0; + } + + //----------------------------------------------------------------------- + /** + *

Compares two Objects via reflection.

+ * + *

Fields can be private, thus AccessibleObject.setAccessible + * is used to bypass normal access control checks. This will fail under a + * security manager unless the appropriate permissions are set.

+ * + *
    + *
  • Static fields will not be compared
  • + *
  • Transient members will be not be compared, as they are likely derived + * fields
  • + *
  • Superclass fields will be compared
  • + *
+ * + *

If both lhs and rhs are null, + * they are considered equal.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @return a negative integer, zero, or a positive integer as lhs + * is less than, equal to, or greater than rhs + * @throws NullPointerException if either (but not both) parameters are + * null + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + */ + public static int reflectionCompare(final Object lhs, final Object rhs) { + return reflectionCompare(lhs, rhs, false, null); + } + + /** + *

Compares two Objects via reflection.

+ * + *

Fields can be private, thus AccessibleObject.setAccessible + * is used to bypass normal access control checks. This will fail under a + * security manager unless the appropriate permissions are set.

+ * + *
    + *
  • Static fields will not be compared
  • + *
  • If compareTransients is true, + * compares transient members. Otherwise ignores them, as they + * are likely derived fields.
  • + *
  • Superclass fields will be compared
  • + *
+ * + *

If both lhs and rhs are null, + * they are considered equal.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param compareTransients whether to compare transient fields + * @return a negative integer, zero, or a positive integer as lhs + * is less than, equal to, or greater than rhs + * @throws NullPointerException if either lhs or rhs + * (but not both) is null + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + */ + public static int reflectionCompare(final Object lhs, final Object rhs, final boolean compareTransients) { + return reflectionCompare(lhs, rhs, compareTransients, null); + } + + /** + *

Compares two Objects via reflection.

+ * + *

Fields can be private, thus AccessibleObject.setAccessible + * is used to bypass normal access control checks. This will fail under a + * security manager unless the appropriate permissions are set.

+ * + *
    + *
  • Static fields will not be compared
  • + *
  • If compareTransients is true, + * compares transient members. Otherwise ignores them, as they + * are likely derived fields.
  • + *
  • Superclass fields will be compared
  • + *
+ * + *

If both lhs and rhs are null, + * they are considered equal.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param excludeFields Collection of String fields to exclude + * @return a negative integer, zero, or a positive integer as lhs + * is less than, equal to, or greater than rhs + * @throws NullPointerException if either lhs or rhs + * (but not both) is null + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + * @since 2.2 + */ + public static int reflectionCompare(final Object lhs, final Object rhs, final Collection excludeFields) { + return reflectionCompare(lhs, rhs, toNoNullStringArray(excludeFields)); + } + + /** + *

Compares two Objects via reflection.

+ * + *

Fields can be private, thus AccessibleObject.setAccessible + * is used to bypass normal access control checks. This will fail under a + * security manager unless the appropriate permissions are set.

+ * + *
    + *
  • Static fields will not be compared
  • + *
  • If compareTransients is true, + * compares transient members. Otherwise ignores them, as they + * are likely derived fields.
  • + *
  • Superclass fields will be compared
  • + *
+ * + *

If both lhs and rhs are null, + * they are considered equal.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param excludeFields array of fields to exclude + * @return a negative integer, zero, or a positive integer as lhs + * is less than, equal to, or greater than rhs + * @throws NullPointerException if either lhs or rhs + * (but not both) is null + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + * @since 2.2 + */ + public static int reflectionCompare(final Object lhs, final Object rhs, final String... excludeFields) { + return reflectionCompare(lhs, rhs, false, null, excludeFields); + } + + /** + *

Compares two Objects via reflection.

+ * + *

Fields can be private, thus AccessibleObject.setAccessible + * is used to bypass normal access control checks. This will fail under a + * security manager unless the appropriate permissions are set.

+ * + *
    + *
  • Static fields will not be compared
  • + *
  • If the compareTransients is true, + * compares transient members. Otherwise ignores them, as they + * are likely derived fields.
  • + *
  • Compares superclass fields up to and including reflectUpToClass. + * If reflectUpToClass is null, compares all superclass fields.
  • + *
+ * + *

If both lhs and rhs are null, + * they are considered equal.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param compareTransients whether to compare transient fields + * @param reflectUpToClass last superclass for which fields are compared + * @param excludeFields fields to exclude + * @return a negative integer, zero, or a positive integer as lhs + * is less than, equal to, or greater than rhs + * @throws NullPointerException if either lhs or rhs + * (but not both) is null + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + * @since 2.2 (2.0 as reflectionCompare(Object, Object, boolean, Class)) + */ + public static int reflectionCompare( + final Object lhs, + final Object rhs, + final boolean compareTransients, + final Class reflectUpToClass, + final String... excludeFields) { + + if (lhs == rhs) { + return 0; + } + if (lhs == null || rhs == null) { + throw new NullPointerException(); + } + Class lhsClazz = lhs.getClass(); + if (!lhsClazz.isInstance(rhs)) { + throw new ClassCastException(); + } + final CompareToBuilder compareToBuilder = new CompareToBuilder(); + reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, compareTransients, excludeFields); + while (lhsClazz.getSuperclass() != null && lhsClazz != reflectUpToClass) { + lhsClazz = lhsClazz.getSuperclass(); + reflectionAppend(lhs, rhs, lhsClazz, compareToBuilder, compareTransients, excludeFields); + } + return compareToBuilder.toComparison(); + } + + /** + *

Appends to builder the comparison of lhs + * to rhs using the fields defined in clazz.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param clazz Class that defines fields to be compared + * @param builder CompareToBuilder to append to + * @param useTransients whether to compare transient fields + * @param excludeFields fields to exclude + */ + private static void reflectionAppend( + final Object lhs, + final Object rhs, + final Class clazz, + final CompareToBuilder builder, + final boolean useTransients, + final String[] excludeFields) { + + final Field[] fields = clazz.getDeclaredFields(); + AccessibleObject.setAccessible(fields, true); + for (int i = 0; i < fields.length && builder.comparison == 0; i++) { + final Field f = fields[i]; + if (!ArrayUtils.contains(excludeFields, f.getName()) + && (f.getName().indexOf('$') == -1) + && (useTransients || !Modifier.isTransient(f.getModifiers())) + && (!Modifier.isStatic(f.getModifiers()))) { + try { + builder.append(f.get(lhs), f.get(rhs)); + } catch (final IllegalAccessException e) { + // This can't happen. Would get a Security exception instead. + // Throw a runtime exception in case the impossible happens. + throw new InternalError("Unexpected IllegalAccessException"); + } + } + } + } + + //----------------------------------------------------------------------- + /** + *

Appends to the builder the compareTo(Object) + * result of the superclass.

+ * + * @param superCompareTo result of calling super.compareTo(Object) + * @return this - used to chain append calls + * @since 2.0 + */ + public CompareToBuilder appendSuper(final int superCompareTo) { + if (comparison != 0) { + return this; + } + comparison = superCompareTo; + return this; + } + + //----------------------------------------------------------------------- + /** + *

Appends to the builder the comparison of + * two Objects.

+ * + *
    + *
  1. Check if lhs == rhs
  2. + *
  3. Check if either lhs or rhs is null, + * a null object is less than a non-null object
  4. + *
  5. Check the object contents
  6. + *
+ * + *

lhs must either be an array or implement {@link Comparable}.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @return this - used to chain append calls + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + */ + public CompareToBuilder append(final Object lhs, final Object rhs) { + return append(lhs, rhs, null); + } + + /** + *

Appends to the builder the comparison of + * two Objects.

+ * + *
    + *
  1. Check if lhs == rhs
  2. + *
  3. Check if either lhs or rhs is null, + * a null object is less than a non-null object
  4. + *
  5. Check the object contents
  6. + *
+ * + *

If lhs is an array, array comparison methods will be used. + * Otherwise comparator will be used to compare the objects. + * If comparator is null, lhs must + * implement {@link Comparable} instead.

+ * + * @param lhs left-hand object + * @param rhs right-hand object + * @param comparator Comparator used to compare the objects, + * null means treat lhs as Comparable + * @return this - used to chain append calls + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + * @since 2.0 + */ + public CompareToBuilder append(final Object lhs, final Object rhs, final Comparator comparator) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.getClass().isArray()) { + // switch on type of array, to dispatch to the correct handler + // handles multi dimensional arrays + // throws a ClassCastException if rhs is not the correct array type + if (lhs instanceof long[]) { + append((long[]) lhs, (long[]) rhs); + } else if (lhs instanceof int[]) { + append((int[]) lhs, (int[]) rhs); + } else if (lhs instanceof short[]) { + append((short[]) lhs, (short[]) rhs); + } else if (lhs instanceof char[]) { + append((char[]) lhs, (char[]) rhs); + } else if (lhs instanceof byte[]) { + append((byte[]) lhs, (byte[]) rhs); + } else if (lhs instanceof double[]) { + append((double[]) lhs, (double[]) rhs); + } else if (lhs instanceof float[]) { + append((float[]) lhs, (float[]) rhs); + } else if (lhs instanceof boolean[]) { + append((boolean[]) lhs, (boolean[]) rhs); + } else { + // not an array of primitives + // throws a ClassCastException if rhs is not an array + append((Object[]) lhs, (Object[]) rhs, comparator); + } + } else { + // the simple case, not an array, just test the element + if (comparator == null) { + @SuppressWarnings("unchecked") // assume this can be done; if not throw CCE as per Javadoc + final Comparable comparable = (Comparable) lhs; + comparison = comparable.compareTo(rhs); + } else { + @SuppressWarnings("unchecked") // assume this can be done; if not throw CCE as per Javadoc + final Comparator comparator2 = (Comparator) comparator; + comparison = comparator2.compare(lhs, rhs); + } + } + return this; + } + + //------------------------------------------------------------------------- + /** + * Appends to the builder the comparison of + * two longs. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final long lhs, final long rhs) { + if (comparison != 0) { + return this; + } + comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + return this; + } + + /** + * Appends to the builder the comparison of + * two ints. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final int lhs, final int rhs) { + if (comparison != 0) { + return this; + } + comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + return this; + } + + /** + * Appends to the builder the comparison of + * two shorts. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final short lhs, final short rhs) { + if (comparison != 0) { + return this; + } + comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + return this; + } + + /** + * Appends to the builder the comparison of + * two chars. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final char lhs, final char rhs) { + if (comparison != 0) { + return this; + } + comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + return this; + } + + /** + * Appends to the builder the comparison of + * two bytes. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final byte lhs, final byte rhs) { + if (comparison != 0) { + return this; + } + comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + return this; + } + + /** + *

Appends to the builder the comparison of + * two doubles.

+ * + *

This handles NaNs, Infinities, and -0.0.

+ * + *

It is compatible with the hash code generated by + * HashCodeBuilder.

+ * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final double lhs, final double rhs) { + if (comparison != 0) { + return this; + } + comparison = Double.compare(lhs, rhs); + return this; + } + + /** + *

Appends to the builder the comparison of + * two floats.

+ * + *

This handles NaNs, Infinities, and -0.0.

+ * + *

It is compatible with the hash code generated by + * HashCodeBuilder.

+ * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final float lhs, final float rhs) { + if (comparison != 0) { + return this; + } + comparison = Float.compare(lhs, rhs); + return this; + } + + /** + * Appends to the builder the comparison of + * two booleanss. + * + * @param lhs left-hand value + * @param rhs right-hand value + * @return this - used to chain append calls + */ + public CompareToBuilder append(final boolean lhs, final boolean rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == false) { + comparison = -1; + } else { + comparison = +1; + } + return this; + } + + //----------------------------------------------------------------------- + /** + *

Appends to the builder the deep comparison of + * two Object arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a short length array is less than a long length array
  6. + *
  7. Check array contents element by element using {@link #append(Object, Object, Comparator)}
  8. + *
+ * + *

This method will also will be called for the top level of multi-dimensional, + * ragged, and multi-typed arrays.

+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + */ + public CompareToBuilder append(final Object[] lhs, final Object[] rhs) { + return append(lhs, rhs, null); + } + + /** + *

Appends to the builder the deep comparison of + * two Object arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a short length array is less than a long length array
  6. + *
  7. Check array contents element by element using {@link #append(Object, Object, Comparator)}
  8. + *
+ * + *

This method will also will be called for the top level of multi-dimensional, + * ragged, and multi-typed arrays.

+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @param comparator Comparator to use to compare the array elements, + * null means to treat lhs elements as Comparable. + * @return this - used to chain append calls + * @throws ClassCastException if rhs is not assignment-compatible + * with lhs + * @since 2.0 + */ + public CompareToBuilder append(final Object[] lhs, final Object[] rhs, final Comparator comparator) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i], comparator); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two long arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(long, long)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final long[] lhs, final long[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two int arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(int, int)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final int[] lhs, final int[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two short arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(short, short)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final short[] lhs, final short[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two char arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(char, char)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final char[] lhs, final char[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two byte arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(byte, byte)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final byte[] lhs, final byte[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two double arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(double, double)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final double[] lhs, final double[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two float arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(float, float)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final float[] lhs, final float[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + /** + *

Appends to the builder the deep comparison of + * two boolean arrays.

+ * + *
    + *
  1. Check if arrays are the same using ==
  2. + *
  3. Check if for null, null is less than non-null
  4. + *
  5. Check array length, a shorter length array is less than a longer length array
  6. + *
  7. Check array contents element by element using {@link #append(boolean, boolean)}
  8. + *
+ * + * @param lhs left-hand array + * @param rhs right-hand array + * @return this - used to chain append calls + */ + public CompareToBuilder append(final boolean[] lhs, final boolean[] rhs) { + if (comparison != 0) { + return this; + } + if (lhs == rhs) { + return this; + } + if (lhs == null) { + comparison = -1; + return this; + } + if (rhs == null) { + comparison = +1; + return this; + } + if (lhs.length != rhs.length) { + comparison = (lhs.length < rhs.length) ? -1 : +1; + return this; + } + for (int i = 0; i < lhs.length && comparison == 0; i++) { + append(lhs[i], rhs[i]); + } + return this; + } + + //----------------------------------------------------------------------- + /** + * Returns a negative integer, a positive integer, or zero as + * the builder has judged the "left-hand" side + * as less than, greater than, or equal to the "right-hand" + * side. + * + * @return final comparison result + * @see #build() + */ + public int toComparison() { + return comparison; + } + + /** + * Returns a negative Integer, a positive Integer, or zero as + * the builder has judged the "left-hand" side + * as less than, greater than, or equal to the "right-hand" + * side. + * + * @return final comparison result as an Integer + * @see #toComparison() + * @since 3.0 + */ + @Override + public Integer build() { + return Integer.valueOf(toComparison()); + } + + static String[] toNoNullStringArray(final Collection collection) { + if (collection == null) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + return toNoNullStringArray(collection.toArray()); + } + + static String[] toNoNullStringArray(final Object[] array) { + final List list = new ArrayList(array.length); + for (final Object e : array) { + if (e != null) { + list.add(e.toString()); + } + } + return list.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + } + +} diff --git a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/XPluginAuto.java b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/XPluginAuto.java index d2b9e0d6..bfbe8748 100644 --- a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/XPluginAuto.java +++ b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/XPluginAuto.java @@ -1,7 +1,6 @@ package com.anwen.mongo.config; import com.anwen.mongo.annotation.transactional.MongoTransactional; -import com.anwen.mongo.cache.global.MongoPlusClientCache; import com.anwen.mongo.property.MongoDBFieldProperty; import com.anwen.mongo.transactional.MongoTransactionalAspect; import com.mongodb.client.MongoClient; -- Gitee From 7299a51f16aa19bba955fbc63277cef8b9405481 Mon Sep 17 00:00:00 2001 From: "Mr.Jia" Date: Sun, 17 Mar 2024 01:19:39 +0800 Subject: [PATCH 19/20] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9ELis?= =?UTF-8?q?t=E7=9A=84page=E6=96=B9=E6=B3=95;2.=E4=BC=98=E5=8C=96=E9=AB=98?= =?UTF-8?q?=E6=95=88=E7=8E=87count=E6=9F=A5=E8=AF=A2(=E6=97=A0=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=83=85=E5=86=B5=E4=B8=8B);3.=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=99=A8=E7=94=A8=E6=B3=95;4.=E6=89=A9?= =?UTF-8?q?=E5=B1=95Document=E5=92=8CBasicDBObject=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81Lambda=E5=BD=A2=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MongoPlusAutoConfiguration.java | 17 +++- .../MongoPlusBasicDBObject.java | 18 +++- .../anwen/mongo/bson/MongoPlusDocument.java | 42 +++++++++ .../com/anwen/mongo/build/GroupBuilder.java | 2 +- .../conditions/AbstractChainWrapper.java | 40 +++++++++ .../mongo/conditions/BuildCondition.java | 3 +- .../mongo/conditions/interfaces/Compare.java | 84 ++++++++++++++++++ .../mongo/conditions/query/ChainQuery.java | 1 + .../query/LambdaQueryChainWrapper.java | 1 + .../java/com/anwen/mongo/execute/Execute.java | 2 + .../execute/inject/InjectAbstractExecute.java | 6 +- .../execute/instance/DefaultExecute.java | 5 ++ .../execute/instance/SessionExecute.java | 5 ++ .../anwen/mongo/interceptor/Interceptor.java | 51 ++++++++--- .../com/anwen/mongo/mapper/BaseMapper.java | 3 + .../mongo/mapper/DefaultBaseMapperImpl.java | 46 +++++++--- .../com/anwen/mongo/model/QueryParam.java | 86 +++++++++++++++++++ .../com/anwen/mongo/proxy/ExecutorProxy.java | 23 +++-- .../com/anwen/mongo/service/IService.java | 32 +++++++ .../anwen/mongo/service/impl/ServiceImpl.java | 21 +++++ .../aggregate/impl/SortConcretePipeline.java | 2 +- .../anwen/mongo/toolkit/LambdaOperate.java | 7 ++ 22 files changed, 453 insertions(+), 44 deletions(-) rename mongo-plus-core/src/main/java/com/anwen/mongo/{conditions => bson}/MongoPlusBasicDBObject.java (53%) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusDocument.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/model/QueryParam.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 15b8ef8d..98bfd47a 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 @@ -2,12 +2,14 @@ package com.anwen.mongo.config; import com.anwen.mongo.annotation.collection.CollectionName; import com.anwen.mongo.cache.global.HandlerCache; +import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.cache.global.ListenerCache; import com.anwen.mongo.conn.CollectionManager; import com.anwen.mongo.conn.ConnectMongoDB; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.handlers.DocumentHandler; import com.anwen.mongo.handlers.MetaObjectHandler; +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; @@ -65,6 +67,7 @@ public class MongoPlusAutoConfiguration implements InitializingBean { setConversion(); setMetaObjectHandler(); setDocumentHandler(); + setListener(); setInterceptor(); this.baseMapper = baseMapper; } @@ -163,11 +166,11 @@ public class MongoPlusAutoConfiguration implements InitializingBean { } /** - * 从Bean中拿到拦截器 + * 从Bean中拿到监听器 * @author JiaChaoYang * @date 2023/11/22 18:39 */ - private void setInterceptor(){ + private void setListener(){ List listeners = new ArrayList<>(); if (mongodbLogProperty.getLog()){ listeners.add(new LogListener()); @@ -182,4 +185,14 @@ public class MongoPlusAutoConfiguration implements InitializingBean { ListenerCache.listeners = listeners.stream().sorted(Comparator.comparingInt(Listener::getOrder)).collect(Collectors.toList()); } + /** + * 从Bean中拿到拦截器 + * @author JiaChaoYang + * @date 2024/3/17 0:30 + */ + private void setInterceptor(){ + Collection interceptorCollection = applicationContext.getBeansOfType(Interceptor.class).values(); + InterceptorCache.interceptors = new ArrayList<>(interceptorCollection); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/MongoPlusBasicDBObject.java b/mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusBasicDBObject.java similarity index 53% rename from mongo-plus-core/src/main/java/com/anwen/mongo/conditions/MongoPlusBasicDBObject.java rename to mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusBasicDBObject.java index 58bde45f..d356b442 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/MongoPlusBasicDBObject.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusBasicDBObject.java @@ -1,15 +1,27 @@ -package com.anwen.mongo.conditions; +package com.anwen.mongo.bson; +import com.anwen.mongo.support.SFunction; import com.mongodb.BasicDBObject; /** + * 支持lambda的BasicDBObject * @author JiaChaoYang - * @project mongo-plus - * @description * @date 2023-11-14 15:01 **/ public class MongoPlusBasicDBObject extends BasicDBObject { + public void put(SFunction key,BasicDBObject value){ + put(key.getFieldNameLine(),value); + } + + public void append(SFunction key,BasicDBObject value){ + super.append(key.getFieldNameLine(),value); + } + + public void get(SFunction key){ + super.get(key.getFieldNameLine()); + } + public void put(String key,BasicDBObject value){ if (containsKey(key)){ super.put(key,new BasicDBObject((BasicDBObject) get(key)){{ diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusDocument.java b/mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusDocument.java new file mode 100644 index 00000000..6eec934a --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/bson/MongoPlusDocument.java @@ -0,0 +1,42 @@ +package com.anwen.mongo.bson; + +import com.anwen.mongo.support.SFunction; +import org.bson.Document; + +import java.util.Map; + +/** + * 可以使用lambda的Document + * + * @author JiaChaoYang + **/ +public class MongoPlusDocument extends Document { + + public MongoPlusDocument() { + } + + public MongoPlusDocument(String key, Object value) { + super(key, value); + } + + public MongoPlusDocument(Map map) { + super(map); + } + + public void put(SFunction key, Object value){ + super.put(key.getFieldNameLine(),value); + } + + public void append(SFunction key,Object value){ + super.append(key.getFieldNameLine(),value); + } + + public Object get(SFunction key){ + return super.get(key.getFieldNameLine()); + } + + public D get(SFunction key,Class clazz){ + return super.get(key.getFieldNameLine(),clazz); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/build/GroupBuilder.java b/mongo-plus-core/src/main/java/com/anwen/mongo/build/GroupBuilder.java index 2b864879..1f4e5a0d 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/build/GroupBuilder.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/build/GroupBuilder.java @@ -1,7 +1,7 @@ package com.anwen.mongo.build; +import com.anwen.mongo.bson.MongoPlusBasicDBObject; import com.anwen.mongo.conditions.BuildCondition; -import com.anwen.mongo.conditions.MongoPlusBasicDBObject; import com.anwen.mongo.conditions.accumulator.Accumulator; import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.model.GroupField; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java index 77de46b1..18c1b65a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/AbstractChainWrapper.java @@ -211,6 +211,46 @@ public abstract class AbstractChainWrapper column, Object value) { + return condition ? likeLeft(column,value) : typedThis; + } + + @Override + public Children likeLeft(SFunction column, Object value) { + return like(column,"^"+value); + } + + @Override + public Children likeLeft(boolean condition, String column, Object value) { + return condition ? likeLeft(column,value) : typedThis; + } + + @Override + public Children likeLeft(String column, Object value) { + return like(column,"^"+value); + } + + @Override + public Children likeRight(boolean condition, SFunction column, Object value) { + return condition ? likeRight(column,value) : typedThis; + } + + @Override + public Children likeRight(SFunction column, Object value) { + return like(column,value+"$"); + } + + @Override + public Children likeRight(boolean condition, String column, Object value) { + return condition ? likeRight(column,value) : typedThis; + } + + @Override + public Children likeRight(String column, Object value) { + return like(column,value+"$"); + } + @Override public Children in(boolean condition, SFunction column, Collection valueList) { return condition ? in(column,valueList) : typedThis; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java index 88387553..3edc3ae5 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/BuildCondition.java @@ -1,5 +1,6 @@ package com.anwen.mongo.conditions; +import com.anwen.mongo.bson.MongoPlusBasicDBObject; import com.anwen.mongo.conditions.accumulator.Accumulator; import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.AddFields; import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.Projection; @@ -91,7 +92,7 @@ public class BuildCondition { public static List buildOrQueryCondition(List compareConditionList) { return new ArrayList(){{ compareConditionList.forEach(compare -> add(new MongoPlusBasicDBObject(){{ - if (Objects.equals(compare.getCondition(), QueryOperatorEnum.LIKE.getValue()) && StringUtils.isNotBlank(String.valueOf(compare.getValue()))) { + if (compare.getCondition().contains(QueryOperatorEnum.LIKE.getValue()) && StringUtils.isNotBlank(String.valueOf(compare.getValue()))) { put(compare.getColumn(), new BasicDBObject(SpecialConditionEnum.REGEX.getCondition(), compare.getValue())); } else if (Objects.equals(compare.getCondition(), QueryOperatorEnum.OR.getValue())) { if (null == compare.getChildCondition() || compare.getChildCondition().isEmpty()) { diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Compare.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Compare.java index 66668e57..4e592f29 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Compare.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/interfaces/Compare.java @@ -311,6 +311,90 @@ public interface Compare extends Serializable { */ Children like(String column, Object value); + /** + * 左包含(模糊查询) + * @param condition 判断如果为true,则加入此条件,可做判空,即不为空就加入这个条件 + * @param column 列名、字段名 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeLeft(boolean condition , SFunction column, Object value); + + /** + * 左包含(模糊查询) + * @param column 列名、字段名,lambda方式 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeLeft(SFunction column, Object value); + + /** + * 左包含(模糊查询) + * @param condition 判断如果为true,则加入此条件,可做判空,即不为空就加入这个条件 + * @param column 列名、字段名 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeLeft(boolean condition , String column, Object value); + + /** + * 左包含(模糊查询) + * @param column 列名、字段名,lambda方式 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeLeft(String column, Object value); + + /** + * 右包含(模糊查询) + * @param condition 判断如果为true,则加入此条件,可做判空,即不为空就加入这个条件 + * @param column 列名、字段名 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeRight(boolean condition , SFunction column, Object value); + + /** + * 右包含(模糊查询) + * @param column 列名、字段名,lambda方式 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeRight(SFunction column, Object value); + + /** + * 右包含(模糊查询) + * @param condition 判断如果为true,则加入此条件,可做判空,即不为空就加入这个条件 + * @param column 列名、字段名 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeRight(boolean condition , String column, Object value); + + /** + * 右包含(模糊查询) + * @param column 列名、字段名,lambda方式 + * @param value 值 + * @return Children + * @author JiaChaoYang + * @date 2023/6/20/020 + */ + Children likeRight(String column, Object value); + /** * 多值查询 * @param condition 判断如果为true,则加入此条件,可做判空,即不为空就加入这个条件 diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java index 5b70a78b..5f8905ba 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/ChainQuery.java @@ -35,6 +35,7 @@ public interface ChainQuery { * @author JiaChaoYang * @date 2023/7/20 23:12 */ + @Deprecated T limitOne(); /** diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java index 7af6c9cd..3f26134b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/conditions/query/LambdaQueryChainWrapper.java @@ -33,6 +33,7 @@ public class LambdaQueryChainWrapper extends QueryChainWrapper collection); + long estimatedDocumentCount(MongoCollection collection); + BulkWriteResult executeBulkWrite(List> writeModelList, MongoCollection collection); String doCreateIndex(Bson bson,MongoCollection collection); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java index 2353f60d..fed45565 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/inject/InjectAbstractExecute.java @@ -52,7 +52,8 @@ public class InjectAbstractExecute { public Boolean save(String collectionName, Map entityMap) { try { - return execute.executeSave(Collections.singletonList(DocumentUtil.handleMap(entityMap, true)),collectionManager.getCollection(collectionName)).wasAcknowledged(); +// return execute.executeSave(Collections.singletonList(DocumentUtil.handleMap(entityMap, true)),collectionManager.getCollection(collectionName)).wasAcknowledged(); + return true; } catch (Exception e) { logger.error("save fail , error info : {}", e.getMessage(), e); return false; @@ -62,7 +63,8 @@ public class InjectAbstractExecute { public Boolean saveBatch(String collectionName, Collection> entityList) { try { List documentList = DocumentUtil.handleMapList(entityList,true); - return execute.executeSave(documentList, collectionManager.getCollection(collectionName)).getInsertedIds().size() == entityList.size(); +// return execute.executeSave(documentList, collectionManager.getCollection(collectionName)).getInsertedIds().size() == entityList.size(); + return true; } catch (Exception e) { logger.error("saveBatch fail , error info : {}", e.getMessage(), e); return false; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java index 09eb72cc..b117299c 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/DefaultExecute.java @@ -61,6 +61,11 @@ public class DefaultExecute implements Execute { return Optional.ofNullable(countOptions).map(co -> collection.countDocuments(queryBasic,co)).orElseGet(() -> collection.countDocuments(queryBasic)); } + @Override + public long estimatedDocumentCount(MongoCollection collection) { + return collection.estimatedDocumentCount(); + } + @Override public UpdateResult executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { return collection.updateMany(queryBasic,updateBasic); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java index a1e9e211..f75e2b18 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/execute/instance/SessionExecute.java @@ -68,6 +68,11 @@ public class SessionExecute implements Execute { return Optional.ofNullable(countOptions).map(co -> collection.countDocuments(clientSession, queryBasic,co)).orElseGet(() -> collection.countDocuments(clientSession, queryBasic)); } + @Override + public long estimatedDocumentCount(MongoCollection collection) { + return collection.countDocuments(); + } + @Override public UpdateResult executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { return collection.updateMany(clientSession,queryBasic,updateBasic); 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 f4b48af6..3738d97a 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 @@ -1,6 +1,8 @@ package com.anwen.mongo.interceptor; 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.model.CountOptions; import com.mongodb.client.model.WriteModel; @@ -10,24 +12,45 @@ import org.bson.conversions.Bson; import java.util.List; /** - * 拦截器 + * 拦截器,代理{@link com.anwen.mongo.execute.Execute}接口,增删改查会经过 * * @author JiaChaoYang **/ public interface Interceptor { - void executeSave(List documentList); - - void executeRemove(Bson filter); - - void executeUpdate(Bson queryBasic, Bson updateBasic); - - void executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond); - - void executeAggregate(List aggregateConditionList); - - void executeCount(BasicDBObject queryBasic, CountOptions countOptions); - - void executeBulkWrite(List> writeModelList); + /** + * 添加拦截方法 + * @param documentList 经过添加方法的值 + * @return java.util.List + * @author JiaChaoYang + * @date 2024/3/17 0:37 + */ + default List executeSave(List documentList){ + return documentList; + }; + + default Bson executeRemove(Bson filter){ + return filter; + } + + default MutablePair executeUpdate(Bson queryBasic, Bson updateBasic){ + return new MutablePair<>(queryBasic, updateBasic); + } + + default QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond){ + return new QueryParam(queryBasic, projectionList, sortCond); + } + + default List executeAggregate(List aggregateConditionList){ + return aggregateConditionList; + } + + default MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions){ + return new MutablePair<>(queryBasic, countOptions); + } + + default List> executeBulkWrite(List> writeModelList){ + return writeModelList; + } } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java index 089c5222..bdfc5f29 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/mapper/BaseMapper.java @@ -50,10 +50,13 @@ public interface BaseMapper{ T one(QueryChainWrapper queryChainWrapper,Class clazz); + @Deprecated T limitOne(QueryChainWrapper queryChainWrapper,Class clazz); PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz); + List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Class clazz); + PageResult page(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize, Integer recentPageNum, Class clazz); T getById(Serializable id,Class clazz); 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 f244f90a..abd5d187 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 @@ -11,10 +11,10 @@ import com.anwen.mongo.constant.SqlOperationConstant; import com.anwen.mongo.context.MongoTransactionContext; import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.convert.DocumentMapperConvert; -import com.anwen.mongo.domain.MongoQueryException; import com.anwen.mongo.enums.AggregateOptionsEnum; 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.manager.MongoPlusClient; import com.anwen.mongo.model.*; @@ -165,32 +165,48 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public T one(QueryChainWrapper queryChainWrapper,Class clazz) { BaseLambdaQueryResult baseLambdaQuery = lambdaOperate.baseLambdaQuery(queryChainWrapper.getCompareList(),null,queryChainWrapper.getProjectionList(),queryChainWrapper.getBasicDBObjectList()); - List result = lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); - if (result.size() > 1) { - throw new MongoQueryException("query result greater than one line"); - } - return !result.isEmpty() ? result.get(0) : null; + 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()); - List result = lambdaOperate.getLambdaQueryResult(factory.getExecute().executeQuery(baseLambdaQuery.getCondition(),baseLambdaQuery.getProjection(),baseLambdaQuery.getSort(),mongoPlusClient.getCollection(clazz),Document.class),clazz); - return !result.isEmpty() ? result.get(0) : null; + 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()); + MongoCollection collection = mongoPlusClient.getCollection(clazz); + long count; + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ + count = factory.getExecute().estimatedDocumentCount(collection); + }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); + } + + @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); - return lambdaOperate.getLambdaQueryResultPage(iterable,count(queryChainWrapper,clazz),new PageParam(pageNum,pageSize),clazz); + 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()); - FindIterable iterable = factory.getExecute().executeQuery(baseLambdaQuery.getCondition(), baseLambdaQuery.getProjection(), baseLambdaQuery.getSort(), mongoPlusClient.getCollection(clazz),Document.class); - return lambdaOperate.getLambdaQueryResultPage(iterable, recentPageCount(queryChainWrapper.getCompareList(),clazz, pageNum, pageSize, recentPageNum),new PageParam(pageNum,pageSize),clazz); + MongoCollection collection = mongoPlusClient.getCollection(clazz); + long count; + if (CollUtil.isEmpty(queryChainWrapper.getCompareList())){ + count = factory.getExecute().estimatedDocumentCount(collection); + }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); } @Override @@ -249,7 +265,11 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public long count(QueryChainWrapper queryChainWrapper,Class clazz){ - return factory.getExecute().executeCount(BuildCondition.buildQueryCondition(queryChainWrapper.getCompareList()),null,mongoPlusClient.getCollection(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)); } /** @@ -285,7 +305,7 @@ public class DefaultBaseMapperImpl implements BaseMapper { @Override public long count(Class clazz){ - return factory.getExecute().executeCount(null,null,mongoPlusClient.getCollection(clazz)); + return factory.getExecute().estimatedDocumentCount(mongoPlusClient.getCollection(clazz)); } @Override diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/model/QueryParam.java b/mongo-plus-core/src/main/java/com/anwen/mongo/model/QueryParam.java new file mode 100644 index 00000000..6b79faa4 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/model/QueryParam.java @@ -0,0 +1,86 @@ +package com.anwen.mongo.model; + +import com.mongodb.BasicDBObject; +import org.bson.conversions.Bson; + +import java.util.Objects; + +/** + * 查询拦截器需要的值 + * + * @author JiaChaoYang + **/ +public class QueryParam { + public QueryParam(Bson query, BasicDBObject projection, BasicDBObject sort) { + this.query = query; + this.projection = projection; + this.sort = sort; + } + + /** + * 查询参数(第一个) + * @author JiaChaoYang + * @date 2024/3/17 0:15 + */ + private Bson query; + + /** + * project(第二个) + * @author JiaChaoYang + * @date 2024/3/17 0:15 + */ + private BasicDBObject projection; + + /** + * 排序(第三个) + * @author JiaChaoYang + * @date 2024/3/17 0:15 + */ + private BasicDBObject sort; + + public Bson getQuery() { + return query; + } + + public void setQuery(Bson query) { + this.query = query; + } + + public BasicDBObject getProjection() { + return projection; + } + + public void setProjection(BasicDBObject projection) { + this.projection = projection; + } + + public BasicDBObject getSort() { + return sort; + } + + public void setSort(BasicDBObject sort) { + this.sort = sort; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof QueryParam)) return false; + QueryParam that = (QueryParam) o; + return Objects.equals(getQuery(), that.getQuery()) && Objects.equals(getProjection(), that.getProjection()) && Objects.equals(getSort(), that.getSort()); + } + + @Override + public int hashCode() { + return Objects.hash(getQuery(), getProjection(), getSort()); + } + + @Override + public String toString() { + return "QueryParam{" + + "query=" + query + + ", projection=" + projection + + ", sort=" + sort + + '}'; + } +} 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 cbb58f99..301fe459 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 @@ -4,6 +4,8 @@ import com.anwen.mongo.cache.global.InterceptorCache; import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.execute.Execute; 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.model.CountOptions; import com.mongodb.client.model.WriteModel; @@ -34,25 +36,32 @@ public class ExecutorProxy implements InvocationHandler { String name = method.getName(); InterceptorCache.interceptors.forEach(interceptor -> { if (name.equals(ExecuteMethodEnum.SAVE.getMethod())){ - interceptor.executeSave((List) args[0]); + args[0] = interceptor.executeSave((List) args[0]); } if (name.equals(ExecuteMethodEnum.REMOVE.getMethod())){ - interceptor.executeRemove((Bson) args[0]); + args[0] = interceptor.executeRemove((Bson) args[0]); } if (name.equals(ExecuteMethodEnum.UPDATE.getMethod())){ - interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); + MutablePair bsonBsonMutablePair = interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); + args[0] = bsonBsonMutablePair.getLeft(); + args[1] = bsonBsonMutablePair.getRight(); } if (name.equals(ExecuteMethodEnum.QUERY.getMethod())){ - interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2]); + QueryParam queryParam = interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2]); + args[0] = queryParam.getQuery(); + args[1] = queryParam.getProjection(); + args[2] = queryParam.getSort(); } if (name.equals(ExecuteMethodEnum.AGGREGATE.getMethod())){ - interceptor.executeAggregate((List) args[0]); + args[0] = interceptor.executeAggregate((List) args[0]); } if (name.equals(ExecuteMethodEnum.COUNT.getMethod())){ - interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); + MutablePair basicDBObjectCountOptionsMutablePair = interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); + args[0] = basicDBObjectCountOptionsMutablePair.getLeft(); + args[1] = basicDBObjectCountOptionsMutablePair.getRight(); } if (name.equals(ExecuteMethodEnum.BULK_WRITE.getMethod())){ - interceptor.executeBulkWrite((List>) args[0]); + args[0] = interceptor.executeBulkWrite((List>) args[0]); } }); return method.invoke(target, args); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java index 224e9a54..9ef3877a 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/service/IService.java @@ -187,6 +187,7 @@ public interface IService { * @author JiaChaoYang * @date 2023/7/20 23:20 */ + @Deprecated T limitOne(QueryChainWrapper queryChainWrapper); List list(QueryChainWrapper queryChainWrapper); @@ -245,6 +246,37 @@ public interface IService { PageResult page(QueryChainWrapper queryChainWrapper, PageParam pageParam, Integer recentPageNum); + /** + * 返回List的page,无需进行count查询,速度会比较快 + * @author JiaChaoYang + * @date 2024/3/16 23:56 + */ + List pageList(PageParam pageParam); + + /** + * 返回List的page,无需进行count查询,速度会比较快 + * + * @author JiaChaoYang + * @date 2024/3/16 23:56 + */ + List pageList(Integer pageNum,Integer pageSize); + + /** + * 返回List的page,无需进行count查询,速度会比较快 + * + * @author JiaChaoYang + * @date 2024/3/16 23:56 + */ + List pageList(QueryChainWrapper queryChainWrapper, Integer pageNum, Integer pageSize); + + /** + * 返回List的page,无需进行count查询,速度会比较快 + * + * @author JiaChaoYang + * @date 2024/3/16 23:56 + */ + List pageList(QueryChainWrapper queryChainWrapper, PageParam pageParam); + /** * 根据id查询单个 * @param id id 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 486f10da..cbf570e8 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 @@ -250,6 +250,7 @@ public class ServiceImpl implements IService{ } @Override + @Deprecated public T limitOne(QueryChainWrapper queryChainWrapper) { return baseMapper.limitOne(queryChainWrapper,clazz); } @@ -299,6 +300,26 @@ public class ServiceImpl implements IService{ return page(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize(),recentPageNum); } + @Override + public List pageList(PageParam pageParam) { + return pageList(pageParam.getPageNum(),pageParam.getPageSize()); + } + + @Override + public List pageList(Integer pageNum, Integer pageSize) { + 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); + } + + @Override + public List pageList(QueryChainWrapper queryChainWrapper, PageParam pageParam) { + return baseMapper.pageList(queryChainWrapper,pageParam.getPageNum(),pageParam.getPageSize(),clazz); + } + @Override public PageResult page(PageParam pageParam) { return page(pageParam.getPageNum(),pageParam.getPageSize()); diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/aggregate/impl/SortConcretePipeline.java b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/aggregate/impl/SortConcretePipeline.java index 92ff600e..930142fb 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/aggregate/impl/SortConcretePipeline.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/strategy/aggregate/impl/SortConcretePipeline.java @@ -1,6 +1,6 @@ package com.anwen.mongo.strategy.aggregate.impl; -import com.anwen.mongo.conditions.MongoPlusBasicDBObject; +import com.anwen.mongo.bson.MongoPlusBasicDBObject; import com.anwen.mongo.conditions.interfaces.condition.Order; import com.anwen.mongo.strategy.aggregate.PipelineStrategy; import com.mongodb.BasicDBObject; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java index d6ab9f10..7e11eda1 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/LambdaOperate.java @@ -11,6 +11,7 @@ import com.anwen.mongo.model.PageParam; import com.anwen.mongo.model.PageResult; import com.mongodb.BasicDBObject; import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCursor; import org.bson.Document; import java.util.List; @@ -29,6 +30,12 @@ public class LambdaOperate { return DocumentMapperConvert.mapDocumentList(iterable, clazz); } + public T getLambdaQueryResultOne(FindIterable iterable, Class clazz) { + try (MongoCursor cursor = iterable.iterator()) { + return DocumentMapperConvert.mapDocument(cursor.next(), clazz); + } + } + public List> getLambdaQueryResult(FindIterable iterable,Integer size) { return Converter.convertDocumentToMap(iterable,size); } -- Gitee From b33bbdd4c10f3b6ee5032321bc146562acea2055 Mon Sep 17 00:00:00 2001 From: JackyTang Date: Mon, 18 Mar 2024 13:26:27 +0800 Subject: [PATCH 20/20] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=88=B3=E8=BD=AC=E6=8D=A2LocalDateTime=E6=97=B6?= =?UTF-8?q?=E5=8C=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/anwen/mongo/toolkit/InstantUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/InstantUtil.java b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/InstantUtil.java index 17219408..3948b79b 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/InstantUtil.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/toolkit/InstantUtil.java @@ -29,11 +29,11 @@ public class InstantUtil { logger.error("Convert To Instant Fail,message: {}",e.getMessage(),e); throw new MongoException("Convert To Instant Fail"); } - return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).minusHours(8); + return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); } public static LocalDateTime convertTimestampToLocalDateTime(Instant instant){ - return LocalDateTime.ofInstant(instant,ZoneId.systemDefault()).minusHours(8); + return LocalDateTime.ofInstant(instant,ZoneId.systemDefault()); } /** -- Gitee