万能查询执行步骤

引用包

<dependency><groupId>net.hasor</groupId><artifactId>hasor-dataql</artifactId><version>4.1.13</version><!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-dataql -->
</dependency>

基于底层接口使用 DataQL

这种方式更加底层,依然是脱离了 Hasor 容器环境来执行 DataQL 查询。事实上无论是 Hasor 方式还是 JSR223 方式它们都是通过这个底层接口封装 DataQL 的。

DataQL 的运行基于三个步骤:

  • 解析DataQL查询
  • 编译查询
  • 执行查询

解析DataQL查询

解析 DataQL 查询就是把 DataQL 查询字符串通过解析器解码为 AST(抽象语法树)

QueryModel queryModel = QueryHelper.queryParser(query1);

编译查询

编译是指将DataQL 的 AST(抽象语法树) 编译为 QIL 指令序列。

QIL qil = QueryHelper.queryCompiler(queryModel, null, Finder.DEFAULT);

执行查询

根据 QIL 创建对应的 Query 接口即可。

Query dataQuery = QueryHelper.createQuery(qil, Finder.DEFAULT);

通过 Hasor 使用 DataQL

由于 AppContext 有自身的声明周期特性,因此需要做一个单例模式来创建 DataQL 接口。

public class DataQueryContext {private static AppContext appContext = null;private static DataQL     dataQL     = null;public static DataQL getDataQL() {if (appContext == null) {appContext = Hasor.create().build();dataQL = appContext.getInstance(DataQL.class);}return dataQL;}
}

运行代码


HashMap<String, Object> tempData = new HashMap<String, Object>() {{put("uid", "hello");put("sid", "world");
}};DataQL dataQL = DataQueryContext.getDataQL();
Query dataQuery = dataQL.createQuery("return [${uid},${sid}]");
QueryResult queryResult = dataQuery.execute(tempData);
DataModel dataModel = queryResult.getData();

dataModel 的值就是 [‘hello’,‘world’]

通过 JSR223 使用 DataQL

JDK1.6开始 Java引入了 JSR223 规范,通过该规范可以用一致的形式在JVM上执行一些脚本语言。
DataQL 默认实现了这一规范的接入API,这就使得开发者可以脱离 Hasor 容器的特性独立的使用 DataQL 查询引擎。
这种方法无需考虑 Hasor 容器生命周期问题。

ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("dataql");
SimpleScriptContext params = new SimpleScriptContext();
params.setBindings(scriptEngine.createBindings(), ScriptContext.GLOBAL_SCOPE);
params.setBindings(scriptEngine.createBindings(), ScriptContext.ENGINE_SCOPE);
params.setAttribute("uid", "Hello", ScriptContext.ENGINE_SCOPE);
params.setAttribute("sid", "world", ScriptContext.GLOBAL_SCOPE);Object eval = scriptEngine.eval("return [${uid},${sid}]", params);
DataModel dataModel = ((QueryResult) eval).getData();

dataModel 的值就是 [‘Hello’, ‘world’]
注意:在 JSR223 方式下:不提供 CustomizeScope 接口支持。三个Dim注解无效:@DimFragment、@DimUdf、@DimUdfSource

查询接口(Query)

以上无论使用的是何种方式查询都会通过 DataQL 的查询接口发出查询指令,查询接口的完整类名为 net.hasor.dataql.Query

/** 执行查询 */
public default QueryResult execute() throws InstructRuntimeException {return this.execute(symbol -> Collections.emptyMap());
}/** 执行查询 */
public default QueryResult execute(Map<String, ?> envData) throws InstructRuntimeException {return this.execute(symbol -> envData);
}/** 执行查询 */
public default QueryResult execute(Object[] envData) throws InstructRuntimeException {if (envData == null) {return this.execute(Collections.emptyMap());}Map<String, Object> objectMap = new HashMap<>();for (int i = 0; i < envData.length; i++) {objectMap.put("_" + i, envData[i]);}return this.execute(objectMap);
}/** 执行查询 */
public QueryResult execute(CustomizeScope customizeScope) throws InstructRuntimeException;

查询结果(QueryResult)

发出DataQL查询后,如果顺利执行完查询,结果会以 QueryResult 接口形式返回。QueryResult 接口定义了四个方法来获取返回值相关信息。

/** 执行结果是否通过 EXIT 形式返回的 */
public boolean isExit();/** 获得退出码。如果未指定退出码,则默认值为 0 */
public int getCode();/** 获得返回值 */
public DataModel getData();/** 获得本次执行耗时 */
public long executionTime();

