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();
}
相关推荐
DaVinci Configurator Classic是DaVinci Configurator Pro的一部分,专门用于配置、验证和生成AUTOSAR Classic基础软件(BSW)和运行时环境(RTE)。它提供了一个功能强大且灵活的配置环境,允许用户根据不同的应用...
《使用DaVinci Configurator整合AUTOSAR模块的教程》 在现代汽车电子系统中,AUTOSAR(AUTomotive Open System ARchitecture)是一种广泛采用的软件架构,旨在提高软件组件的复用性和可移植性。而DaVinci ...
da Vinci Xi手术机器人系统用户手册 da Vinci Xi手术机器人系统是Intuitive Surgical, Inc.开发的一款先进的手术机器人系统,旨在提供高效、安全的手术环境。该系统用户手册详细介绍了da Vinci Xi系统的使用和操作...
Vector Davinci是Vector公司开发的适用于AutoSAR基础软件平台MICROSAR的集成开发环境(IDE)。AutoSAR(汽车电子架构软件平台)是一个全球性的开放合作项目,旨在开发汽车电子标准的软件架构。在本手册中,会详细...
主机操作是 DaVinci 系统的核心部分,包括以操作员用户登录系统、DaVinci 应用程序等方面。操作员用户可以通过登录系统来访问和控制 DaVinci 系统,进行各种操作和设置。 2.2 扫描架(Scanner)操作 扫描架操作是 ...
ChatGPT接入项目实例 Python 调用davinci 002 api 示例 text-davinci-002
《达芬奇开发环境 davinci-dev-0.3 深度解析》 "达芬奇(davinci)",这个名字听起来或许让人联想到文艺复兴时期的杰出艺术家,但在IT领域,它可能代表了一种创新的开发工具或框架。本文将深入探讨名为"davinci-dev-...
- Intuitive、Intuitive Surgical、Beyond the Limits of the Human Hand、daVinci、daVinci S、daVinci Si、daVinci Xi、daVinci X、EndoWrist、TilePro、OnSite等均为Intuitive Surgical, Inc.的商标或注册商标。...
本教程将详细讲解如何在DaVinci Developer工具中添加并管理RTE信号。 一、了解RTE与信号 RTE是Autosar系统中的核心组件,它负责在ECU(Electronic Control Unit)上运行时,管理SWC间的通信。信号(Signal)是...
"达芬奇开发者"(Davinci Developer)是面向这一领域,专为实现向量(Vector)汽车电子开发而设计的一款强大工具。它集成了多种功能,旨在提升开发效率,确保软件质量,并简化复杂的嵌入式系统开发流程。 一、向量...
很多做AUTOSAR软件集成时,没有配置davinci所需的dbc文件,我分享一下
AUTOSAR 就是AUTomotive Open System ARchitecture,MATLAB + DaVinci(国内主流)进行AUTOSAR开发车用ECU软件的工具链使用说明文档。
根据提供的标题、描述、标签及部分内容,我们可以提炼出与DaVinci开发环境搭建相关的几个关键知识点。 ### DaVinci开发环境搭建概述 DaVinci系列是德州仪器(TI)推出的一系列高性能嵌入式多媒体处理器,它集成了...
这个“TI-DaVinci.rar_davinci_ti davinci o”压缩包包含了关于DaVinci技术的培训资料,特别是针对开发者的深入学习材料。 在“TI DaVinci.ppt”这个文件中,我们可以期待了解到以下几个关键知识点: 1. **程序...
Davinci框架是Davinci处理器的核心组成部分,它定义了硬件资源如何与软件交互,以及如何有效地进行多媒体数据处理。这个框架包含了多个层次,包括硬件接口层、驱动层、操作系统层以及应用程序接口层。通过理解这个...
《DaVinCi 配置EcuM模块的技术手册》提供了关于EcuM模块的详尽指导,特别是针对基于RH850芯片的诊断模块配置。EcuM(Electronic Control Unit Manager)是AUTOSAR(AUTomotive Open System ARchitecture)架构中的...
《 davinci-resizer.zip:TI Davinci系列硬件缩放工具详解及应用》 在嵌入式视频处理领域,TI(Texas Instruments)的Davinci系列处理器以其强大的视频编解码能力而闻名。针对这一系列处理器,TI推出了一款名为da...
DaVinci MCAL Configurator是DaVinci Developer工具套件的一部分,专为瑞萨RH850微控制器设计。该工具提供了直观的图形用户界面,允许开发者通过拖拽和配置的方式,轻松地创建和编辑ARXML文件。MCAL...
DaVinCi 配置 PduR模块的技术手册,内容涉及PduR功能模块介绍,API接口等.基于RH850芯片的DaVinCi诊断模块配置手册。虽然说是RH850芯片SIP包里的,但是文档内的内容是标准化的,通用化的。包括函数接口等服务都是...
标题中的“test_uart.rar”表明这是一个与UART(通用异步收发传输器)相关的测试工程文件,用于在Davinci平台上进行串口通信的验证。Davinci是TI(德州仪器)公司推出的一种数字信号处理器(DSP)和视频处理器的集成...