0

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

4

1 回答 1

4

据我所知,RelBuilder不能RelNode为INSERT、UPDATE、DELETE、DROP 操作构建一个。

对于 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 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                     ' }]])
于 2017-07-28T03:25:05.813 回答