I want to build Calcite RelNode with RelBuilder, and serialize it, send to another system.
But I found, if I build a filter node, the condition will be simplified as a SEARCH RexCall, and the value is Sarg, as shown in the following picture.
If I use RelJsonWriter to serialize the RelNode, it will have an AssertError. I found out it was because of Sarg.
My code is as follows, my Calcite version is calcite-core-1.32.0.
Am I using it the wrong way?
@Test
public void buildFilterTest() {
try {
SchemaPlus rootSchema = Frameworks.createRootSchema(true);
rootSchema.add("USERS", new AbstractTable() { // note: add a table
@Override
public RelDataType getRowType(final RelDataTypeFactory typeFactory) {
RelDataTypeFactory.Builder builder = typeFactory.builder();
builder.add("ID", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.INTEGER));
builder.add("NAME", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.CHAR));
builder.add("AGE", new BasicSqlType(new RelDataTypeSystemImpl() {}, SqlTypeName.INTEGER));
return builder.build();
}
});
final FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(SqlParser.Config.DEFAULT)
.defaultSchema(rootSchema).build();
RelBuilder builder = RelBuilder.create(config);
builder.scan("USERS");
builder.project(builder.field("ID"));
RexNode greater = builder.call(SqlStdOperatorTable.GREATER_THAN, builder.field("ID"), builder.literal(0));
RexNode lesser = builder.call(SqlStdOperatorTable.LESS_THAN, builder.field("ID"), builder.literal(100));
builder.filter(builder.call(SqlStdOperatorTable.AND, greater, lesser));
RelNode relNode = builder.build();
RelJsonWriter writer = new RelJsonWriter();
relNode.explain(writer);
String res = writer.asString();
log.info("success");
} catch (AssertionError e) {
e.printStackTrace();
}
}