SqlFilter 条件组装类:
sqlType ==datatype 字段类型
这里有OR
operator between 类型比较
Type 本身过滤条件中也可设置oR and主要用于between or 还没有试用代码(可以自己实现成本身的or 一个属性多个或)
filter---该字段属于过滤条件
relation
and
or
ViewExecuteParam 传入条件信息
formatColumn ---别名控制
Criterion 每个条件的操作信息(由ViewExecuteParam部分条件参数完成)
所有的where 后面部分的条件组合都可适用,需要不同where的组合可在模板固定where 1=1 然后就是分部的条件块,不能像原始的模板where 和一个条件块固定在一起
sql:
子查询内部的条件在原sql写好
SELECT m.*, s.event_property_code,s.event_property_value FROM cms.daily_new_client88_master m LEFT JOIN cms.daily_new_client88_slave s on m.event_id= s.event_id
模板:
querySqlAndOrms(nativeQuery, groups, aggregators, filters, orders, sql, keywordPrefix, keywordSuffix,filterAndFlag,eventCode)
::=<<
<if(!groups && !aggregators && !filters && !orders)>
<sql>
<else>
SELECT
<if(!groups && !aggregators)>
*
<endif>
<if(groups)>
<groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<if(groups && aggregators)>,<endif>
<if(aggregators)>
<if(nativeQuery)>
<aggregators:{agg|<if(agg)><if(keywordPrefix && keywordSuffix)><keywordPrefix><agg.column><keywordSuffix><else><agg.column><endif><endif>}; separator=",">
<else>
<aggregators:{agg|<if(agg)><agg><endif>}; separator=",">
<endif>
<endif>
FROM (<sql>) T
<if(eventCode)>
WHERE <eventCode>
<endif>
<if(!eventCode)>
WHERE 1=1
<endif>
<if(filters && filterAndFlag)>
AND ( <filters:{filter|<if(filter)><filter><endif>}; separator=" AND "> )
<endif>
<if(filters && !filterAndFlag)>
AND ( <filters:{filter|<if(filter)><filter><endif>}; separator=" OR "> )
<endif>
<if(groups)>
<if(!nativeQuery)>
GROUP BY <groups:{group|<if(keywordPrefix && keywordSuffix)><keywordPrefix><group><keywordSuffix><else><group><endif>}; separator=",">
<endif>
<endif>
<if(orders)>
ORDER BY <orders:{order|<if(order)><order.column> <order.direction><endif>}; separator=", ">
<endif>
<endif>
>>
public List<String> convertFilters(List<String> filterStrs, Source source){-----每一部分完成每一部分的所有组装(除了sql关键字)------------把所有的filter组装成完整的where过滤条件
List<String> whereClauses = new ArrayList<>();
List<SqlFilter> filters = new ArrayList<>();
try{
if(null == filterStrs || filterStrs.isEmpty()){
return null;
}
for(String str : filterStrs){----所有的过滤字段
SqlFilter obj = JSON.parseObject(str, SqlFilter.class);---------
if(!StringUtils.isEmpty(obj.getName())){
obj.setName(ViewExecuteParam.getField(obj.getName(), source.getJdbcUrl(), source.getDbVersion()));----判断是否需要前后缀
}
filters.add(obj);
}
filters.forEach(filter -> whereClauses.add(SqlFilter.dealFilter(filter)));--------------经过dealFilter就把每个filter中组装成where条件后的完整过滤语句
}catch (Exception e){
log.error("convertFilters error . filterStrs = {}, source = {}, filters = {} , whereClauses = {} ",
JSON.toJSON(filterStrs), JSON.toJSON(source), JSON.toJSON(filters), JSON.toJSON(whereClauses));
throw e;
}
return whereClauses;
}
public static String dealFilter(SqlFilter filter){
StringBuilder condition = new StringBuilder();
String type = filter.getType();
if(Type.filter.equalsIgnoreCase(type)){-----条件类的(字段的对比操作信息)
condition.append(dealOperator(filter));
}
if(Type.relation.equalsIgnoreCase(type)){
List<SqlFilter> childs = filter.getChildren();
condition.append(Consts.PARENTHESES_START);
for(int i=0; i<childs.size(); i++){
condition.append(i == 0 ? dealFilter(childs.get(i))
: Consts.SPACE + filter.getValue().toString() + Consts.SPACE + dealFilter(childs.get(i)));
}
condition.append(Consts.PARENTHESES_END);
}
return condition.toString();
}
private static String dealOperator(SqlFilter filter){
String name = filter.getName();
Object value = filter.getValue();
String operator = filter.getOperator();
String sqlType = filter.getSqlType();
Criterion criterion;
if(SqlOperatorEnum.BETWEEN.getValue().equalsIgnoreCase(operator)){
JSONArray values = (JSONArray) value;
criterion = new Criterion(name, operator, values.get(0), values.get(1), sqlType);----对一个字段的对比操作信息
}else{
criterion = new Criterion(name, operator, value, sqlType);
}
return generator(criterion);
}
private static String generator(Criterion criterion){----正真生成每个条件的对比操作信息---每一个条件完成一个条件的完整操作的信息
StringBuilder whereClause = new StringBuilder();
if(criterion.isSingleValue()){---单值操作
//column='value'
String value = criterion.getValue().toString();
whereClause.append(criterion.getColumn() + Consts.SPACE + criterion.getOperator() + Consts.SPACE);
if(criterion.isNeedApostrophe() && !Pattern.matches(pattern, value)){
whereClause.append(Consts.APOSTROPHE + value + Consts.APOSTROPHE);
}else{
whereClause.append(value);
}
}else if(criterion.isBetweenValue()){ ---- between
//column>='' and column<=''
String value1 = criterion.getValue().toString();
whereClause.append(Consts.PARENTHESES_START);
whereClause.append(criterion.getColumn()+ Consts.SPACE + SqlOperatorEnum.GREATERTHANEQUALS.getValue() + Consts.SPACE);
if(criterion.isNeedApostrophe() && !Pattern.matches(pattern, value1)){
whereClause.append(Consts.APOSTROPHE + value1 + Consts.APOSTROPHE);
}else{
whereClause.append(value1);
}
whereClause.append(Consts.SPACE + SqlFilter.Type.and + Consts.SPACE);
whereClause.append(criterion.getColumn()+ Consts.SPACE + SqlOperatorEnum.MINORTHANEQUALS.getValue() + Consts.SPACE);
String value2 = criterion.getSecondValue().toString();
if(criterion.isNeedApostrophe() && !Pattern.matches(pattern, value2)){
whereClause.append(Consts.APOSTROPHE + value2 + Consts.APOSTROPHE);
}else{
whereClause.append(value2);
}
whereClause.append(Consts.PARENTHESES_END);
}else if(criterion.isListValue()){ -----in
List values = (List) criterion.getValue();
//column in ()
whereClause.append(criterion.getColumn() + Consts.SPACE + criterion.getOperator() + Consts.SPACE);
whereClause.append(Consts.PARENTHESES_START);
if(criterion.isNeedApostrophe() && !Pattern.matches(pattern, values.get(0).toString())){
whereClause.append(Consts.APOSTROPHE +
StringUtils.join(values,Consts.APOSTROPHE + Consts.COMMA + Consts.APOSTROPHE) +
Consts.APOSTROPHE);
}else{
whereClause.append(StringUtils.join(values, Consts.COMMA));
}
whereClause.append(Consts.PARENTHESES_END);
}
return whereClause.toString();
}
相关推荐
ChatGPT接入项目实例 Python 调用davinci 002 api 示例 text-davinci-002
The Da Vinci Code - Dan Brown.pdf The Da Vinci Code - Dan Brown.pdf
DaVinCi 配置 EcuM模块的技术手册,内容涉及EcuM功能模块介绍,API接口等.基于RH850芯片的DaVinCi诊断模块配置手册。虽然说是RH850芯片包里的,但是文档内的内容是标准化的,通用化的。包括函数接口等服务都是通用的
Vector官方帮助文档,配置使用手册。从新建DaVinci工程开始一步一步的讲解如何配置工程;如何编译生成C代码;如何导入CDD、DBC等文件。手册讲解细致,可以说是手把手教学了
Vector 给出的简易教程,如何将AUTOSAR模块添加到Davinci Configurator中
汽车编程-德国Vector DaVinci Configurator Pro AUTOSAR标准的软件配置工具软件.docx
Vector Develop使用指导手册
AUTOSAR 就是AUTomotive Open System ARchitecture,MATLAB + DaVinci(国内主流)进行AUTOSAR开发车用ECU软件的工具链使用说明文档。
DaVinCi 配置 BswM模块的技术手册,内容涉及模块介绍,状态管理,以及各API接口
DaVinCi 配置 PduR模块的技术手册,内容涉及PduR功能模块介绍,API接口等.基于RH850芯片的DaVinCi诊断模块配置手册。虽然说是RH850芯片SIP包里的,但是文档内的内容是标准化的,通用化的。包括函数接口等服务都是...
DaVinci Resolve 12.5 mac 是一款为Mac OS 平台开发的达芬奇调色系统,DaVinci Resolve mac 即是大家俗称的达芬奇12,DaVinci Resolve mac 破解 是与好莱坞电影公司合作开发的世界顶级的调色软件,被广泛的用于电影....
详细的介绍了达芬奇的相关知识,对初学者对DAVINCI的了解很有帮助
0.0.0.0:8080 这里修改为服务器IP:docker映射后的端口(也就是58080) ...项目地址:https://github.com/edp963/davinci-docker 访问地址:https://edp963.github.io/davinci/quickStart.html 作者:AinUser
DaVinci MCAL Configurator配置ARXML(瑞萨RH850)
SEED davinci DM6467 用户指南
davinci 的开发结构描述 codecengin的结构描述
Davinci 是一个 DVAAS(Data Visualization as a Service)平台解决方案,面向业务人员/数据工程师/数据分析师/数据科学家,致力于提供一站式数据可视化解决方案。既可作为公有云/私有云独立部署使用,也可作为可视...
很多做AUTOSAR软件集成时,没有配置davinci所需的dbc文件,我分享一下
DAVINCI开发中的Codec实例,适合初学者学习DAVINCI开发的架构
Davinci相关资料,包括视频前端和后端,arm和DSP子系统资料.