Моя очередь состоит из двух частей:
1. Я хочу выполнять операции DML (Вставка / Обновление / Удаление) на эластичном поиске, используя relitede calcite. Однако я не могу этого сделать из-за той или иной проблемы, связанной с различными вещами, включая отсутствие понимания кальцита и подготовку к relnode / tablemodify для того же самого.
- Я могу сделать запрос об упругом поиске, но кое-что, как я не могу поместить какое-либо условие фильтра в него, используя relnode.
SchemaPlus postschema = con.getRootSchema().getSubSchema("twitter2");
FrameworkConfig postConfig = Frameworks.newConfigBuilder()
.defaultSchema(postschema)
.build();
RelBuilder postBuilder = RelBuilder.create(postConfig);
String fields[] = {"_id", "name"};
RelNode relSelect = postBuilder.scan("user").project(postBuilder.field("_MAP")).build();
RelRunner runnerSelect = (RelRunner) con.unwrap(Class.forName("org.apache.calcite.tools.RelRunner"));
ResultSet insRes = runnerSelect.prepare(relSelect).executeQuery();
Я попытался создать ElasticsearchtableModify и соответствующие правила, похожие на JdbcTableModify, но мне хочется потеряться и обойти вокруг куста.
RelNode relInsert = LogicalTableModify.create(postBuilder.scan("user").build().getTable(), Prepare.CatalogReader.THREAD_LOCAL.get(), tryInsert, TableModify.Operation.INSERT, null, null, true);
RelRunner runnerInsert = (RelRunner) con.unwrap(Class.forName("org.apache.calcite.tools.RelRunner"));
for (RelOptRule rule : ElasticsearchRules.RULES) {
relInsert.getCluster().getPlanner().addRule(rule);
}
runnerInsert.prepare(relInsert).executeQuery();
открытый статический класс ElasticsearchTableModificationRule extends ElasticsearchRules.ElasticsearchConverterRule {
private static final ElasticsearchTableModificationRule INSTANCE = new ElasticsearchTableModificationRule ();
/** Creates a JdbcTableModificationRule. */
private ElasticsearchTableModificationRule() {
super(TableModify.class, Convention.NONE, ElasticsearchRel.CONVENTION, "ElasticSearchModificationRule");
}
@Override public RelNode convert(RelNode rel) {
final TableModify modify =
(TableModify) rel;
final ModifiableTable modifiableTable =
modify.getTable().unwrap(ModifiableTable.class);
if (modifiableTable == null) {
return null;
}
final RelTraitSet traitSet =
modify.getTraitSet().replace(out);
return new ElasticsearchRules.ElasticsearchTableModify(
modify.getCluster(), traitSet,
modify.getTable(),
modify.getCatalogReader(),
convert(modify.getInput(), traitSet),
modify.getOperation(),
modify.getUpdateColumnList(),
modify.getSourceExpressionList(),
modify.isFlattened());
}
}
открытый статический класс ElasticsearchTableModify расширяет TableModify, реализует ElasticsearchRel {
частное конечное выражение Expression;
public ElasticsearchTableModify(RelOptCluster cluster,
RelTraitSet traitSet,
RelOptTable table,
Prepare.CatalogReader catalogReader,
RelNode input,
Operation operation,
List<String> updateColumnList,
List<RexNode> sourceExpressionList,
boolean flattened) {
super(cluster, traitSet, table, catalogReader, input, operation,
updateColumnList, sourceExpressionList, flattened);
assert input.getConvention() instanceof ElasticsearchConvention;
assert getConvention() instanceof ElasticsearchConvention;
final ModifiableTable modifiableTable =
table.unwrap(ModifiableTable.class);
if (modifiableTable == null) {
throw new AssertionError(); // TODO: user error in validator
}
this.expression = table.getExpression(Queryable.class);
if (expression == null) {
throw new AssertionError(); // TODO: user error in validator
}
}
@Override
публичный void агрегат (агрегатор-исполнитель) {
}
@Override
public RelOptCost computeSelfCost(RelOptPlanner planner,
RelMetadataQuery mq) {
return super.computeSelfCost(planner, mq).multiplyBy(.001);
}
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
return new ElasticsearchRules.ElasticsearchTableModify(
getCluster(), traitSet, getTable(), getCatalogReader(),
sole(inputs), getOperation(), getUpdateColumnList(),
getSourceExpressionList(), isFlattened());
}
/*public ElasticsearchImplementor.Result implement(ElasticsearchImplementor implementor) {
return implementor.implement(this);
}*/
}
Если поддержка уже существует для выполнения операций DML при упругом поиске, может кто-нибудь, пожалуйста, предоставит мне тот же пример кода, чтобы выполнить его с помощью RelNode / TableModify (No Sql), помогите мне понять это.
Также хотелось бы, чтобы какой-нибудь пример кода поместил условие фильтра в relnode и получил результаты отasticsearch.