Apache方解_使用关系代数插入,更新,删除,删除示例代码

时间:2017-07-27 11:59:20

标签: apache apache-calcite

我是新的Apache Calcite,能够通过使用关系代数从DB获取数据,但无法进行插入,更新,删除,删除操作。如果可以共享示例代码将更有帮助。

任何人都可以帮助我。

先谢谢。

1 个答案:

答案 0 :(得分:1)

据我所知,RelBuilder无法为INSERT,UPDATE,DELETE,DROP操作构建RelNode。

对于DML(INSERT,UPDATE,DELETE,MERGE),他们的关系代数是TableModify,因此您可以调用LogicalTableModify.create来构建一个TableModify,然后使用RelBuilder构建一个RelNode作为其输入。如下:

RelNode node = builder.scan("envliven").project("Name");
TableModify modifyNode = LogicalTableModify.create((table,
  schema, node,
  UPDATE, updateColumnList,
  sourceExpressionList, flattened);

对于DDL(DROP,CREATE,ALTER),没有相应的关系代数,您可以使用SqlNode直接执行,如CalcitePrepareImpl.executeDdl

例如:

update nation set n_nationkey = 1 where n_nationkey = 2;

RelNode如下:

LogicalTableModify(table=[[test, nation]], operation=[UPDATE], updateColumnList=[[n_nationkey]], sourceExpressionList=[[1]], flattened=[false]) 
  LogicalProject(n_nationkey=[$0], n_name=[$1], n_regionkey=[$2], n_comment=[$3], EXPR$0=[1]) 
   LogicalFilter(condition=[=($0,2)])
     LogicalTableScan(table=[[test, nation]])

因此,对于UPDATE,updateColumnList包含您更新的列,sourceExpressionList包含新值。

对于INSERT:

insert into nation(n_nationkey, n_name) values(1, 'test');

RelNode如下:

LogicalTableModify(table=[[test, nation]], operation=[INSERT], flattened=[false])
  LogicalProject(n_nationkey=[$0], n_name=[$1], n_regionkey=[null], n_comment=[null])
    LogicalValues(tuples=[[{ 1, _UTF-16'test                     ' }]])