CN117435607A - 用于数据库的语句转换方法、装置、设备和介质 - Google Patents
用于数据库的语句转换方法、装置、设备和介质 Download PDFInfo
- Publication number
- CN117435607A CN117435607A CN202311373760.2A CN202311373760A CN117435607A CN 117435607 A CN117435607 A CN 117435607A CN 202311373760 A CN202311373760 A CN 202311373760A CN 117435607 A CN117435607 A CN 117435607A
- Authority
- CN
- China
- Prior art keywords
- query
- statement
- conditional statement
- clause
- conditional
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 67
- 238000006243 chemical reaction Methods 0.000 title claims abstract description 61
- 238000011426 transformation method Methods 0.000 claims description 8
- 238000004590 computer program Methods 0.000 claims description 7
- 238000005516 engineering process Methods 0.000 abstract description 15
- 238000013473 artificial intelligence Methods 0.000 abstract description 14
- 238000012423 maintenance Methods 0.000 abstract description 11
- 238000013461 design Methods 0.000 description 30
- 230000014509 gene expression Effects 0.000 description 18
- 238000012545 processing Methods 0.000 description 18
- 238000010586 diagram Methods 0.000 description 14
- 238000010276 construction Methods 0.000 description 11
- 230000008569 process Effects 0.000 description 11
- 210000001072 colon Anatomy 0.000 description 8
- 102100038367 Gremlin-1 Human genes 0.000 description 6
- 101001032872 Homo sapiens Gremlin-1 Proteins 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 230000001960 triggered effect Effects 0.000 description 6
- 241000283726 Bison Species 0.000 description 5
- 238000012549 training Methods 0.000 description 5
- 238000013528 artificial neural network Methods 0.000 description 3
- 239000003550 marker Substances 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000010801 machine learning Methods 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000009877 rendering Methods 0.000 description 2
- 241000070023 Phoenicopterus roseus Species 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 239000004575 stone Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种用于数据库的语句转换方法、装置、设备、介质和程序产品,属于数据查询领域,该方法包括:获取第一条件语句,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句;解析第一条件语句,生成抽象语法树;基于抽象语法树生成第二条件语句,第二条件语句是基于第二语法的条件语句。该方法可以将基于不同语法的条件语句转换为基于同一语法的条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。本申请实施例可应用于云技术、人工智能、智慧交通、辅助驾驶等各种场景。
Description
技术领域
本申请实施例涉及数据查询领域,特别涉及一种用于数据库的语句转换方法、装置、设备、介质和程序产品。
背景技术
在查询数据的时候,由于数据可能储存在多种类型的数据库中,用户通常需要根据这些数据库的类型,学习并使用各种查询语句进行查询。这些查询语句各自对应不同的查询语法,查询语句包括条件语句。
相关技术中,通过使用基于硬编码的转换规则或预定义的查询模板,将基于不同查询语法的条件语句,转换为基于同一种查询语法的条件语句,从而在一定程度上减少查询的难度。
然而,通过这种方式转换条件语句,不仅灵活性不足,需要提前预定义大量的查询模板,而且在面对复杂的条件语句的情况下,可能无法得出正确的转换结果。
发明内容
本申请提供了一种用于数据库的语句转换方法、装置、设备、介质和程序产品,该技术方案至少包括:
根据本申请实施例的一个方面,提供了一种用于数据库的语句转换方法,该方法包括:
获取第一条件语句,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句;
解析第一条件语句,生成抽象语法树(Abstract Syntax Tree,AST);
基于AST生成第二条件语句,第二条件语句是基于第二语法的条件语句。
根据本申请实施例的另一个方面,提供了一种用于数据库的语句转换装置,该装置包括:
获取模块,用于获取第一条件语句,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句;
解析模块,用于解析第一条件语句,生成AST;
生成模块,用于基于AST生成第二条件语句,第二条件语句是基于第二语法的条件语句。
在本申请的一个可选设计中,解析模块,用于将第一条件语句分解为至少一个标记;基于至少一个标记,生成AST。
在本申请的一个可选设计中,生成模块包括识别单元和生成单元,AST包括至少一个查询子句。
识别单元,用于对AST进行遍历,识别到至少一个查询子句;
生成单元,用于基于至少一个查询子句生成第二条件语句;
其中,查询子句是第一条件语句的一部分,查询子句包括标记。
在本申请的一个可选设计中,AST包括至少一个查询子句中的每个查询子句对应的节点,识别单元,用于遍历每个查询子句对应的节点状态,节点状态表示对应的查询子句的字段名和取值;基于每个查询子句对应的节点状态,分别获取每个查询子句的字段名和取值;
生成单元,用于基于每个查询子句的字段名和取值,生成第二条件语句。
在本申请的一个可选设计中,生成单元,用于基于第i个查询子句的字段名和取值,转换得到第i个转换查询子句,转换查询子句表示基于第二语法的查询子句,i为正整数;
在第i个查询子句不是最后一个查询子句的情况下,继续转换第i+1个查询子句;
在第i个查询子句是最后一个查询子句的情况下,组合全部转换查询子句,生成第二条件语句。
在本申请的一个可选设计中,生成单元,用于根据第i个查询子句的字段名,获取第i个查询子句的语句类型;
根据第i个查询子句的取值,获取第i个查询子句的语句内容;
根据第i个查询子句的语句类型和第i个查询子句的语句内容,将第i个查询子句转换为第i个转换查询子句。
根据本申请实施例的另一个方面,提供了一种计算机设备,计算机设备包括:处理器和存储器,存储器中存储有至少一段程序;处理器用于执行存储器中的至少一段程序以实现上述各个方面的用于数据库的语句转换方法。
根据本申请实施例的另一个方面,提供了一种计算机可读存储介质,该计算机可读存储介质中存储有至少一段程序,至少一段程序由处理器加载并执行以实现如上述各个方面的用于数据库的语句转换方法。
根据本申请实施例的另一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,计算机指令存储在计算机可读存储介质中,处理器从计算机可读存储介质中获取计算机指令,处理器执行计算机指令以实现如上述各个方面的用于数据库的语句转换方法。
本申请实施例提供的技术方案可以包括以下有益效果:
该方法通过获取第一条件语句,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句;解析第一条件语句,生成AST;基于AST生成第二条件语句,第二条件语句是基于第二语法的条件语句。通过将第一条件语句转换为第二条件语句,可以将基于不同语法的条件语句转换为基于同一语法的条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1示出了本申请一个示例性实施例提供的用于数据库的语句转换系统的示意图;
图2示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的示意图;
图3示出了本申请一个示例性实施例提供的抽象语法树的示意图;
图4示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图;
图5示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图;
图6示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图;
图7示出了本申请一个示例性实施例提供的语法分析工具的示意图;
图8示出了本申请一个示例性实施例提供的用于数据库的语句转换装置的框图;
图9是本申请一个示例性实施例提供的计算机设备的结构框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
需要说明的是,本申请所涉及的对象信息(包括但不限于对象设备信息、对象个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经对象授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
应当理解,尽管在本申请中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一参数也可以被称为第二参数,类似地,第二参数也可以被称为第一参数。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
本申请实施例中涉及的终端设备包括但不限于手机、电脑、智能语音交互设备、智能家电、车载终端、飞行器等。本申请实施例可应用于各种场景,包括但不限于云技术、人工智能、智慧交通、辅助驾驶等。
首先,对本申请涉及的相关内容做出介绍:
ANTLR(ANother Tool for Language Recognition):是一种解析器生成器,可以用于读取、处理、执行和翻译结构化的文本或二进制文件。它常被用于编译器和解析器的开发,以及其他与语言处理相关的任务。
Go语言:是一种静态类型、编译型的开源编程语言,也被称为Golang,由Google设计和开发。Go以其简洁的语法、并发支持和高效的运行性能而闻名。
ElasticSearch(ES):是一个基于Lucene库的开源搜索引擎。它提供一个分布式、多租户的全文搜索引擎,具有无模式JS键值对数据(JavaScript Object Notation,JSON)格式的文档。
结构化查询语言(Structured Query Language,SQL):是一种用于管理关系数据库的编程语言。SQL语句主要用于查询和处理数据库中的数据。
QueryString:在ES中,QueryString是一种特殊的查询类型,可以接收一个查询字符串,解析并执行它。这个查询字符串的格式非常灵活,可以包含多个查询子句,并通过逻辑操作符组合起来。
预训练模型(Pre-Training Model,PTM):也称基石模型、大模型,指具有大参量的深度神经网络(Deep Neural Network,DNN),在海量未标记的数据上对其进行训练,利用大参量DNN的函数近似能力使PTM在数据上提取共性特征,经微调(fine tune)、参数高效微调、prompt-tuning等技术,适用于下游任务。因此,预训练模型可以在小样本(Few-shot)或零样本(Zero-shot)场景下达到理想效果。PTM按照处理的数据模态可以分为语言模型(ELMO,BERT,GPT)、视觉模型(swin-transformer,ViT,V-MOE)、语音模型(VALL-E)、多模态模型(ViBERT,CLIP,Flamingo,Gato)等,其中多模态模型指建立两种或以上数据模态特征表示的模型。预训练模型是输出人工智能生成内容重要工具,也可以作为连接多个具体任务模型的通用接口。
人工智能(Artificial Intelligence,AI):是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。
人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、预训练模型技术、操作/交互系统、机电一体化等。其中,预训练模型又称大模型、基础模型,经过微调后可以广泛应用于人工智能各大方向下游任务。人工智能软件技术主要包括计算机视觉技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
图1示出了本申请一个示例性实施例提供的用于数据库的语句转换系统100的示意图,该用于数据库的语句转换系统100包括:构建设备110、查询设备120和终端设备130。
构建设备110和查询设备120都是服务器,在本申请中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器,但并不局限于此。
其中,构建设备110用于构建使用用于数据库的语句转换方法的引擎,查询设备120用于接收终端设备130发送的条件语句,并使用上述引擎转换条件语句,输出转换后的条件语句和对应的查询内容。可选的,构建设备110和查询设备120是同一设备;或者,构建设备110和查询设备120是不同设备,本申请实施例中以构建设备110和查询设备120是不同设备为例进行说明。
终端设备130可以是诸如个人计算机(Personal Computer,PC)、手机、平板电脑、车载终端(车机)、可穿戴设备等电子设备。
本领域技术人员可以知晓,上述终端设备130的数量可以更多或更少。比如上述终端设备130可以仅为一个,或者上述终端设备130为几十个或几百个,或者更多数量。本申请实施例对终端设备130的数量和设备类型不加以限定。
在查询数据的时候,由于数据可能储存在多种类型的数据库中,用户通常需要根据这些数据库的类型,学习并使用各种查询语句进行查询,这些查询语句各自对应不同的查询语法,查询语句包括条件语句。例如当用户想要查询指定端口(比如端口8080)时,需要根据不同的数据库类型(比如ClickHouse,MySQL等),输入对应的查询语句进行查询。
相关技术中,通过使用基于硬编码的转换规则或预定义的查询模板,将基于不同查询语法的条件语句,转换为基于同一查询语法的条件语句,从而在一定程度上减少查询的难度。例如预定义查询指定端口对应的查询模板。
然而,通过这种方式转换条件语句,不仅灵活性不足,需要提前预定义大量的查询模板,而且在面对复杂的条件语句的情况下,可能无法得出正确的转换结果。为了解决上述问题,本申请实施例提供了一种用于数据库的语句转换方法。
图2示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的示意图。该方法基于语法分析工具和转换语言实现,语法分析工具包括ANTLR、Bison、Yacc、PEG.js等工具,转换语言包括Go语言、Java、Python、C++、JavaScript等编程语言,本申请实施例对此不加以限定,以ANTLR作为语法分析工具,Go语言作为转换语言为例进行说明。
(1)获取第一条件语句210。
第一条件语句210也可以称为查询逻辑表达式,也可以称为查询表达式,也可以称为查询字符串(ES QueryString)。第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句。
例如第一条件语句210为“port:8080AND status:200”,表示使用ES查询满足端口(port)的值为8080,且状态码(status)的值为200的数据,第一条件语句210是基于lucene查询语法的条件语句。
(2)对第一条件语句210进行词法分析,获取标记集合220。
第一条件语句210被ANTLR分解为标记集合220,该标记集合220包括至少一个标记(Tokens)。标记表示第一条件语句210中的各个组成部分,包括字段名(FieldName)、比较操作符(comparisonOperator)、空白(WHITESPACE)、查询值(termExpression)、符号。
例如,第一条件语句210“port:8080AND status:200”被分解为如下标记:FieldName("port"),冒号,termExpression("8080"),AND,FieldName("status"),冒号,termExpression("200")。
(3)基于标记集合220,生成抽象语法树230。
基于ANTLR定义的关于查询逻辑表达式的语法规则,对标记集合220进行解析,生成抽象语法树230。
抽象语法树(Abstract Syntax Tree,AST)230用于表示代码的语法结构,其中每一个节点代表一个语法结构。
图3示出了本申请一个示例性实施例提供的抽象语法树230的示意图。在抽象语法树230中,其中,query是根节点,表示一个查询;它有两个子节点:<EOF>和queryExpression:commonQuery。其中,<EOF>表示查询结束;queryExpression:commonQuery是一个查询表达式节点,表示常见查询;它有五个子节点,包括:两个singleTermQuery子节点,两个WHITESPACE子节点和一个queryOperator子节点。其中,singleTermQuery表示单一关键字查询;每个singleTermQuery都有一个字段名(FieldName)和一个查询值(termExpression),分别表示查询的字段名和查询的值;WHITESPACE是一个空白节点,表示空格字符;queryOperator是一个查询逻辑操作符节点,表示查询使用的逻辑操作符;INTEGER_VALUE是一个整数值节点,表示一个整数类型的常量或变量。
(4)基于抽象语法树230,生成第二条件语句240。
ANTLR生成查询检测器(QueryStringListener),查询检测器在遍历AST的过程中,能够对节点的进入和退出进行检测。第二条件语句240是基于第二语法的条件语句。本申请实施例中以第二语法为SQL语法为例进行说明。
该过程包括如下几个步骤:
1)初始化:当查询检测器进入抽象语法树230中的查询语句(query)时,会触发进入查询(EnterQuery)事件。在该事件中,查询检测器生成条件语句生成器(SQLBuilder)和栈(Stack)。条件语句生成器是一个字符串生成器,用于生成至少一个查询子句。
查询子句是第一条件语句210的一部分,查询子句包括上述标记,例如,在“port:8080AND status:200”中,“port:8080”就是一个查询子句;栈用于存储遍历的每个节点状态,节点状态表示对应的查询子句的字段名和取值。
2)遍历:查询检测器按照深度优先遍历的方式遍历抽象语法树230。在遍历过程中,对于每个遍历到的节点,查询检测器都会检测其进入和退出事件。对于不同类型的查询子句节点,查询检测器都有对应的处理逻辑。
例如,对于单一关键字查询(SingleTermQuery)“port:8080”,当查询检测器进入此查询子句节点时,将触发EnterSingleTermQuery事件,查询检测器会把这个查询子句节点的字段(port)和值(8080)一起作为一个单元压入栈中;
对于逻辑操作符AND,查询检测器会在遍历到时把AND也压入栈中;对于另一个单一关键字查询“status:200”,查询检测器会在遍历到时把它也作为一个单元压入栈中。在这个过程中,栈会变为:[status:200,AND,port:8080]。
3)转换:当遍历步骤完成,即退出查询语句(query)时,查询检测器开始处理栈中存储的节点状态,这个过程涉及退出查询(ExitQuery)事件。在此事件中,查询检测器将按照预设规则从栈中弹出查询子句,并使用条件语句生成器(SQLBuilder)生成第二条件语句240。
查询检测器把栈中的查询子句按照后进先出(Last-In,First-Out,LIFO)的顺序弹出,对于弹出的每一个查询子句,条件语句生成器将会识别其语句类型和语句内容并进行转换,如果是逻辑操作符例如AND,那么将会被转换为第二条件语句240中的AND;如果是单一关键字查询,那么将会被转换为第二条件语句240中的条件语句,比如“port:8080”转换为“port='8080'”。
转换后的查询子句被条件语句生成器组合在一起,形成完整的第二条件语句240。示例性的,针对输入的第一条件语句210“port:8080AND status:200”,条件语句生成器生成第二条件语句240“WHERE port='8080'AND status='200'”。
综上所述,本实施例提供的方法通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句。由于第二语法例如SQL语法通常是具有更加广泛适应性的编程语法,在查询数据的时候,如果查询的数据库支持使用第二语法,那么只要输入第一条件语句就可以自动转换为第二条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
图4示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图,该方法由构建设备执行,该方法包括:
步骤410:获取第一条件语句。
其中,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句。
第一语法是任意一种编程语法或数据库查询语法,例如lucene查询语法、SQL语法、Cypher语法、GraphQL语法、Gremlin语法等。
例如,在第一语法为lucene查询语法,第一条件语句为“port:8080AND status:200”的情况下,表示查询满足端口(port)的值为8080,且状态码(status)的值为200的数据。
查询语句包括条件语句,示例性的:在第一语法为SQL语法的情况下,查询语句为“SELECT*FROM logs WHERE port='8080'”,条件语句为“WHERE port='8080'”。
在一些实施例中,第一条件语句也可以称为查询逻辑表达式,也可以称为查询表达式,也可以称为查询字符串。
在一些实施例中,从预设置的数据集中获取第一条件语句;也可以从构建设备的输入内容中获取第一条件语句。
步骤420:解析第一条件语句,生成AST。
抽象语法树AST用于表示代码的语法结构,其中每一个节点代表一个语法结构。图3示出了本申请一个示例性实施例提供的抽象语法树230的示意图。
在抽象语法树230中,根节点代表程序的整体结构,它是抽象语法树230的顶部节点。子节点是从根节点开始的连接到根节点的节点。这些子节点代表程序的不同部分或表达式。父节点是子节点的上一级节点,它可以包含一个或多个子节点。节点和节点之间的线代表语法结构中的关系,例如父节点和子节点之间的关系表示了语义上的层次关系。节点上存储着相应语法结构的信息,例如字段名、逻辑操作符、常量值等。
其中,query是根节点,表示一个查询;它有两个子节点:<EOF>和queryExpression:commonQuery。其中,<EOF>表示查询结束;queryExpression:commonQuery是一个查询表达式节点,表示常见查询;它有五个子节点,包括:两个singleTermQuery子节点,两个WHITESPACE子节点和一个queryOperator子节点。其中,singleTermQuery表示单一关键字查询;每个singleTermQuery都有一个字段名(FieldName)和一个查询值(termExpression),分别表示查询的字段名和查询的值;WHITESPACE是一个空白节点,表示空格字符;queryOperator是一个查询逻辑操作符节点,表示查询使用的逻辑操作符;INTEGER_VALUE是一个整数值节点,表示一个整数类型的常量或变量。
在一些实施例中,该语句转换方法基于语法分析工具和转换语言实现,语法分析工具包括ANTLR、Bison、Yacc、PEG.js等工具,转换语言包括Go语言、Java、Python、C++、JavaScript等编程语言,本申请实施例对此不加以限定,以ANTLR作为语法分析工具,Go语言作为转换语言为例进行说明。
在一些实施例中,通过ANTLR解析第一条件语句,将第一条件语句分解为至少一个查询子句,根据至少一个查询子句生成AST。
步骤430:基于AST生成第二条件语句。
其中,第二条件语句是基于第二语法的条件语句,第二语法是与第一语法不同的编程语法或数据库查询语法。
在一些实施例中,第二语法是和第一语法相比更加具有泛用性的编程语法或数据库查询语法,例如SQL语法。
在一些实施例中,第二语法只是和第一语法不同,没有其它特征,例如第一语法为lucene查询语法,第二语法为Cypher语法、GraphQL语法、Gremlin语法等语法。
在一些实施例中,ANTLR生成查询检测器(QueryStringListener),查询检测器在遍历AST后,基于AST每个节点对应的查询子句的语句类型和语句内容生成第二条件语句。
综上所述,本实施例提供的方法通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句。由于第二语法例如SQL语法通常是具有更加广泛适应性的编程语法,在查询数据的时候,如果查询的数据库支持使用第二语法,那么只要输入第一条件语句就可以自动转换为第二条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
图5示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图,该方法由构建设备执行,该方法包括:
步骤410:获取第一条件语句。
其中,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句。
第一语法是任意一种编程语法或数据库查询语法,例如lucene查询语法、SQL语法、Cypher语法、GraphQL语法、Gremlin语法等。
例如,在第一语法为lucene查询语法,第一条件语句为“port:8080AND status:200”的情况下,表示查询满足端口(port)的值为8080,且状态码(status)的值为200的数据。
查询语句包括条件语句,示例性的:在第一语法为SQL语法的情况下,查询语句为“SELECT*FROM logs WHERE port='8080'”,条件语句为“WHERE port='8080'”。
在一些实施例中,第一条件语句也可以称为查询逻辑表达式,也可以称为查询表达式,也可以称为查询字符串。
在一些实施例中,从预设置的数据集中获取第一条件语句;也可以从构建设备的输入内容中获取第一条件语句。
步骤422:将第一条件语句分解为至少一个标记。
在一些实施例中,该语句转换方法基于语法分析工具和转换语言实现,语法分析工具包括ANTLR、Bison、Yacc、PEG.js等工具,转换语言包括Go语言、Java、Python、C++、JavaScript等编程语言,本申请实施例对此不加以限定,以ANTLR作为语法分析工具,Go语言作为转换语言为例进行说明。
第一条件语句被ANTLR分解为至少一个标记(Tokens)。每个标记表示第一条件语句中的一个组成部分,包括:字段名(FieldName)、比较操作符(comparisonOperator)、空白(WHITESPACE)、查询值(termExpression)、符号。
示例性的,第一条件语句“port:8080AND status:200”被分解为如下标记:FieldName("port"),冒号,termExpression("8080"),AND,FieldName("status"),冒号,termExpression("200")。
步骤424:基于至少一个标记,生成AST。
在一些实施例中,基于ANTLR定义的关于查询逻辑表达式的语法规则,对至少一个标记进行解析,生成AST,例如对FieldName("port")进行解析,生成AST中的端口(port)相关的节点。
步骤432:对AST进行遍历,识别到至少一个查询子句。
在一些实施例中,AST包括至少一个查询子句,查询子句是第一条件语句的一部分,查询子句包括标记。
在一些实施例中,AST包括一个查询子句,查询子句和第一条件语句相同,例如在第一条件语句为“port:8080”的情况下,查询子句为“port:8080”。
在一些实施例中,AST包括多个查询子句,查询子句是第一条件语句的一部分,例如在第一条件语句为“port:8080AND status:200”的情况下,查询子句包括“port:8080”,“AND”和“status:200”。
步骤434:基于至少一个查询子句生成第二条件语句。
在一些实施例中,在只有一个查询子句的情况下,将一个查询子句转换为第二条件语句;
或,在有多个查询子句的情况下,将多个查询子句转换为基于第二语法的查询子句后,组合为第二条件语句。
示例性的,查询子句包括“port:8080”,转换为第二条件语句“WHERE port='8080'”,“WHERE”是根据第二语法的规则自动生成的字段。
或,查询子句包括“port:8080”,“AND”和“status:200”,分别转换为“port='8080'”,“AND”和“status='200'”,组合为第二条件语句“WHERE port='8080'AND status='200'”,“WHERE”是根据第二语法的规则自动生成的字段。
在一些实施例中,该构建设备除了生成第二条件语句,还根据第二条件语句对应的查询语句,在数据库中查询数据,生成查询结果。
在一些实施例中,基于AST生成第三条件语句,第三条件语句是基于第三语法的条件语句。再通过解析第三条件语句,生成对应的第二AST。基于第二AST生成第二条件语句,从而提高查询数据的灵活性,支持查询更多类型的数据库例如基于第三语法的数据库。
综上所述,本实施例提供的方法通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句。由于第二语法例如SQL语法通常是具有更加广泛适应性的编程语法,在查询数据的时候,如果查询的数据库支持使用第二语法,那么只要输入第一条件语句就可以自动转换为第二条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
本实施例提供的方法还通过将第一条件语句分解为至少一个标记,基于至少一个标记,生成AST,保证了AST包括第一条件语句中的全部内容。
本实施例提供的方法还通过对AST进行遍历,识别到至少一个查询子句,基于至少一个查询子句生成第二条件语句,使得第二条件语句包括与查询子句一一对应的基于第二语法的查询子句。
图6示出了本申请一个示例性实施例提供的用于数据库的语句转换方法的流程图,该方法由构建设备执行,该方法包括:
步骤410:获取第一条件语句。
其中,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句。
第一语法是任意一种编程语法或数据库查询语法,例如lucene查询语法、SQL语法、Cypher语法、GraphQL语法、Gremlin语法等。
例如,在第一语法为lucene查询语法,第一条件语句为“port:8080AND status:200”的情况下,表示查询满足端口(port)的值为8080,且状态码(status)的值为200的数据。
查询语句包括条件语句,示例性的:在第一语法为SQL语法的情况下,查询语句为“SELECT*FROM logs WHERE port='8080'”,条件语句为“WHERE port='8080'”。
在一些实施例中,第一条件语句也可以称为查询逻辑表达式,也可以称为查询表达式,也可以称为查询字符串。
在一些实施例中,从预设置的数据集中获取第一条件语句;也可以从构建设备的输入内容中获取第一条件语句。
步骤422:将第一条件语句分解为至少一个标记。
在一些实施例中,该语句转换方法基于语法分析工具和转换语言实现,语法分析工具包括ANTLR、Bison、Yacc、PEG.js等工具,转换语言包括Go语言、Java、Python、C++、JavaScript等编程语言,本申请实施例对此不加以限定,以ANTLR作为语法分析工具,Go语言作为转换语言为例进行说明。
图7示出了本申请一个示例性实施例提供的语法分析工具的示意图,该语法分析工具以ANTLR710为例进行说明,ANTLR710生成查询检测器722和解析器724。第一条件语句被解析器724分解为至少一个标记(Tokens)。每个标记表示第一条件语句中的一个组成部分,包括:字段名(FieldName)、比较操作符(comparisonOperator)、空白(WHITESPACE)、查询值(termExpression)、符号。
示例性的,第一条件语句“port:8080AND status:200”被分解为如下标记:FieldName("port"),冒号,termExpression("8080"),AND,FieldName("status"),冒号,termExpression("200")。
步骤424:基于至少一个标记,生成AST。
在一些实施例中,基于ANTLR710定义的关于查询逻辑表达式的语法规则,使用解析器724对至少一个标记进行解析,生成AST,例如对FieldName("port")进行解析,生成AST中的端口(port)相关的节点。
步骤4322:遍历每个查询子句对应的节点状态。
其中,AST包括至少一个查询子句中的每个查询子句对应的节点,节点状态表示对应的查询子句的字段名和取值。
在一些实施例中,ANTLR生成查询检测器(QueryStringListener)722,查询检测器722在遍历AST的过程中,能够对节点的进入和退出进行检测。在如图3所示的抽象语法树中,查询检测器722从queryExpression:commonQuery开始,按照深度优先遍历的方式遍历到<EOF>结束。第二条件语句是基于第二语法的条件语句,本申请实施例中以第二语法为SQL语法为例进行说明。
在一些实施例中,当查询检测器722进入抽象语法树中的查询语句(query)时,会触发进入查询(EnterQuery)事件。在该事件中,查询检测器722生成条件语句生成器(SQLBuilder)742和栈(Stack)744。条件语句生成器742是一个字符串生成器,用于生成至少一个查询子句。查询子句是第一条件语句的一部分,查询子句包括上述标记,例如,在“port:8080AND status:200”中,“port:8080”就是一个查询子句;栈744用于存储遍历的每个节点状态,节点状态表示对应的查询子句的字段名和取值。
步骤4324:基于每个查询子句对应的节点状态,分别获取每个查询子句的字段名和取值。
在一些实施例中,查询检测器722按照深度优先遍历的方式遍历抽象语法树,深度优先遍历是与栈绑定的遍历方式。在遍历过程中,对于每个遍历到的节点,查询检测器722都会根据节点对应的节点状态,获取对应的查询子句的字段名和取值。对于不同类型的点,查询检测器722都有对应的处理逻辑。
例如,对于单一关键字查询(SingleTermQuery)“port:8080”,当查询检测器722进入此查询子句节点时,将触发EnterSingleTermQuery事件,查询检测器722会把这个查询子句节点的字段(port)和值(8080)一起作为一个单元压入栈744中;
对于逻辑操作符AND,查询检测器722会在遍历到时把AND也压入栈744中;对于另一个单一关键字查询“status:200”,查询检测器722会在遍历到时把它也作为一个单元压入栈744中。在这个过程中,栈744会变为:[status:200,AND,port:8080]。
步骤4342:基于每个查询子句的字段名和取值,生成第二条件语句。
在一些实施例中,基于第i个查询子句的字段名和取值,转换得到第i个转换查询子句,转换查询子句表示基于第二语法的查询子句,i为正整数;
在第i个查询子句不是最后一个查询子句的情况下,继续转换第i+1个查询子句;
在第i个查询子句是最后一个查询子句的情况下,组合全部转换查询子句,生成第二条件语句。
示例性的,在“port:8080AND status:200”中,在i=1即查询子句为“port:8080”的情况下,由于不是最后一个查询子句,继续转换第二个查询子句“AND”;
在i=3即转换“status:200”的情况下,由于是最后一个查询子句,组合全部转换查询子句,生成第二条件语句。
在一些实施例中,根据第i个查询子句的字段名,获取第i个查询子句的语句类型;
根据第i个查询子句的取值,获取第i个查询子句的语句内容;
根据第i个查询子句的语句类型和第i个查询子句的语句内容,将第i个查询子句转换为第i个转换查询子句。
示例性的,在“port:8080AND status:200”中,在i=1即查询子句为“port:8080”的情况下,根据字段名“port”获取该查询子句的语句类型为单一关键字查询,根据取值为8080获取该查询子句的语句内容为8080;
在i=2即查询子句为“AND”的情况下,根据字段名“AND”获取该查询子句的语句类型为逻辑操作符,没有取值和对应的语句内容;
在i=3即查询子句为“status:200”的情况下,根据字段名“status”获取该查询子句的语句类型为单一关键字查询,根据取值为200获取该查询子句的语句内容为200。
在一些实施例中,当遍历步骤完成,即退出查询语句(query)时,查询检测器开始处理栈中存储的节点状态,这个过程涉及退出查询(ExitQuery)事件。在此事件中,查询检测器将按照预设规则从栈中弹出查询子句,并使用条件语句生成器(SQLBuilder)生成第二条件语句。
查询检测器把栈中的查询子句按照后进先出(Last-In,First-Out,LIFO)的顺序弹出,对于弹出的每一个查询子句,条件语句生成器将会识别其语句类型和语句内容并进行转换,如果是逻辑操作符例如AND,那么将会被转换为第二条件语句中的AND;如果是单一关键字查询,那么将会被转换为第二条件语句中的条件语句,比如“port:8080”转换为“port='8080'”。转换后的查询子句被条件语句生成器组合在一起,形成完整的第二条件语句。示例性的,针对输入的第一条件语句“port:8080AND status:200”,条件语句生成器生成第二条件语句“WHERE port='8080'AND status='200'”。
综上所述,本实施例提供的方法通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句。由于第二语法例如SQL语法通常是具有更加广泛适应性的编程语法,在查询数据的时候,如果查询的数据库支持使用第二语法,那么只要输入第一条件语句就可以自动转换为第二条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
本实施例提供的方法还通过遍历每个查询子句对应的节点状态,基于每个查询子句对应的节点状态,分别获取每个查询子句的字段名和取值,从而生成第二条件语句,提高了转换第二条件语句的准确性。
上述实施例中,通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句,以通过ANTLR和Go语言将基于lucene查询语法的第一条件语句转换为基于SQL语法的第二条件语句为例,包括如下技术效果中的至少一种:
(1)提高通用性。
由于SQL语法是一种通用的查询语法,被大多数的数据库支持,因此,通过将基于lucene查询语法的第一条件语句转换为基于SQL语法的第二条件语句,可以使得这些条件语句在更多的数据库中得到应用。例如,用户可以直接将这些条件语句用于ClickHouse,MySQL等数据库,无需对条件语句做任何修改。
(2)简化查询语句的编写和维护。
对于那些同时使用lucene查询语法和SQL语法的数据库,开发者需要编写和维护两种不同类型的查询语句(查询语句包括条件语句),会增加开发和维护的难度。而通过本技术方案,开发者只需要编写基于lucene查询语法的第一条件语句,就可以自动得到对应的基于SQL语法的第二条件语句,大大简化了查询语句的编写和维护。
(3)提高查询效率。
对于某些复杂的查询需求,如果直接使用基于lucene查询语法的第一条件语句,可能会产生较大的计算和存储开销。而如果第一条件语句转换为基于SQL语法的第二条件语句,可以通过数据库中与SQL语法相关的查询优化机制,提高查询效率。
(4)提供更灵活的查询能力。
通过将基于lucene查询语法的第一条件语句转换为基于SQL语法的第二条件语句,用户不仅可以使用ES(基于lucene查询语法的搜索引擎)的强大的文本搜索能力,还可以利用SQL语法的复杂查询能力,实现更灵活的数据查询。
综上所述通过本技术方案,可以提高查询语句的通用性,简化查询语句的编写和维护,提高查询效率,以及提供更灵活的查询能力,从而满足不同的数据查询需求。
上述实施例中,序号相同的步骤可以认为是同一步骤。其中,图4对应的实施例,图5对应的实施例和图6对应的实施例可以单独实施,也可以组合实施,本申请对此不加以限定。
图8示出了本申请一个示例性实施例提供的用于数据库的语句转换装置的框图,该装置包括获取模块810、解析模块820和生成模块830。
获取模块810,用于获取第一条件语句,第一条件语句是基于第一语法的条件语句,条件语句是查询语句中用于指示查询条件的部分,查询语句是用于在数据库中查询数据的语句。
在本实施例的一种可能设计中,第一语法是任意一种编程语法或数据库查询语法,例如lucene查询语法、SQL语法、Cypher语法、GraphQL语法、Gremlin语法等。
例如,在第一语法为lucene查询语法,第一条件语句为“port:8080AND status:200”的情况下,表示查询满足端口(port)的值为8080,且状态码(status)的值为200的数据。
查询语句包括条件语句,示例性的:在第一语法为SQL语法的情况下,查询语句为“SELECT*FROM logs WHERE port='8080'”,条件语句为“WHERE port='8080'”。
在本实施例的一种可能设计中,第一条件语句也可以称为查询逻辑表达式,也可以称为查询表达式,也可以称为查询字符串。
在本实施例的一种可能设计中,从预设置的数据集中获取第一条件语句;也可以从构建设备的输入内容中获取第一条件语句。
解析模块820,用于解析第一条件语句,生成抽象语法树AST。
抽象语法树AST用于表示代码的语法结构,其中每一个节点代表一个语法结构。图3示出了本申请一个示例性实施例提供的抽象语法树230的示意图。
在抽象语法树230中,根节点代表程序的整体结构,它是抽象语法树230的顶部节点。子节点是从根节点开始的连接到根节点的节点。这些子节点代表程序的不同部分或表达式。父节点是子节点的上一级节点,它可以包含一个或多个子节点。节点和节点之间的线代表语法结构中的关系,例如父节点和子节点之间的关系表示了语义上的层次关系。节点上存储着相应语法结构的信息,例如字段名、逻辑操作符、常量值等。
其中,query是根节点,表示一个查询;它有两个子节点:<EOF>和queryExpression:commonQuery。其中,<EOF>表示查询结束;queryExpression:commonQuery是一个查询表达式节点,表示常见查询;它有五个子节点,包括:两个singleTermQuery子节点,两个WHITESPACE子节点和一个queryOperator子节点。其中,singleTermQuery表示单一关键字查询;每个singleTermQuery都有一个字段名(FieldName)和一个查询值(termExpression),分别表示查询的字段名和查询的值;WHITESPACE是一个空白节点,表示空格字符;queryOperator是一个查询逻辑操作符节点,表示查询使用的逻辑操作符;INTEGER_VALUE是一个整数值节点,表示一个整数类型的常量或变量。
在本实施例的一种可能设计中,该语句转换装置基于语法分析工具和转换语言实现,语法分析工具包括ANTLR、Bison、Yacc、PEG.js等工具,转换语言包括Go语言、Java、Python、C++、JavaScript等编程语言,本实施例对此不加以限定,以ANTLR作为语法分析工具,Go语言作为转换语言为例进行说明。
在本实施例的一种可能设计中,通过ANTLR解析第一条件语句,将第一条件语句分解为至少一个查询子句,根据至少一个查询子句生成AST。
生成模块830,用于基于AST生成第二条件语句,第二条件语句是基于第二语法的条件语句,第二语法是与第一语法不同的编程语法。
在本实施例的一种可能设计中,第二语法是和第一语法相比更加具有泛用性的编程语法或数据库查询语法,例如SQL语法。
在本实施例的一种可能设计中,第二语法只是和第一语法不同,没有其它特征,例如第一语法为lucene查询语法,第二语法为Cypher语法、GraphQL语法、Gremlin语法等语法。
在本实施例的一种可能设计中,ANTLR生成查询检测器(QueryStringListener),查询检测器在遍历AST后,基于AST每个节点对应的查询子句的语句类型和语句内容生成第二条件语句。
在本实施例的一种可能设计中,解析模块820,用于将第一条件语句分解为至少一个标记;基于至少一个标记,生成AST。
第一条件语句被ANTLR分解为至少一个标记(Tokens)。每个标记表示第一条件语句中的一个组成部分,包括:字段名(FieldName)、比较操作符(comparisonOperator)、空白(WHITESPACE)、查询值(termExpression)、符号。
示例性的,第一条件语句“port:8080AND status:200”被分解为如下标记:FieldName("port"),冒号,termExpression("8080"),AND,FieldName("status"),冒号,termExpression("200")。
在本实施例的一种可能设计中,基于ANTLR定义的关于查询逻辑表达式的语法规则,对至少一个标记进行解析,生成AST,例如对FieldName("port")进行解析,生成AST中的端口(port)相关的节点。
在本实施例的一种可能设计中,生成模块830包括识别单元832和生成单元834,AST包括至少一个查询子句。
识别单元832,用于对AST进行遍历,识别到至少一个查询子句。
在本实施例的一种可能设计中,AST包括至少一个查询子句,查询子句是第一条件语句的一部分,查询子句包括标记。
在本实施例的一种可能设计中,AST包括一个查询子句,查询子句和第一条件语句相同,例如在第一条件语句为“port:8080”的情况下,查询子句为“port:8080”。
在本实施例的一种可能设计中,AST包括多个查询子句,查询子句是第一条件语句的一部分,例如在第一条件语句为“port:8080AND status:200”的情况下,查询子句包括“port:8080”,“AND”和“status:200”。
生成单元834,用于基于至少一个查询子句生成第二条件语句;
其中,查询子句是第一条件语句的一部分,查询子句包括标记。
在本实施例的一种可能设计中,在只有一个查询子句的情况下,将一个查询子句转换为第二条件语句;
或,在有多个查询子句的情况下,将多个查询子句转换为基于第二语法的查询子句后,组合为第二条件语句。
示例性的,查询子句包括“port:8080”,转换为第二条件语句“WHERE port='8080'”,“WHERE”是根据第二语法的规则自动生成的字段。
或,查询子句包括“port:8080”,“AND”和“status:200”,分别转换为“port='8080'”,“AND”和“status='200'”,组合为第二条件语句“WHERE port='8080'AND status='200'”,“WHERE”是根据第二语法的规则自动生成的字段。
在本实施例的一种可能设计中,该装置除了生成第二条件语句,还根据第二条件语句对应的查询语句,在数据库中查询数据,生成查询结果。
在本实施例的一种可能设计中,生成模块830,用于基于AST生成第三条件语句,第三条件语句是基于第三语法的条件语句。解析模块820,用于解析第三条件语句,生成对应的第二AST。基于第二AST生成第二条件语句,从而提高查询数据的灵活性,支持查询更多类型的数据库例如基于第三语法的数据库。
在本实施例的一种可能设计中,AST包括至少一个查询子句中的每个查询子句对应的节点,识别单元832,用于遍历每个查询子句对应的节点状态,节点状态表示对应的查询子句的字段名和取值;基于每个查询子句对应的节点状态,分别获取每个查询子句的字段名和取值。
在本实施例的一种可能设计中,ANTLR生成如图7所示的查询检测器722,查询检测器722在遍历AST的过程中,能够对节点的进入和退出进行检测。在如图3所示的抽象语法树中,查询检测器722从queryExpression:commonQuery开始,按照深度优先遍历的方式遍历到<EOF>结束。第二条件语句是基于第二语法的条件语句,本申请实施例中以第二语法为SQL语法为例进行说明。
在本实施例的一种可能设计中,当查询检测器722进入抽象语法树中的查询语句(query)时,会触发进入查询(EnterQuery)事件。在该事件中,查询检测器722生成条件语句生成器(SQLBuilder)742和栈(Stack)744。条件语句生成器742是一个字符串生成器,用于生成至少一个查询子句。查询子句是第一条件语句的一部分,查询子句包括上述标记,例如,在“port:8080AND status:200”中,“port:8080”就是一个查询子句;栈744用于存储遍历的每个节点状态,节点状态表示对应的查询子句的字段名和取值。
在本实施例的一种可能设计中,查询检测器722按照深度优先遍历的方式遍历抽象语法树,深度优先遍历是与栈绑定的遍历方式。在遍历过程中,对于每个遍历到的节点,查询检测器722都会根据节点对应的节点状态,获取对应的查询子句的字段名和取值。对于不同类型的点,查询检测器722都有对应的处理逻辑。
例如,对于单一关键字查询(SingleTermQuery)“port:8080”,当查询检测器722进入此查询子句节点时,将触发EnterSingleTermQuery事件,查询检测器722会把这个查询子句节点的字段(port)和值(8080)一起作为一个单元压入栈744中;
对于逻辑操作符AND,查询检测器722会在遍历到时把AND也压入栈744中;对于另一个单一关键字查询“status:200”,查询检测器722会在遍历到时把它也作为一个单元压入栈744中。在这个过程中,栈744会变为:[status:200,AND,port:8080]。
生成单元834,用于基于每个查询子句的字段名和取值,生成第二条件语句。
在本实施例的一种可能设计中,生成单元834,用于基于第i个查询子句的字段名和取值,转换得到第i个转换查询子句,转换查询子句表示基于第二语法的查询子句,i为正整数;
在第i个查询子句不是最后一个查询子句的情况下,继续转换第i+1个查询子句;
在第i个查询子句是最后一个查询子句的情况下,组合全部转换查询子句,生成第二条件语句。
示例性的,在“port:8080AND status:200”中,在i=1即查询子句为“port:8080”的情况下,由于不是最后一个查询子句,继续转换第二个查询子句“AND”;
在i=3即转换“status:200”的情况下,由于是最后一个查询子句,组合全部转换查询子句,生成第二条件语句。
在本实施例的一种可能设计中,生成单元834,用于根据第i个查询子句的字段名,获取第i个查询子句的语句类型;
根据第i个查询子句的取值,获取第i个查询子句的语句内容;
根据第i个查询子句的语句类型和第i个查询子句的语句内容,将第i个查询子句转换为第i个转换查询子句。
示例性的,在“port:8080AND status:200”中,在i=1即查询子句为“port:8080”的情况下,根据字段名“port”获取该查询子句的语句类型为单一关键字查询,根据取值为8080获取该查询子句的语句内容为8080;
在i=2即查询子句为“AND”的情况下,根据字段名“AND”获取该查询子句的语句类型为逻辑操作符,没有取值和对应的语句内容;
在i=3即查询子句为“status:200”的情况下,根据字段名“status”获取该查询子句的语句类型为单一关键字查询,根据取值为200获取该查询子句的语句内容为200。
在本实施例的一种可能设计中,当遍历步骤完成,即退出查询语句(query)时,查询检测器开始处理栈中存储的节点状态,这个过程涉及退出查询(ExitQuery)事件。在此事件中,查询检测器将按照预设规则从栈中弹出查询子句,并使用条件语句生成器(SQLBuilder)生成第二条件语句。
查询检测器把栈中的查询子句按照后进先出(Last-In,First-Out,LIFO)的顺序弹出,对于弹出的每一个查询子句,条件语句生成器将会识别其语句类型和语句内容并进行转换,如果是逻辑操作符例如AND,那么将会被转换为第二条件语句中的AND;如果是单一关键字查询,那么将会被转换为第二条件语句中的条件语句,比如“port:8080”转换为“port='8080'”。转换后的查询子句被条件语句生成器组合在一起,形成完整的第二条件语句。示例性的,针对输入的第一条件语句“port:8080AND status:200”,条件语句生成器生成第二条件语句“WHERE port='8080'AND status='200'”。
综上所述,本实施例提供的装置通过解析基于第一语法的第一条件语句生成AST,基于AST生成基于第二语法的第二条件语句。由于第二语法例如SQL语法通常是具有更加广泛适应性的编程语法,在查询数据的时候,如果查询的数据库支持使用第二语法,那么只要输入第一条件语句就可以自动转换为第二条件语句,不需要根据不同数据库编写对应语法的条件语句,提高了查询数据的效率,简化了条件语句的编写和维护。
本实施例提供的装置还通过将第一条件语句分解为至少一个标记,基于至少一个标记,生成AST,保证了AST包括第一条件语句中的全部内容。
本实施例提供的装置还通过对AST进行遍历,识别到至少一个查询子句,基于至少一个查询子句生成第二条件语句,使得第二条件语句包括与查询子句一一对应的基于第二语法的查询子句。
获取模块810的功能介绍,可以参考图4实施例中步骤410的内容。
解析模块820的功能介绍,可以参考图4实施例中步骤420,图5实施例中步骤422和步骤424的内容。
生成模块830的功能介绍,可以参考图4实施例中步骤430,图5实施例中步骤432和步骤434,图6实施例中步骤4322,步骤4324和步骤4342的内容。
本申请实施例还提供了一种计算机设备,该计算机设备包括:处理器和存储器,存储器中存储有至少一段程序;处理器用于执行存储器中的至少一段程序以实现上述各方法实施例提供的用于数据库的语句转换方法。
图9是本申请一个示例性实施例提供的计算机设备900的结构框图。通常,计算机设备900包括有:处理器901和存储器902。
处理器901可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器901可以采用数字信号处理(Digital Signal Processing,DSP)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)、可编程逻辑阵列(Programmable Logic Array,PLA)中的至少一种硬件形式来实现。处理器901也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称中央处理器(Central ProcessingUnit,CPU);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器901可以包括图像处理器(Graphics Processing Unit,GPU),GPU用于负责显示屏所需要显示的内容的渲染和绘制。在一些实施例中,处理器901还可以包括人工智能(Artificial Intelligence,AI)处理器,该AI处理器用于处理有关机器学习的计算操作。
存储器902可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器902还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在一些实施例中,存储器902中的非暂态的计算机可读存储介质用于存储至少一个指令,该至少一个指令用于被处理器901执行以实现本申请中方法实施例提供的用于数据库的语句转换方法。
在一些实施例中,计算机设备900还可选包括有:输入接口903和输出接口904。处理器901、存储器902和输入接口903、输出接口904之间可以通过总线或信号线相连。各个外围设备可以通过总线、信号线或电路板与输入接口903、输出接口904相连。输入接口903、输出接口904可被用于将输入/输出相关的至少一个外围设备连接到处理器901和存储器902。在一些实施例中,处理器901、存储器902和输入接口903、输出接口904被集成在同一芯片或电路板上;在一些其他实施例中,处理器901、存储器902和输入接口903、输出接口904中的任意一个或两个可以在单独的芯片或电路板上实现,本申请实施例对此不加以限定。
本领域技术人员可以理解,上述示出的结构并不构成对计算机设备900的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
在示例性实施例中,还提供了一种芯片,芯片包括可编程逻辑电路和/或程序指令,当芯片在计算机设备900上运行时,用于实现本申请中方法实施例提供的用于数据库的语句转换方法。
在示例性实施例中,还提供了一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令存储在计算机可读存储介质中,处理器从计算机可读存储介质中获取该计算机指令,处理器执行该计算机指令以实现本申请中方法实施例提供的用于数据库的语句转换方法。
在示例性实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有至少一段程序,至少一段程序由处理器加载并执行以实现本申请中方法实施例提供的用于数据库的语句转换方法。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种用于数据库的语句转换方法,其特征在于,所述方法包括:
获取第一条件语句,所述第一条件语句是基于第一语法的条件语句,所述条件语句是查询语句中用于指示查询条件的部分,所述查询语句是用于在所述数据库中查询数据的语句;
解析所述第一条件语句,生成抽象语法树AST;
基于所述AST生成第二条件语句,所述第二条件语句是基于第二语法的条件语句。
2.根据权利要求1所述的方法,其特征在于,所述解析所述第一条件语句,生成抽象语法树AST,包括:
将所述第一条件语句分解为至少一个标记;
基于所述至少一个标记,生成所述AST。
3.根据权利要求2所述的方法,其特征在于,所述AST包括至少一个查询子句,所述基于所述AST生成第二条件语句,包括:
对所述AST进行遍历,识别到所述至少一个查询子句;
基于所述至少一个查询子句生成所述第二条件语句;
其中,所述查询子句是所述第一条件语句的一部分,所述查询子句包括所述标记。
4.根据权利要求3所述的方法,其特征在于,所述AST包括所述至少一个查询子句中的每个查询子句对应的节点,所述对所述AST进行遍历,识别到所述至少一个查询子句,包括:
遍历所述每个查询子句对应的节点状态,所述节点状态表示对应的所述查询子句的字段名和取值;
基于所述每个查询子句对应的节点状态,分别获取所述每个查询子句的字段名和取值;
所述基于所述至少一个查询子句,生成所述第二条件语句,包括:
基于所述每个查询子句的字段名和取值,生成所述第二条件语句。
5.根据权利要求4所述的方法,其特征在于,所述基于所述每个查询子句的字段名和取值,生成所述第二条件语句,包括:
基于第i个查询子句的字段名和取值,转换得到第i个转换查询子句,所述转换查询子句表示基于所述第二语法的查询子句,i为正整数;
在所述第i个查询子句不是最后一个查询子句的情况下,继续转换第i+1个查询子句;
在所述第i个查询子句是所述最后一个查询子句的情况下,组合所述全部转换查询子句,生成所述第二条件语句。
6.根据权利要求5所述的方法,其特征在于,所述基于第i个查询子句的字段名和取值,转换得到第i个转换查询子句,包括:
根据所述第i个查询子句的字段名,获取所述第i个查询子句的语句类型;
根据所述第i个查询子句的取值,获取所述第i个查询子句的语句内容;
根据所述第i个查询子句的语句类型和所述第i个查询子句的语句内容,将所述第i个查询子句转换为所述第i个转换查询子句。
7.一种用于数据库的语句转换装置,其特征在于,所述装置包括:
获取模块,用于获取第一条件语句,所述第一条件语句是基于第一语法的条件语句,所述条件语句是查询语句中用于指示查询条件的部分,所述查询语句是用于在所述数据库中查询数据的语句;
解析模块,用于解析所述第一条件语句,生成抽象语法树AST;
生成模块,用于基于所述AST生成第二条件语句,所述第二条件语句是基于第二语法的条件语句。
8.一种计算机设备,其特征在于,所述计算机设备包括:处理器和存储器,所述存储器中存储有至少一段程序;所述处理器用于执行所述存储器中的所述至少一段程序以实现如权利要求1至6任一所述的用于数据库的语句转换方法。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一段程序,所述至少一段程序由处理器加载并执行以实现如权利要求1至6任一所述的用于数据库的语句转换方法。
10.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机指令,所述计算机指令存储在计算机可读存储介质中,处理器从所述计算机可读存储介质中获取所述计算机指令,所述处理器执行所述计算机指令以实现如权利要求1至6任一所述的用于数据库的语句转换方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311373760.2A CN117435607A (zh) | 2023-10-20 | 2023-10-20 | 用于数据库的语句转换方法、装置、设备和介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311373760.2A CN117435607A (zh) | 2023-10-20 | 2023-10-20 | 用于数据库的语句转换方法、装置、设备和介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117435607A true CN117435607A (zh) | 2024-01-23 |
Family
ID=89556240
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311373760.2A Pending CN117435607A (zh) | 2023-10-20 | 2023-10-20 | 用于数据库的语句转换方法、装置、设备和介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117435607A (zh) |
-
2023
- 2023-10-20 CN CN202311373760.2A patent/CN117435607A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10262062B2 (en) | Natural language system question classifier, semantic representations, and logical form templates | |
US8452772B1 (en) | Methods, systems, and articles of manufacture for addressing popular topics in a socials sphere | |
US9311058B2 (en) | Jabba language | |
KR101213890B1 (ko) | 강한 데이터 유형을 이용하여 소프트웨어 프로그램에서음성 인식 문법을 나타내기 위한 방법 | |
CN108595171B (zh) | 对象的模型生成方法、装置、设备及存储介质 | |
US20230009946A1 (en) | Generative relation linking for question answering | |
CN114625844B (zh) | 一种代码搜索方法、装置及设备 | |
CN112148281A (zh) | 基于意图的机器编程 | |
CN107766036B (zh) | 一种模块的构建方法、构建装置及终端设备 | |
CN111898024A (zh) | 一种智能问答方法、装置、可读存储介质及计算设备 | |
US11238101B1 (en) | System and method for interpreting natural language commands with compound criteria | |
CN112269884A (zh) | 信息抽取方法、装置、设备及存储介质 | |
CN111831624A (zh) | 数据表创建方法、装置、计算机设备及存储介质 | |
CN117435607A (zh) | 用于数据库的语句转换方法、装置、设备和介质 | |
CN112306493A (zh) | 热修复补丁生成方法、装置、存储介质及计算机设备 | |
CN114282529A (zh) | 语法查询方法、系统及计算机存储介质 | |
CN114064685A (zh) | 数据标准化访问方法及其装置、设备、介质、产品 | |
Rajbhoj et al. | DocToModel: Automated Authoring of Models from Diverse Requirements Specification Documents | |
Javed et al. | An unsupervised incremental learning algorithm for domain-specific language development | |
US20200042594A1 (en) | Proposition identification in natural language and usage thereof | |
CN110874350A (zh) | 结构化日志数据的加工方法和装置 | |
Forcher et al. | Semantic logging: Towards explanation-aware das | |
CN111709250B (zh) | 用于信息处理的方法、装置、电子设备和存储介质 | |
Alajlan et al. | From semi-automated to automated methods of ontology learning from twitter data | |
CN112162738B (zh) | 数据转化方法、装置、终端设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |