

お世話になっております。

環境  
GAE 1.9.25  
objectify: 5.1.9

現在GAEを利用しWebアプリケーションを作成しているのですが、以下の状態の場合にCursorが取得できず、nullになってしまいます。  
keywords内にtagListの要素が1つでも入っていれば取得したいと考えています。

[code]

    Query<Hoge> query = ofy().load().type(Hoge.class).limit(limit);
    query = query.filter("tagList in", keywords);
    QueryResultIterator<Hoge> iterator = query.iterator();
    List<Hoge> result = new ArrayList<Hoge>(query.count());
    while (iterator.hasNext()) {
            Hoge hoge = iterator.next();
            result.add(hoge);
    }
    log.info("cursor = " + iterator.getCursor());
    
[/code]

以上のコードを実行するとgetCursorでCursorがnullになってしまいます。  
keywords.length == 1の場合は正常に稼働するのですが、1つ以上の要素になるとこのような挙動になってしまいます。

なぜCursorがnullになる現象になるのでしょうか？  
宜しくお願い致します。


CC BY-SA 3.0
2016-06-14T05:31:02.427
26733
2016-12-03T02:56:01.310
297
question
java google-app-engine
GAEにおけるObjectifyを使用したクエリについて


だいぶ前の質問なので解決済かもしれませんが・・

`hoge IN (a, b, c)` みたいな条件は基本的にDatastoreのインデックスの仕組み上検索することができません。

GAE/JavaはIN filterをサポートしていますが、これは`hoge = a` , `hoge = b`, `hoge = c`
の3つのクエリを実行してSDKライブラリ内部で結果をマージしているものと思われます。

ですので、INを使用した場合はカーソルが返せないのだと思います。  
INの条件が1つの場合は実質 `hoge = a` の1クエリになるのでカーソルが返ってくるのでしょう。

参考:  
<https://cloud.google.com/appengine/docs/java/datastore/query-cursors>

> Because the NOT_EQUAL and IN operators are implemented with multiple
> queries, queries that use them do not support cursors, nor do composite
> queries constructed with the CompositeFilterOperator.or method.


CC BY-SA 3.0
2016-12-03T02:08:37.800
30853
2016-12-03T02:56:01.310
2016-12-03T02:56:01.310
7282
7282
26733
answer