GAE数据存储区复合过滤器不起作用

时间:2019-05-13 10:39:16

标签: google-cloud-datastore

我正在构造一个复合过滤器,当我为此查询设置排序顺序时,它具有OR运算符和AND过滤运算符,但不能给出正确的结果。

我要执行的查询是{status ==已初始化OR(Status == Failed AND failedCount <= 5)}。它实际上执行查询没有任何错误,但结果不完全正确。它仅检索“状态==失败AND failedCount <= 5”,而不检索状态==已启动。我需要的顺序是“ createdAt”字段。

Filter initiatedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Initiated");

Filter failedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Failed");

Filter failedCountFilter = new FilterPredicate("failedCount", FilterOperator.LESS_THAN_OR_EQUAL, 5);

CompositeFilter failedCompositeFilter = CompositeFilterOperator.and(failedFilter, failedCountFilter);

CompositeFilter initaiedFailedFilter = CompositeFilterOperator.or(initiatedFilter, failedCompositeFilter);

Query query2 = new Query("JobInstance").setFilter(initaiedFailedFilter).addSort("failedCount", SortDirection.ASCENDING).addSort("createdAt", SortDirection.ASCENDING);

jobEntitesList = datastoreService.prepare(query2).asList(FetchOptions.Builder.withLimit(limit));

for (Entity jobEntity2 : jobEntitesList) {
    /* doing some task */
}

我观察到的是,如果删除addSort(),它的工作正常。但是对我来说,排序很重要。我希望结果应为“ createdAt”顺序。如果我删除failCount,则会抛出一些错误。

1 个答案:

答案 0 :(得分:1)

或者过滤器完全在客户端中实现(例如IN查询过滤器:https://cloud.google.com/appengine/docs/standard/java/datastore/queries#filters)。因此,您的排序正在客户端中进行。您有可能先从status == Failed AND FailedCount <= 5查询中获取所有结果,然后再从status == Initiated中获取任何结果。

根据您的评论,目前尚不清楚您要查找的排序顺序。如Restrictions on queries中所述,主要排序顺序必须位于failCount上,因为它具有不等式过滤器。