количество выбранных кальцитов (intCol) из таблицы, когда тип строки _MAP (примерasticsearch) - PullRequest
0 голосов
/ 10 октября 2018

Я новичок в кальците.Функциональность, которую он обеспечивает, выглядит потрясающе!
Во время исследования я пытаюсь выяснить, как выполнять некоторые базовые запросы SQL на примере адаптера ElasticSearch .
В AbstractElasticsearchTable.getRowType онотображает строки в MAP.

Проблема:

  1. Запрос:

    select * from zips where \"city\" = 'BROOKLYN'
    

    Возвращает:

    city=BROOKLYN; longitude=-73.956985; latitude=40.646694; pop=111396; state=NY; id=11226
    
  2. Запрос:

    select \"pop\" from zips where \"city\" = 'BROOKLYN'
    

    возвращает:

    pop={pop=111396}
    

Моя цель состоит в суммировании всех значений 'pop' .
Поэтому, когда я создаю запрос следующим образом:

select sum(\"pop\") from zips where \"city\" = 'BROOKLYN'

Ошибка:

   Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.Integer
   at Baz$2.apply(Unknown Source)
   at Baz$2.apply(Unknown Source)
   at org.apache.calcite.linq4j.EnumerableDefaults.aggregate(EnumerableDefaults.java:117)
   at org.apache.calcite.linq4j.DefaultEnumerable.aggregate(DefaultEnumerable.java:107)
   at Baz.bind(Unknown Source)
   at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:356)

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

Для выполнения этого запроса я добавил тест в ElasticSearchAdapterTest.java.

@Test
public void select() {
  CalciteAssert.that().with(newConnectionFactory())
    .query("select sum(\"pop\") from zips where \"city\" = 'BROOKLYN'").returns("");
}

1 Ответ

0 голосов
/ 29 октября 2018

Реализация RowType как StructType решила мою проблему.Вот оно:

  public RelDataType getRowType(RelDataTypeFactory typeFactory) {
    try {
      Map<String, String> mapping = getMapping();
      List<RelDataType> types = new ArrayList<RelDataType>();
      List<String> names = new ArrayList<>();
      for(Map.Entry<String, String> e : mapping.entrySet()) {
        names.add(e.getKey());
        types.add(translateEsType(e.getValue(), typeFactory));
      }
      return typeFactory.createStructType(types, names);
    } catch(IOException e) {
      throw new RuntimeException(e.getMessage(), e);
    }

  }
...