`
y806839048
  • 浏览: 1126675 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

davinci sql 组装where 部分的思路

阅读更多

 

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();

    }

 

分享到:
评论

相关推荐

    汽车编程-德国Vector DaVinci Configurator Pro AUTOSAR标准的软件配置工具软件.docx

    DaVinci Configurator Classic是DaVinci Configurator Pro的一部分,专门用于配置、验证和生成AUTOSAR Classic基础软件(BSW)和运行时环境(RTE)。它提供了一个功能强大且灵活的配置环境,允许用户根据不同的应用...

    Davinci Configurator

    《使用DaVinci Configurator整合AUTOSAR模块的教程》 在现代汽车电子系统中,AUTOSAR(AUTomotive Open System ARchitecture)是一种广泛采用的软件架构,旨在提高软件组件的复用性和可移植性。而DaVinci ...

    Vector Davinci官方帮助配置使用手册(AutoSAR).pdf

    Vector Davinci是Vector公司开发的适用于AutoSAR基础软件平台MICROSAR的集成开发环境(IDE)。AutoSAR(汽车电子架构软件平台)是一个全球性的开放合作项目,旨在开发汽车电子标准的软件架构。在本手册中,会详细...

    da_Vinci_Xi_System_User_Manual.pdf

    da Vinci Xi手术机器人系统用户手册 da Vinci Xi手术机器人系统是Intuitive Surgical, Inc.开发的一款先进的手术机器人系统,旨在提供高效、安全的手术环境。该系统用户手册详细介绍了da Vinci Xi系统的使用和操作...

    DaVinci系统培训课程操作说明.pdf

    主机操作是 DaVinci 系统的核心部分,包括以操作员用户登录系统、DaVinci 应用程序等方面。操作员用户可以通过登录系统来访问和控制 DaVinci 系统,进行各种操作和设置。 2.2 扫描架(Scanner)操作 扫描架操作是 ...

    ChatGPT接入项目实例 Python 调用davinci 002 api 示例 text-davinci-002

    ChatGPT接入项目实例 Python 调用davinci 002 api 示例 text-davinci-002

    davinci-dev-0.3.zip

    《达芬奇开发环境 davinci-dev-0.3 深度解析》 "达芬奇(davinci)",这个名字听起来或许让人联想到文艺复兴时期的杰出艺术家,但在IT领域,它可能代表了一种创新的开发工具或框架。本文将深入探讨名为"davinci-dev-...

    da Vinci Xi user manual

    - 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 添加Rte信号.7z

    本教程将详细讲解如何在DaVinci Developer工具中添加并管理RTE信号。 一、了解RTE与信号 RTE是Autosar系统中的核心组件,它负责在ECU(Electronic Control Unit)上运行时,管理SWC间的通信。信号(Signal)是...

    Davinci_Develop

    "达芬奇开发者"(Davinci Developer)是面向这一领域,专为实现向量(Vector)汽车电子开发而设计的一款强大工具。它集成了多种功能,旨在提升开发效率,确保软件质量,并简化复杂的嵌入式系统开发流程。 一、向量...

    Vector工具链(davinci)配置AutoSAR工程所需的dbc文件

    很多做AUTOSAR软件集成时,没有配置davinci所需的dbc文件,我分享一下

    MATLAB + DaVinci autosar工具链开发文档.pdf

    AUTOSAR 就是AUTomotive Open System ARchitecture,MATLAB + DaVinci(国内主流)进行AUTOSAR开发车用ECU软件的工具链使用说明文档。

    DaVinci开发环境搭建

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与DaVinci开发环境搭建相关的几个关键知识点。 ### DaVinci开发环境搭建概述 DaVinci系列是德州仪器(TI)推出的一系列高性能嵌入式多媒体处理器,它集成了...

    DaVinCi 配置 DEM模块的技术手册

    《DaVinCi配置DEM模块的技术手册》是针对汽车电子领域,特别是AUTOSAR(AUTomotive Open System ARchitecture)环境中的诊断事件管理模块进行详细阐述的技术文档。该手册覆盖了DEM(Diagnostic Event Manager)的...

    DaVinCi 配置 PduR模块的技术手册,内容涉及PduR功能模块介绍,API接口等

    DaVinCi 配置 PduR模块的技术手册,内容涉及PduR功能模块介绍,API接口等.基于RH850芯片的DaVinCi诊断模块配置手册。虽然说是RH850芯片SIP包里的,但是文档内的内容是标准化的,通用化的。包括函数接口等服务都是...

    TI-DaVinci.rar_davinci_ti davinci o

    这个“TI-DaVinci.rar_davinci_ti davinci o”压缩包包含了关于DaVinci技术的培训资料,特别是针对开发者的深入学习材料。 在“TI DaVinci.ppt”这个文件中,我们可以期待了解到以下几个关键知识点: 1. **程序...

    DaVinCi 配置EcuM模块的技术手册

    《DaVinCi 配置EcuM模块的技术手册》提供了关于EcuM模块的详尽指导,特别是针对基于RH850芯片的诊断模块配置。EcuM(Electronic Control Unit Manager)是AUTOSAR(AUTomotive Open System ARchitecture)架构中的...

    davinci_software_overview_public.rar_davinci_davinci dsp_框架课件

    Davinci框架是Davinci处理器的核心组成部分,它定义了硬件资源如何与软件交互,以及如何有效地进行多媒体数据处理。这个框架包含了多个层次,包括硬件接口层、驱动层、操作系统层以及应用程序接口层。通过理解这个...

    DaVinci Resolve 12 Studio Mac (达芬奇调色软件) V12.5.5 中文专业版

    DaVinci Resolve 12.5 mac 是一款为Mac OS 平台开发的达芬奇调色系统,DaVinci Resolve mac 即是大家俗称的达芬奇12,DaVinci Resolve mac 破解 是与好莱坞电影公司合作开发的世界顶级的调色软件,被广泛的用于电影....

    davinci-resizer.zip_Resizer_davinci_davinci resizer _resizer DEV

    《 davinci-resizer.zip:TI Davinci系列硬件缩放工具详解及应用》 在嵌入式视频处理领域,TI(Texas Instruments)的Davinci系列处理器以其强大的视频编解码能力而闻名。针对这一系列处理器,TI推出了一款名为da...

Global site tag (gtag.js) - Google Analytics