背景

OpenMLDB的apiserver仅支持insert数据和执行deploy等,尚未支持query。在这个任务中,你将参考apiserver其他接口与client(SQLRouter) query API ExecuteSQLParameterized,实现apiserver的query接口。

编程语言

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,参考RegisterPut/RegisterExecDeployment等方法
  3. 将http发送来的parameterized query参数,转换为ExecuteSQLParameterized的输入参数,即sql string和SQLRequestRow,转换可参考src/sdk/sql_sdk_test.cc等使用ExecuteSQLParameterized方法的代码
  4. ExecuteSQLParameterized返回的ResultSet结果,转换为json格式,转换请参考JsonWriter& operator&(JsonWriter& ar, ExecSPResp& s),即使用JsonWriter写入结果。你可自行设计更好的resultset json格式。使用JsonWriter写入结果后,后续处理将在已有框架下自动完成。

各个步骤都建议增加单元测试,请添加到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无法重用这段代码逻辑。

如果不能做到编解码模版化,请单独考虑:

  1. JsonReader解码是比较简单的,无需提前确定格式,当然,你也可以增加解析方法,做到JsonReader >> obj一步解析出QueryRequest。
  2. JsonWriter编码需要重点关注,编码逻辑通常很复杂,我们希望你能增加一个编码方法函数,而不是增大api方法的代码长度,参考JsonWriter& operator&(JsonWriter& ar, ExecSPResp& s)

    Github Issue

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