4. Cursor
Cursor(カーソル)を使うと、Queryにおける検索ポジションを覚えておくことができます。次回の検索時には、そのポジションの次からエンティティを検索できます。例えば、ページ単位で検索内容を表示して、「次のページ」ボタンのクリックによって次の検索結果を表示する場合などに便利です。
検索を開始するポジションは、FetchOptionsのoffsetによって指定することもできますが、この場合の検索処理は、内部的には、先頭からエンティティを読み取ってoffsetのポジションまで読み飛ばしているに過ぎません。したがって、offsetの値が大きくなるに従ってパフォーマンスが低下します。
【リスト12】: カーソル使用での検索(ビーンズ・メソッド)
03 | public String revOrdCursor(String cursor) { |
06 | FetchOptions opt = null ; |
07 | Query query = new Query( "ordTran" ).addSort( "shopno" ); |
08 | opt = FetchOptions.Builder.withOffset( 0 ).limit( 3 ).startCursor(Cursor.fromWebSafeString(cursor)); |
09 | QueryResultList<Entity> ord = ds.prepare(query).asQueryResultList(opt); |
10 | for (Entity o : ord) { |
11 | String shopno = (String) o.getProperty( "shopno" ); |
12 | String kind = (String) o.getProperty( "kind" ); |
13 | String itemName = (String) o.getProperty( "itemName" ); |
14 | String price = o.getProperty( "price" ).toString(); |
15 | String orddate = o.getProperty( "orddate" ).toString(); |
16 | out += "{\"shopno\": \"" + shopno + "\", \"kind\": \"" + kind + "\", \"itemName\": \"" + itemName + "\", \"price\": \"" + price + "\", \"orddate\": \"" + orddate + "\"}," ; |
19 | out = out.substring( 0 , out.length()- 1 )+ "]" ; |
20 | cursor_s = ord.getCursor().toWebSafeString(); |
21 | return cursor_s+ "<i>" +out; |
リスト12における(1)から(4)が、カーソル処理に関係した処理です。
(2)では、FetchOptions.BuilderのstartCursorメソッドによって、カーソルの開始位置を指定します。なお、以前はcursorメソッドを使っていましたが、現在は非推奨(deprecate)になっているので、startCursorを使います。
CursorのfromWebSafeStringメソッドは、引数に指定した、エンコードされているcursorを、文字列にデコードします。引数で指定されるcursorは、(1)のrevOrdCursorメソッドにおいてクライアントから引数で渡されるものです。初回の検索ではブランクになっており、エンティティの先頭から検索されます。クライアントからの2回目以降のリクエストでは、cursor値が設定されているため、cursor機能が有効になります。
なお、データ数が少ないことから、limit(3)の指定によって3件ずつエンティティを表示しています。実際のアプリケーションでは、もっと大きな値指定になるはずです。
(3)では、QueryResultList>のインスタンスordにgetCursor()メソッドを適用し、listの最後に、次のエンティティ値を指すカーソルを返します。CursorのtoWebSafeStringメソッドは、cursorをエンコードします。
最後に(4)で、取得したcursorを、検索値と一緒にクライアントに送信します。
【リスト13】: カーソル使用での検索(Webクライアント)
カーソル参照
<input type="button" id="revstart" value="カーソル参照"/>