API Server 支持 Parameterized Queries

背景

OpenMLDB 的 apiserver 对 query 的支持有限,仅支持执行命令,返回执行状态,不能获得 query 结果,不支持 parameterized queries。在这个任务中,你将参考 apiserver 其他接口与 client(SQLRouter)的 query API ExecuteSQLParameterized,实现 apiserver 的 parameterized queries 接口,以及查询结果数据的返回。

编程语言

C++

实现方案

apiserver(src/apiserver)的核心逻辑是,apiserver 支持 restful api(接收http 请求与附加的 josn data),再转化为 client(SQLRouter)可接受的参数格式,调用 client 访问 OpenMLDB 集群,获取结果并转换为 json 结果,返回给 http。
所以,Parameterized Queries 的执行顺序,以及你需要设计实现的各个任务为:

  1. 设计 http 请求格式,做到可以传入 parameterized query 的必要参数
  2. 完善已有的 query provider,将 http 发送来的 parameterized query 参数,转换为 Execute SQL Parameterized 的输入参数,即 sql string 和 SQLRequestRow,转换可参考 src/sdk/sql_sdk_test.cc 等使用 ExecuteSQLParameterized 方法的代码。
  3. ExecuteSQLParameterized 返回的 ResultSet 结果,转换为 json 格式,转换请参考JsonWriter& operator&(JsonWriter& ar, ExecSPResp& s),即使用 JsonWriter 写入结果。你可自行设计更好的 resultset json 格式。使用 JsonWriter 写入结果后,后续处理将在已有框架下自动完成。
  4. query provider 中的其他 query 方法返回的结果,也同理进行转换。
    各个步骤都建议增加单元测试,请添加到 api_server_test.cc。test 运行方法为,额外启动 zk(sh steps/ut_zookeeper.sh start)后,再运行api_server_test。test 程序内部将启动模拟集群 mini cluster,test 中将访问这个 mini cluster 进行测试。整体 http 测试,可以参考TEST_F(APIServerTest, procedure)等测试写法。
    http api 的输入和输出 data,我们使用 JsonReader 和 JsonWriter 来编解码。理想情况下,我们希望可以做到解码编码模版化,参考template <typename Archiver> Archiver& operator&(Archiver& ar, PutResp& s),因为这样方便我们直接读取 json 结果。但可能会有不可逆的情况,比如 ExecSPResp,我们在其中做了只 write 的逻辑,因此 reader 无法重用这段代码逻辑。
    如果不能做到编解码模版化,请将编码和解码分开设计:
  5. JsonReader 解码是比较简单的,无需提前确定格式,当然,你也可以增加解析方法,做到JsonReader >> obj一步解析出QueryRequest。
  6. JsonWriter 编码需要重点关注,编码逻辑通常很复杂,我们希望你能增加一个编码方法函数,而不是增大 api 方法的代码长度,参考JsonWriter& operator&(JsonWriter& ar, ExecSPResp& s)

Github Issue

https://github.com/4paradigm/OpenMLDB/issues/397