我是新的 Apache Calcite,能够使用关系代数从数据库中获取数据,但无法进行插入、更新、删除、删除操作。如果可以分享示例代码将更有帮助。
问问题
922 次
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 回答