我是新的Apache Calcite,能够通过使用关系代数从DB获取数据,但无法进行插入,更新,删除,删除操作。如果可以共享示例代码将更有帮助。
任何人都可以帮助我。
先谢谢。
答案 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 ' }]])