Low-Level APIを使ってデータ・ストアを検索する

2011年2月22日(火)
清野 克行

4. Cursor

Cursor(カーソル)を使うと、Queryにおける検索ポジションを覚えておくことができます。次回の検索時には、そのポジションの次からエンティティを検索できます。例えば、ページ単位で検索内容を表示して、「次のページ」ボタンのクリックによって次の検索結果を表示する場合などに便利です。

検索を開始するポジションは、FetchOptionsのoffsetによって指定することもできますが、この場合の検索処理は、内部的には、先頭からエンティティを読み取ってoffsetのポジションまで読み飛ばしているに過ぎません。したがって、offsetの値が大きくなるに従ってパフォーマンスが低下します。

【リスト12】: カーソル使用での検索(ビーンズ・メソッド)

01<!--//--><![CDATA[// ><!--
02 
03public String revOrdCursor(String cursor) { //(1)
04    String out = "[";
05    String cursor_s = "";
06    FetchOptions opt = null;
07    Query query = new Query("ordTran").addSort("shopno");
08    opt = FetchOptions.Builder.withOffset(0).limit(3).startCursor(Cursor.fromWebSafeString(cursor)); //(2)
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 + "\"},";
17 
18    }
19    out = out.substring(0, out.length()-1)+"]";
20    cursor_s = ord.getCursor().toWebSafeString(); //(3)
21    return cursor_s+"<i>"+out; //(4)
22}
23 
24//--><!

リスト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クライアント)

1<!--//--><![CDATA[// ><!--
2 
3<!DOCTYPE html>
4<html>
5<head>
6<meta charset=utf-8>   
7<title>カーソル検索
8<script type="text/javascript" src="/https/thinkit.co.jp/dwr/interface/colBean.js">
9//--><!

カーソル参照  <input type="button" id="revstart" value="カーソル参照"/>

    有限会社サイバースペース
    慶應義塾大学工学部電気科卒。日本IBM、日本HPなどにおいて、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、3階層C/Sアーキテクチャによる社内業務システム開発などに携わる。現在は、Ajax/Web 2.0関連のセミナー講師/コンサルティング、書籍執筆などを行っている。情報処理学会会員。http://www.at21.net/

    連載バックナンバー

    Think ITメルマガ会員登録受付中

    Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

    Think ITメルマガ会員のサービス内容を見る

    他にもこの記事が読まれています