DataQL(Data Query Language)DataQL 是一种查询语言。旨在通过提供直观、灵活的语法来描述客户端应用程序的数据需求和交互。
数据的存储根据其业务形式通常是较为简单的,并不适合直接在页面上进行展示。因此开发页面的前端工程师需要为此做大量的工作,这就是 DataQL 极力解决的问题。
例如:下面这个 DataQL 从 user 函数中查询 id 为 4 的用户相关信息并返回给应用。
1 2 3 4 5 |
return userByID({'id': 4}) => { 'name', 'sex', 'age' } |
返回结果:
1 2 3 4 5 |
{ 'name' : '马三', 'sex' : 'F', 'age' : 25 } |
在比如:性别数据的字典映射,为此您可以通过 DataQL 的表达式进行快速的转换。从而无需任何服务端和前端的开发。
1 2 3 4 5 |
return userByID({'id': 4}) => { 'name', 'sex' : (sex == 'F') ? '男' : '女' , 'age' : age + '岁' } |
返回结果:
1 2 3 4 5 |
{ 'name' : '马三', 'sex' : '男', 'age' : '25岁' } |
还可以定义一个查询函数来重用这一逻辑。
1 2 3 4 5 6 7 8 |
var sex_str = (sex) -> { return (sex == 'F' ? '男' : '女'); } return userByID({'id': 4}) => { 'name', 'sex' : sex_str(sex), 'age' : age + '岁' } |
DataQL 有一些设计原则,这也使其成为有一定的特性。
层次结构:多数产品都涉及数据的层次结构,为了保证结构的一致性 DataQL 结果也是分层的。
数据为中心:前端工程是一个比较典型的场景,但是 DataQL 不局限于此(后端友好性)。
弱类型定义:语言中不会要求声明任何形式的类型结构。
简单逻辑:具备简单逻辑处理能力:表达式计算、对象取值、条件分支、lambda和函数。
编译运行:查询的执行是基于编译结果的。
混合语言:允许查询中混合任意的其它语言代码,典型的场景是查询中混合 SQL 查询语句。
类 JS 语法:类JS语法设计,学习成本极低。
基于这些原则和特性,DataQL变为构建应用程序的强大而高效的环境。
目前 DataQL 提供了 Java 版的指令执行引擎,使用这个引擎您只需要依赖一个 Jar 包即可。任何一个Web应用或者 Spring Boot 的 jar 应用使用都变得非常容易。
请注意 DataQL 不是一门脚本语言,它对逻辑的处理仅限于简单场景。DataQL 的解决问题的重点集中在:数据的聚合和转换以及过程中的简单加工处理。
警
简介 DataQL(Data Query Language)DataQL 是一种查询语言。旨在通过提供直观、灵活的语法来描述客户端应用程序的数据需求和交互。 数据的存储根据其业务形式通常是较为简单的,并不适合直接在页面上进行展示。因此开发页面的前端工程师需要为此做大量的工作,这就是 DataQL 极力解决的问题。 请注意 DataQL 不是一门编程语言,它是查询语言。它对逻辑的处理仅限于简单场景。
1、整体是自定义了一门dsl,并实现了指令集和执行器 2、核心数据结构 QueryModel 语法树 QIL 指令集 Query:整体dsl解析执行的门面 DataModel:通用数据类型,可以解包成具体的object list 原子类型等 UDF (User-Defined Function)用户定义函数,mysql的udf是用c写的,dataql的udf是用java写的(注册后可以在脚
万能查询执行步骤 引用包 <dependency> <groupId>net.hasor</groupId> <artifactId>hasor-dataql</artifactId> <version>4.1.13</version> <!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-da
import 'net.hasor.dataql.fx.basic.StringUdfSource' as string; import 'net.hasor.dataql.fx.basic.CollectionUdfSource' as collect; // 要求获取男同学中,成绩为优秀的科目 var students = [ {"name":"A", "sex":"F", "re
hint FRAGMENT_SQL_DATA_SOURCE = "73ea3095cb514320934a6cc46581145e" hint FRAGMENT_SQL_QUERY_BY_PAGE = true hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1 var dataSet = @@sql(apiNo)<% select * from
词法记号 以下正式的语法规范可以用来帮助更深入的了解如何使用 DataQL 的所有特性。 源码文本 DataQL 文档表示建议使用 Unicode字符序列。但这并不是强制的,您可以通过 java.io.Reader 来读取您的字符流数据。故本文不会强调您的编写查询语言所使用的字符集。 DataQL 支持单行注释和多行注释两种注释方式。与 JavaScript 一样,您可以使用://、/* ...
概述 使用find()方法在MongoDB集合中查询数据。MongoDB所有的查询范围都是单个集合的。也就是说MongoDB不能跨集合查询数据。 查询可以返回集合中的所有文档,或者仅仅返回指定过滤条件的文档。你可以指定一个过滤条件或才一个判断条件作为参数传递给find()方法。 find()方法在一个游标中返回所有的结果集,通过游标的迭代可以输出所有文档。 查询集合中的所有文档 查询集合中的所有文
获取单个数据 获取单个数据的方法包括: 取出主键为1的数据 $user = UserModel::get(1); echo $user->user_nickname; // 使用数组查询 $user = UserModel::get(['user_nickname' => '老猫']); // 使用闭包查询 $user = UserModel::get(function($query){
数据库操作使用 Db类封装方法,请事先在引入 Db类 use think\Db; 以上可以引入 Db,后面的文档不再说明,直接使用; 查询一个数据使用: // table方法必须指定完整的数据表名 Db::name('user')->where('id',1)->find(); find 方法查询结果不存在,返回 null 查询数据集使用: Db::name('user')->where('s
获取单个数据 获取单个数据的方法包括: 取出主键为1的数据 $user = UserModel::find(1); echo $user->user_nickname; 如果你是在模型内部,请不要使用$this->user_nickname的方式来获取数据,请使用$this->getAttr('user_nickname') 替代。 或者在实例化模型后调用查询方法 $user = new Use
数据库操作使用 Db类封装方法,请事先在引入 Db类 use think\facade\Db; 以上可以引入 Db,后面的文档不再说明,直接使用; 查询一个数据使用: // table方法必须指定完整的数据表名 Db::name('user')->where('id',1)->find(); find 方法查询结果不存在,返回 null 查询数据集使用: Db::name('user')->w
我们废弃了v2.0的一些API,如 getItems(), getItem() 这些API的参数太多,不容易记得,现在都采用find(), findOne(), findById() 来替换了,全部使用连贯操作。 查询数据列表 public function find(); public function getList($sql) $model->getList("select * from u