写点什么

今日分享 | 初识 inBuilder 业务查询语言 -BQL

  • 2024-12-05
    山东
  • 本文字数:1976 字

    阅读完需:约 6 分钟

引言

在业务处理过程或查询过程中,有大量的关联查询、动态查询场景,此时使用视图模型、业务实体模型提前定义在实现上存在困难。基于 TSql 语法自主研发了一种业务查询语言 BQL,集成进 inBuilder 低代码平台。BQL 面向客户可以提供查询能力、权限控制、密级控制等功能。相较于传统的 SQL,BQL 能够屏蔽数据库的差异,对于不同数据库环境的客户提供一套统一的书写规范,减少了开发成本。

业务查询语言 BQL 包含"适配不同数据库"、"支持 Udt 字段穿透查询"、"支持权限"、"支持表策略"和"支持密级"等特性。本文将结合具体实例来介绍 BQL 的前三个特性,阐述 BQL 是如何适配不同的数据库、如何使用 Udt 字段进行穿透查询以及怎样控制权限的。

什么是 BQL

业务查询语言 BQL 是 iGIX 中查询平台提供的基于业务实体框架(Bef)的业务实体模型(BE)的业务查询领域语言,提供针对业务实体的查询、增加、修改、删除等操作。BQL 中查询的不是数据库的表名与列名,查询对象是 BE 实体上的节点与属性,可象征性的理解为:BE 实体上的节点对应数据库的表,节点上的属性对应数据库表的列。

简单举例如下:销售订单实体上想查询指定 ID 的订单信息,包括:订单编号、销售人员的名称。


Bql 书写如下:

SELECT  ZZSalesOrder.Code,  ZZSalesOrder.Employee_Name, FROM  ZZSalesOrder.ZZSalesOrder WHERE  ZZSalesOrder.ID = @ID
复制代码

 

其中 FROM 子句中的 ZZSalesOrder.ZZSalesOrder,表示要查询的节点,书写规则为 {实体编号}.{节点编号} ,SELECT 子句与 WHERE 子句查询的字段,如 ZZSalesOrder.Code,表示要查询的字段,书写规则为 {节点编号}.{属性的标签} 。

BQL 的特性

适配不同数据库

BQL 以 TSql 为语法基础,书写时使用的关键字和语法,与 TSql 一致。与其他数据库适配方式相比,BQL 只需开发一次,将新的数据库的语法扩展进来。也就是说,开发人员不需要再按照不同数据库写分支,BQL 语句解析之后会根据当前数据库环境重新组织 SQL 语句,转化为当前数据库可执行的 SQL 并执行查询。在这个过程中,BQL 执行器相当于一个"桥梁",开发人员不需要去研究每种数据库的方言,可以通过写 BQL 语句的方式,将查询语句送到"桥头",然后 BQL 会根据当前环境,自动组织"路线",到达数据库("桥尾")执行查询。所以说,BQL 对业务开发屏蔽了多数据库类型的细节,为将来数据库类型的扩展提供了方便。

支持穿透查询

为了避免复杂关联带来的开发成本,用户可以通过在 BE 上配置 Udt 字段,然后获取到该字段所指向的实体的信息,从而实现穿透查询。

举例如下:


销售订单实体上的【销售人员】字段是 UDT 字段,在销售订单上仅带出了【人员编号】与【人员名称】两个字段,销售订单上的普通查询仅支持销售人员的编号与名称的查询,比如:

SELECT SalesOrder.Salesrep_YSalesrep_Code, SalesOrder.Salesrep_YSalesrep_NameFROM SalesOrder.SalesOrder
复制代码

而销售人员实体上,不止编号和名称两个字段,如下图:

透过 UDT 可查询订单上销售人员的其他信息,比如【人员描述】,写法为:

SELECT SalesOrder.Salesrep.DescriptionFrom SalesOrder.SalesOrder
复制代码

其中,SalesOrder.Salesrep.Description 由三段组成,第二段 Salesrep 将查询重定向到该字段 UDT 所指向的实体上,即销售人员实体,然后在该实体上查询人员描述字段【Description】。

以及,如果销售人员实体上还有 UDT 字段,可继续进行穿透,比如查询订单上销售人员所在组织的名称,写法为:

SELECT SalesOrder.Salesrep.OrgID.NameFROM SalesOrder.SalesOrder
复制代码

在该 Bql 中,SalesOrder.Salesrep.OrgID.Name 由四段组成,进行了两次穿透。

支持权限控制

BQL 查询语句支持按传入的权限信息进行结果集过滤。BQL 执行器中提供了构造权限信息的方法,可以通过对业务实体节点上的属性配置权限对象、权限字段,来实现权限控制。

一个实践为查询对象(QO),提供了对业务实体上字段的权限配置,然后构建查询表单时实现数据的过滤:

首先,需要在 iGIX 的权限字段、权限对象菜单中进行权限的适配,比如某员工 A 只能看到自己的销售订单、管理层可以看到当前子公司的销售订单,在这里不多赘述。然后,需要在 QO 上将权限字段、权限对象绑定到业务实体的属性上:

最后通过该 QO 创建一个查询表单,就可以实现权限过滤。如下图,只能看到当前所在商户组织:查询平台组的所有订单

总结

浪潮海岳 inBuilder 业务查询语言-BQL 具有很多优势。BQL 契合了业务实体的开发框架,与业务紧密结合,做到了开箱即用——只要开发了业务实体就可以使用 BQL 语句实现查询。此外,BQL 能够屏蔽数据库的差异,业务开发人员不再需要针对不同的数据库单独写分支,只需要按照 BQL 的书写规范就可以实现不同数据库类型的查询,大大减少了开发成本。最后,BQL 支持权限控制以及密级控制等功能,保障了数据的安全性,避免了数据的泄露。


欢迎大家积极留言共建,期待与各位技术大咖的深入交流!

此外,欢迎大家下载我们的inBuilder低代码平台开源社区版,可免费下载使用,加入我们,开启开发体验之旅!

用户头像

还未添加个人签名 2023-03-07 加入

塑造企业一体化研发新范式

评论

发布
暂无评论
今日分享 | 初识inBuilder业务查询语言-BQL_低代码_inBuilder低代码平台_InfoQ写作社区