APACHE CALCITE | выполнить операцию вставки для упругого поиска с помощью RelNode - PullRequest
0 голосов
/ 17 мая 2019

Моя очередь состоит из двух частей: 1. Я хочу выполнять операции DML (Вставка / Обновление / Удаление) на эластичном поиске, используя relitede calcite. Однако я не могу этого сделать из-за той или иной проблемы, связанной с различными вещами, включая отсутствие понимания кальцита и подготовку к relnode / tablemodify для того же самого.

  1. Я могу сделать запрос об упругом поиске, но кое-что, как я не могу поместить какое-либо условие фильтра в него, используя 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.

...