1

我是方解石的新手。它提供的功能看起来很棒!
在进行研究时,我试图弄清楚如何使用示例ElasticSearch adapter进行一些基本的 SQL 查询。
在 中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}
    

我的目标是总结所有“流行”值
所以当我构造这样的查询时:

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("");
}
4

1 回答 1

0

将 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);
    }

  }
于 2018-10-29T20:00:50.460 回答