Atitit QL查询语言总结 目录 1. QL = Query Language, 是查询语言的简称 1 2. 具体实现 1 2.1. Apcl 流程控制语言 1 2.2. 脚本流程控制 2 2.

Atitit QL查询语言总结

 

目录

1. QL = Query Language, 是查询语言的简称 1

2. 具体实现 1

2.1. Apcl 流程控制语言 1

2.2. 脚本流程控制 2

2.3. Aql 受限自然语言QL  4.5G 2

2.4. Jpql 2

2.5. Spel (调用java等扩展,集合投影选择等) 2

2.6. Ongl (调用java等扩展,集合投影选择等) 2

2.7. 安全sql 3

3. 其他感觉可以放后的东东 3

3.1. Es query string search 3

3.2. Es json query 3

3.3. GraphQL 3

3.4. 认识APIJSON ( ) 4

4. 问题 6

4.1. 语言的内嵌解决,通过特定api解决 类似jdbc等 6

4.2. 流程控制的ast互相转换问题 6

5. ref  6

 

  1. QL = Query Language, 是查询语言的简称

 

QL = Query Language, 是查询语言的简称, QL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余。它弥补了RESTful API(字段冗余,扩展性差、无法聚合api、无法定义数据类型、网络请求次数多)等不足。

  1. 具体实现
    1. Apcl 流程控制语言

流程控制是不是使用js等脚本更好些??

    1. 脚本流程控制

内嵌语言执行,需要特定api。。重要是sql,java的调用。。

    1. Aql 受限自然语言QL  4.5G
    2. Jpql
    3. Spel (调用java等扩展,集合投影选择等)
    4. Ongl (调用java等扩展,集合投影选择等)

 

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。

为什么使用OGNL
  相对于其它的表达式语言,OGNL的功能更为强大,它提供了很多高级而必需的特性,例如强大的类型转换功能、静态或实例方法的执行、跨集合投影,以及动态lambda表达式定义等。

 

访问静态方法和静态字段
@class@method(args) //调用静态方法
@class@field    //调用静态字段
  其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI

 

  • 投影
    OGNL提供了一种简单的方式在一个集合中对每一个元素闻调用相同的方法,或者抽取相同的属性,并将结果保存为一个新的集合,称之为投影。
         假如employees是一个包含了employee对象的列表,那么
    #employees.{name}将返回所有雇员的名字的列表。
         在投影期间,使用#this变量来引用迭代中的当前元素。
           如:objects.{#this instanceof String? #this: #this.toString()}
      3、选择
    OGNL提供了一种简单的方式来使用表达式从集合中选择某些元素,并将结果保存到新的集合中,称为选择。
          如#employees.{?#this.salary>3000}
          将返回薪水大于3000的所有雇员的列表。
    #employees.{^#this.salary>3000}
          将返回第一个薪水大于3000的雇员的列表。
    #employees.{$#this.salary>3000}
          将返回最后一个薪水大于3000的雇员的列表。
    1. 安全sql
  1. 其他感觉可以放后的东东
    1. Es query string search
    2. Es json query 
    3. GraphQL



 注意:GraphQL是api的查询语言,而不是数据库。从这个意义上说,它是数据库无关的,而且可以在使用API的任何环境中有效使用,我们可以理解为GraphQL是基于API之上的一层封装,目的是为了更好,更灵活的适用于业务的需求变化。

GraphQL不仅仅是替代RESTful API,GraphQL结合 Apollo Client 可以替我们管理应用中所有的数据,包括缓存和数据拼接。 Apollo Client甚至有可能代替 react中的redux以及Vue中的Vuex 成为通用数据管理方案的可能。

 

 

为什么推荐用GraphQL方案?

1.由前端定义需要哪些字段,要什么写什么

2.再也不需要对接口的文档进行维护了(自动生成文档,代码里定义的结构就是文档)

3.一个接口能够适用多个业务场景

4.再也不用改bug了(强类型,自动校验入参出参类型)

5.所有的接口都在一颗数下,一目了然,再也不用前端去写假数据了(代码里定义好结构之后自动生成mock接口

6.再不用痛苦的联调了(代码里定义好结构之后,自动生成接口在线调试工具,直接在界面里写请求语句来调试返回,而且调试的时候各种自动补全

7.react/vue/express/koa无缝接入(relay方案/apollo方案)

8.更容易写底层的工具去监控每个接口的请求统计信息(都在同一个端点的请求下)

9.不限语言,除了官方提供的js实现,其他所有的语言都有社区的实现

10.拥有各种方便易用的开发者工具

总结:

GraphQL 如今是一门很成熟的技术了,几乎所有的语言都对其有所支持。如果要采用 GraphQL,一定要注意要控制其灵活性,并做好性能的 benchmark。如果想要将已有的 API 系统迁移到 GraphQL,初期可以使用 GraphQL 包装已有的 REST API,让客户端工程师尽情试验。随后再根据重要性和紧迫程度逐步一个个重写已有的 API,切忌一上来就全部推到重写

    1. 认识APIJSON ( )

APIJSON是一种JSON传输结构协议。客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON字符串,所求即所得。一次请求任意结构任意数据,方便灵活,不需要专门接口或多次请求。支持增删改查、模糊搜索、远程函数调用等。还能去除重复数据,节省流量提高速度!从此HTTP传输JSON数据没有接口,更不需要文档!

 

而APIJSON则默认返回全部字段,可选 @column 来指定需要的字段。

"@column":"key0,key1,..." 

例如

{

  "User":{

    "id":38710,

    "@column":"id,name"

  }

}


 就以目前最流行的开源数据库MySQL为例吧:

 

如图所示,MySQL的基础功能中:

GraphQL仅支持极少的几个,而且全都要后端手动实现;

但APIJSON全都支持,而且全都是自动化的实现!

 

  1. 问题
    1. 语言的内嵌解决,通过特定api解决 类似jdbc等

是的一种语言内部可以调用另外一种dsl

    1. 流程控制的ast互相转换问题

直接使用sql的流程ast即可,方便转换sql。。

如果使用js的,需要解析到到js ast,在转换回sql ast

  1. ref
     

 

UnQL:NoSQL查询语言介绍 - Nosql-炼数成金-Dataguru专业数据分析社区.html

Hive查询语言(HiveQL) - u013402321的博客 - CSDN博客.html

PartiQL:一种用于所有数据的查询语言-InfoQ.html

ONGL简介 - 心扬 - 博客园.html

posted @ 2019-11-15 16:39  attilaxAti  阅读(86)  评论(0编辑  收藏  举报