Apache Calcite | Запрос данных из MongoDB с помощью реляционной алгебры

Я могу установить соединение с MongoDB и получить узел

(LogicalTableScan(table=[[enlivenDev, collection1]]))

Но когда я выполняю узел, я получаю исключение с нулевым указателем.

Полный код:

private void executeMongoDB(){
        final FrameworkConfig config = mongoConfig().build();
        final RelBuilder builder = RelBuilder.create(config);
        final RelNode node =  builder.scan("collection1").build();
        System.out.println(RelOptUtil.toString(node));  
        PreparedStatement ps = RelRunners.run(node);
        ResultSet resultSet = ps.executeQuery();
}
    public static Frameworks.ConfigBuilder mongoConfig() {
            final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
            org.apache.calcite.tools.Frameworks.ConfigBuilder configBuilder =Frameworks.newConfigBuilder()
                    .parserConfig(SqlParser.Config.DEFAULT)
                    .defaultSchema(
                        MongoDBConnection.addMongoSchema(rootSchema, CalciteAssert.SchemaSpec.MONGO_DB))
                    .traitDefs((List<RelTraitDef>) null)
                    .programs(Programs.heuristicJoinOrder(Programs.RULE_SET, true, 2));
            return configBuilder;
        }
public static SchemaPlus addMongoSchema(SchemaPlus rootSchema, SchemaSpec schema) {
        switch (schema) {
        case MONGO_DB:
            return rootSchema.add("enlivenDev",
                    MongoSchemaFactory.create(rootSchema, "192.168.1.01", "enlivenDev", 27017, "mgp", "mg1"));
        default:
            throw new AssertionError("unknown schema " + schema);
        }
    }

Получение следующего исключения из приведенного выше кода, есть схема, получающая нулевые значения, при выполнении relnode коллекции Mongo DB

SEVERE: exception while executing query: null
java.sql.SQLException: exception while executing query: null
    at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
    at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
    at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:540)
    at org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:133)
    at org.ramyam.eis.core.ApachecalcitePOC.processMongoDB(ApachecalcitePOC.java:106)
    at org.ramyam.eis.core.ApachecalcitePOC.main(ApachecalcitePOC.java:42)
Caused by: java.lang.NullPointerException
    at org.apache.calcite.schema.Schemas.queryable(Schemas.java:232)
    at Baz.bind(Unknown Source)
    at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:335)
    at org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:294)
    at org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:559)
    at org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:550)
    at org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:204)
    at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:67)
    at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:44)
    at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:536)

person Kamatchi Gunasekaran    schedule 28.07.2017    source источник
comment
Можете показать полное исключение?   -  person Michael Mior    schedule 30.07.2017
comment
добавлено полное исключение   -  person Kamatchi Gunasekaran    schedule 31.07.2017
comment
Кто-нибудь поможет мне в этом .. Спасибо заранее   -  person Kamatchi Gunasekaran    schedule 02.08.2017


Ответы (2)


Это должно помочь:

public void useCalcite(String modelPath) {
    Connection connection = DriverManager.getConnection("jdbc:calcite:model=" + modelPath);
    CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
    String query = "select count(*) from zips";
    Statement statement = calciteConnection.createStatement();
    ResultSet result = statement.executeQuery(query);
    ...
}

Вам нужна модель вашей коллекции. Примерно так: пример модели Файл модели содержит все данные, необходимые для подключения к mongodb.

person 1r3k    schedule 21.11.2017

Приведенный выше ответ, опубликованный @ 1r3k, должен работать, для меня он работал с небольшой настройкой на стороне Apache Calcite по другой причине.

Хотя это другая история и не имеет прямого отношения к этой проблеме, но, тем не менее, позвольте мне уточнить, может быть полезно для кого-то с аналогичной проблемой.

Мой вариант использования - запустить стандартный SQL в Cosmos DB в Azure, который предоставляет драйверы MongoDB для подключения.

Проблема с последней версией Apache Calcite заключается в том, что она использует более старые Java-драйверы MongoDB и уже довольно давно не обновлялась. Также серьезным недостатком является то, что он не принимает никаких параметров, которые могут быть переданы и использованы Apache Calcite при внутреннем создании MongoClient, см. Приведенный ниже фрагмент кода из Apache Calcite https://github.com/apache/calcite/blob/master/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSchema.java

MongoSchema(String host, String database,
  MongoCredential credential, MongoClientOptions options) {
super();
try {
  final MongoClient mongo = credential == null
      ? new MongoClient(new ServerAddress(host), options)
      : new MongoClient(new ServerAddress(host), credential, options);
  this.mongoDb = mongo.getDatabase(database);
} catch (Exception e) {
  throw new RuntimeException(e);
}}

Это необходимо обновить, и уже есть PR для того же, но не уверен, когда это будет объединено, подробности здесь

https://github.com/apache/calcite/pull/2345

Используя вышеуказанные изменения и незначительное изменение в файле модели, удалось установить соединение без проблем. Изменение в файле модели состоит в том, чтобы просто использовать URL-адрес подключения вместо передачи хоста и других деталей. В строке подключения будут закодированы все необходимые параметры подключения, включая включение SSL.

person Shadman R    schedule 17.06.2021