总结

本次是DataQL万能查询执行步骤,同时支持多种查询方式,你可以试试
如有问题,欢迎有问题及时交流。谢谢!

DataQL之语法-万能查询执行步骤相关推荐

  1. mysql查询解析过程_MySQL查询执行过程详解

    查询是用户通过设置某些查询条件,从表或其他查询中选取全部或者部分数据,以表的形式显示数据供用户浏览.查询是一个独立的.功能强大的.具有计算功能和条件检索功能的数据库对象.MySQL数据库中,MySQL ...

  2. mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程

    一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...

  3. sql语句执行步骤详解

    一.准备工作 先来一段伪代码,首先你能看懂么? SELECT DISTINCT <select_list>FROM <left_table><join_type> ...

  4. MySql系列之mysql查询执行过程(附Mysql架构图及实操解析)

    一 MySql架构图 1.2 执行步骤: 1.客户端发送查询语句给服务器 2 服务器首先检查缓存中 是否存在该查询,若存在,返回缓存中存在的结果 不存在 执行下一步 3服务器进行sql解析 语法检测 ...

  5. select语句的语法顺序和执行顺序

    目录 1.语法顺序 2.执行顺序 3.优化方法 1.join 方面 2.where 方面 1.语法顺序 select语句的语法格式如下. select 字段列表 from 数据源 [ where条件表 ...

  6. DataQL之语法-词法记号

    词法记号 以下正式的语法规范可以用来帮助更深入的了解如何使用 DataQL 的所有特性. 源码文本 DataQL 文档表示建议使用 Unicode字符序列.但这并不是强制的,您可以通过 java.io ...

  7. bs架构与cs架构的区别_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明...

    概述 之前分享的主要是Oracle上的一些内容,那么mysql又有哪些地方不一样呢?下面从MySQL总体架构.sql查询执行流程和语句执行顺序来看一下.. 01 架构总览 下面看一下mysql的架构图 ...

  8. 数据库系统实现 第六章 查询执行

    第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析 ...

  9. mysql 查询执行计划_mysql8 参考手册--了解查询执行计划,使用EXPLAIN优化查询

    根据表,列,索引的详细信息以及WHERE子句中的条件,MySQL优化器考虑了许多技术来有效执行SQL查询中涉及的查找.无需读取所有行即可执行对巨大表的查询:可以执行涉及多个表的联接,而无需比较行的每个 ...

最新文章

  1. 对勾选的下拉选择进行同步选择
  2. linux重启was控制台报错,Linux非WAS部署,启动报错Cannot run program \lsb_release\
  3. 7种CSS圆角框解决方案
  4. python输入input数组_Python学习——实现简单的交互raw_input的使用
  5. .NET和Java之争
  6. CSS如何实现”右部宽度固定,左部自适应“的布局
  7. 【Java从0到架构师】RocketMQ 使用 - 发送消息、接收消息、特殊消息
  8. POJ3080Blue Jeans
  9. 2022年6月25日PMP考试通关宝典-1
  10. linux自带python3.5_linux上安装python3, 保留python2
  11. 机器人焊枪动作与编程实验_工业机器人编程实验.doc
  12. [codeforces 1379B] Dubious Cyrpto 公式推导
  13. 【vue系列-03】vue的计算属性,列表,监视属性及原理
  14. 深度 | 智慧城市背景下的“多规合一”标准探究
  15. 批量挖sql注入漏洞
  16. 每秒处理10万订单乐视集团支付架构 – CSDN博客
  17. 图8——判断有向图中是否有根
  18. 思维导图 mindnote,MindMaster,亿图图示,百度脑图
  19. FFmpeg截图以及生成缩略图
  20. Jmeter模拟selenium操作浏览器

热门文章

  1. LOD地形渲染技术概述
  2. Java之OutOfMemoryError简单分析
  3. 脸上不同位置长痘痘的原因
  4. [轉]值得研究 邓亚萍代表的到底是哪个“国家”?
  5. Teamviewer删除账号
  6. python读取csv表格的数据并用matplotlib画曲线图
  7. 邮箱发信数量被限制了,有什么方法可以解决么?
  8. 前后端交互流程,如何进行交互
  9. 使用Hutool工具完成发(带模板)邮件功能
  10. 【刷爆LeetCode】七月算法集训(14)栈