如何将Google Datastore CompositeFilter与Dataflow一起使用?

时间:2018-06-15 16:00:20

标签: google-cloud-datastore google-cloud-dataflow apache-beam

当从数据存储中读取数据作为管道的输入时,我能够创建一个简单的"查询,我在一个属性上设置过滤器,如下所示:

Pipeline p = ...
Filter filter = Filter.newBuilder()
        .setPropertyFilter(PropertyFilter.newBuilder()
                .setProperty(PropertyReference.newBuilder()
                        .setName("propertyA"))
                .setOp(PropertyFilter.Operator.EQUAL)
                .setValue(Value.newBuilder().setStringValue("valueA").build())
                .build())
        .build();

Query query = Query.newBuilder()
    .addKind(KindExpression.newBuilder().setName("myKind").build())
                .setFilter(filter)
                .build();
p.apply("read", DatastoreIO.v1().read().withProjectId("myProjectId")
                .withNamespace("myNamespace").withQuery(query)).apply(.....

当我尝试通过连接" setFilter()" -calls在查询上应用多个过滤器时,只有最后一组过滤器应用于查询。

经过一些研究,我发现了一个CompositeFilter,它应该能够组合多个过滤器。我可以构建一个复合过滤器,但是当我想在查询中将其设置为过滤器时,IDE会抱怨这些类型不匹配,并且似乎不是应用过滤器的另一种方法。 / p>

我设法通过使用GQL使用带有多个过滤器的查询,并且可以在日志中看到它被转换为CompositeFilter。我不是在抱怨因为GQL的使用比手工构建查询/过滤器要好得多,但是想问一下如何在数据库中使用数据库WOULD的复合过滤器。读取(。 ......)或者如果不可能的话。

我正在使用com.google.cloud.dataflow / google-cloud-dataflow-java-sdk-all / 2.2.0

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

根据文档,您可以。您可以使用CompositeFilter newBuilder方法,并创建一个如下所示的过滤器:

Filter composeFilter = Filter.newBuilder() .setCompositeFilter(CompositeFilter.newBuilder().addFilters(filter1).addFilters(filter2).build()).build();

Filter1和Filter2类似于您创建的过滤器。我的IDE允许我执行此操作(我使用的是IntelliJ IDEA,最新版本)。