
com.anwen.mongo.conditions.BuildCondition Maven / Gradle / Ivy
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;
import com.anwen.mongo.conditions.interfaces.aggregate.pipeline.ReplaceRoot;
import com.anwen.mongo.conditions.interfaces.condition.CompareCondition;
import com.anwen.mongo.constant.IndexConstant;
import com.anwen.mongo.constant.SqlOperationConstant;
import com.anwen.mongo.enums.CompareEnum;
import com.anwen.mongo.enums.LogicTypeEnum;
import com.anwen.mongo.enums.QueryOperatorEnum;
import com.anwen.mongo.enums.SpecialConditionEnum;
import com.anwen.mongo.toolkit.CollUtil;
import com.anwen.mongo.toolkit.ObjectIdUtil;
import com.anwen.mongo.toolkit.StringUtils;
import com.mongodb.BasicDBObject;
import java.util.*;
import java.util.stream.Collectors;
/**
* 条件构建
*
* @author JiaChaoYang
**/
public class BuildCondition {
/**
* 构建projection条件
* @author JiaChaoYang
* @date 2023/8/19 0:11
*/
public static BasicDBObject buildProjection(List projectionList){
return new BasicDBObject(){{
if (CollUtil.isNotEmpty(projectionList)) {
projectionList.forEach(projection -> put(projection.getColumn(), projection.getValue()));
}
}};
}
/**
* 构建查询条件
*
* @author JiaChaoYang
* @date 2023/6/25/025 1:48
*/
public static BasicDBObject buildQueryCondition(List compareConditionList) {
return new MongoPlusBasicDBObject(){{
if (CollUtil.isNotEmpty(compareConditionList)) {
compareConditionList.stream().filter(compareCondition -> compareCondition.getType() == CompareEnum.QUERY.getKey()).collect(Collectors.toList()).forEach(compare -> {
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.getLogicType(), LogicTypeEnum.OR.getKey())) {
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(), ObjectIdUtil.convertObjectId(compare.getValue())));
}
} else {
put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), compare.getValue()));
}
});
}
}};
}
/**
* 构建子条件
*
* @author JiaChaoYang
* @date 2023/7/16 19:59
*/
public static List buildOrQueryCondition(List compareConditionList) {
return new ArrayList(){{
compareConditionList.forEach(compare -> add(new MongoPlusBasicDBObject(){{
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()) {
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(), ObjectIdUtil.convertObjectId(compare.getValue())));
}
} else {
put(compare.getColumn(), new BasicDBObject("$" + compare.getCondition(), compare.getValue()));
}
}}));
}};
}
/**
* 构建更新值
*
* @author JiaChaoYang
* @date 2023/7/9 22:16
*/
public static BasicDBObject buildUpdateValue(List compareConditionList) {
return new BasicDBObject() {{
compareConditionList.stream().filter(compareCondition -> compareCondition.getType() == CompareEnum.UPDATE.getKey()).collect(Collectors.toList()).forEach(compare -> {
put(compare.getColumn(), compare.getValue());
});
}};
}
public static BasicDBObject buildPushUpdateValue(List compareConditionList) {
List conditionList = compareConditionList.stream().filter(compareCondition -> compareCondition.getType() == CompareEnum.UPDATE.getKey()).collect(Collectors.toList());
List columnList = conditionList.stream().map(CompareCondition::getColumn).distinct().collect(Collectors.toList());
//必须得这样做,为了兼容追加参数只追加一个、而且不是数组的情况
return new BasicDBObject(){{
columnList.forEach(column -> {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy