前回まででAtomPubの機能をすべて実装しました。今回はAtomPubの拡張仕様であるGoogle Data APIs(GData)を取り上げ,検索クエリとJSONをサポートします。GDataは,昨年秋にGoogleが発表したOpenSocialのベースになっていることで話題になりました。
2008年2月27日に発表された OpenSocial RESTful APIs には,「新ドラフトが採用されれば,過去に提案した GData ベースの API を変更する」とあります。その場合,OpenSocial に GData 拡張が含まれない可能性がありますので注意してください。いずれにしろ,今回の記事は AtomPub に検索機能を追加する際に役立つと思いますので,参考にしてください。
全文検索にはHyper Estraierというオープンソースの検索エンジンを用います。Hyper Estraierはフレーズ検索や属性検索をサポートしているため,GDataサーバの実装にうってつけです。
サンプルコードはこちらからダウンロードできます。
GDataとは
GDataはGoogle CalendarやBloggerなどのサービスを利用するためのAPIです。AtomPubの拡張仕様として定義されています。GDataは,プロトコルに関する仕様とXMLフォーマットに関する仕様に分けられます。プロトコルでは主に検索クエリが定義されています。XMLフォーマットについては,連絡先やイベントを表現するための拡張要素が定められています。この連載はAtomPubというプロトコルを対象としているので,検索クエリを実装する方法を説明します。
なお,実際のGDataサーバはGData AuthSubなどの独自認証方式を実装しています。また,サービスごとに拡張仕様が追加されています。これらをすべて実装することはこの記事の範囲を超えます。本物のGDataサーバのコピーを作れるわけではないことをご了承ください。もちろん,OpenSocialコンテナを実装するときや,みなさんのWebサービスに検索クエリを追加するときには,この記事が役立つと思います。
こちらにGData仕様書の和訳があります。検索クエリ
GDataでは以下のパラメータが定義されています。
GData 検索パラメータ(クエリ変数)
| パラメータ | 説明 |
| q | 全文検索文字列,フレーズ検索・OR検索・NOT検索をサポート |
| author | エントリの著者 |
| alt | 代替表現(json,json-in-script) |
| callback | コールバック関数名(alt=json-in-scriptのときのみ有効) |
| updated-min,updated-max | エントリ更新日時の範囲 |
| published-min,published-max | エントリ発行日時の範囲 |
| start-index | 取得した結果のうち,ひとつめの結果の通し番号(1から数える) |
| max-results | 取得する結果の最大数 |
全文検索(q)では,フレーズ検索やOR検索,NOT検索をサポートします。フレーズ検索は,複数の連続するキーワードを検索するときに用います。q="Atom Publishing Protocol"のようにキーワードを引用符で囲みます。OR検索は,q=Atom OR RSSのように指定し,AtomあるいはRSSのいずれかが存在する文書を検索します。NOT検索はq=dog -catのように指定し,dogは含むがcatを含まない文書を検索することができます。
著者検索(author)では,エントリのauthorタグにあるname要素とemail要素を検索します。
代替表現(alt)を指定すると,Atom以外のフォーマットでレスポンスを返します。今回はalt=jsonとalt=json-in-script(JSONP)を実装します。alt=json-in-scriptのときは,コールバック関数名callbackを必ず指定しなければなりません。
updated-minなどのパラメータを使って,updated要素とpublished要素の範囲を指定することができます。Atomと同様に,RFC3339記載のフォーマットに従います。たとえば,updated-min=2008-01-01T00:00:00+09:00のようにします。
クエリの例を示します。日本時間で2008年1月1日以降のatompubを含むエントリを検索する場合は,次のようなクエリになります。
http://localhost:3000/entrycollection?updated-min=2008-01-01T00:00:00+09:00&q=atompub
カテゴリを検索するときは,クエリ変数ではなくパスを使います。
GData検索パラメータ(パス)
| パラメータ | 説明 |
| /-/category | カテゴリフィルタ |
メンバリソースのURIと区別するために,/-/で区切ってからカテゴリを指定します。OR検索は"|"で区切り,AND検索は"/"で区切ります。
たとえば,perlあるいはrubyというカテゴリを指定するときは次のようにします。
http://localhost:3000/entrycollection/-/perl|ruby
JSONレスポンス
代替表現パラメータ(alt)が指定されたときは,XMLをJSONに変換します。GDataでは,フィードをJSONに変換する方法を次のように定めています。
属性は文字列プロパティに変換
XML
<link href="http://example.com/collection" rel="self"/>
JSON
{ "link": { "href": "http://example.com/collection",
"rel" : "self" } }
子要素はオブジェクトプロパティに変換(テキスト要素のキーは"$t")
XML
<author>
<name>Foo Bar</name>
<email>foo@example.com</email>
</author>
JSON
{ "author": { "name" : { "$t": "Foo Bar" },
"email": { "$t": "foo@example.com" } } }
複数存在する要素は配列プロパティに変換
XML
<link href="http://example.com/"/>
<link href="http://example.com/collection" rel="self"/>
JSON
{ "link": [ { "href": "http://example.com/" },
{ "href": "http://example.com/collection", "rel": "self" } ] }
GDataやAtomPubの検索クエリに関する動向
google-feedserverというGDataサーバのオープンソースプロジェクトがあります。JavaのAtomPub実装であるAbderaをベースにしています。執筆時点では開発が始まったばかりであり,検索クエリは実装されていません。
AtomPubのメーリングリストでは,The Feed Item Query Languageという別の検索クエリが議論されています。まだ議論が始まったばかりですが,XPathのように記述性の高いクエリを目指して仕様策定が行われそうです。

