YQLでフィードを加工する
Yahoo! Pipesで、ブログのフィードを複数フェッチしてマージして日時でソートして出力するというパイプを作っていたので、同様のことがYahoo! Query Language(YQL)でできるかどうか試してみる。
フィードをフェッチするのはdataテーブルのfeed(種類によってatom、rss、xmlでも可)を使って、複数のマージはwhere節をorでつなげればよい。そして最後のフィルタでpubDateによってソートするようにするとこのようになる。
select * from feed where url='http://d.hatena.ne.jp/tkawa/rss2' or url='http://dailylife.g.hatena.ne.jp/tkawa/rss2' | sort(field='pubDate')
新しい項目から順に並べたいので逆順のソートが必要になる。でも細かいリファレンスがないのでPOST-result Operationsのsortの逆順(descending)をどう書けばいいのかわからない。Arg sortingのところにdescendingって書いてあるのに…。しょうがないので後ろにreverseをくっつけてこうした。
select * from feed where url='http://d.hatena.ne.jp/tkawa/rss2' or url='http://dailylife.g.hatena.ne.jp/tkawa/rss2' | sort(field='pubDate') | reverse()
これで一応希望通りのものが出来上がる。
ほかにもいろいろAtomフィードを食わせたりしていて気が付いたのだが、YQLは扱う対象が汎用的なXML(or JSON)でどんなデータでもOKなので、例えば先ほどのYQLに1つAtomフィードを増やそうとすると、AtomにはpubDateという要素はないのでソートできなくなってしまう。(全部AtomならissuedあたりでソートすればOK)
それに対してPipesは出力がフィード(RSS)というのが明確で、RSSを食わせてもAtomを食わせても内部で正規化してRSS出力に適したデータに変換している。さらにそのときにy:publishedのような便利な要素をくっつけてくれるので、ソートするときはそれを利用すればよい。まさにPlaggerをリッチなUIにしたという感覚。
どっちがいいというのは一長一短というか使い分けの問題で、Pipesはフィードとして利用するためにあらかじめ設定しておいて使うもの、YQLはプログラム中でXMLやJSONが欲しいときに動的にクエリを組み立てて希望のデータを手に入れるもの、という感じ。後者はJSONPが使えるのでとくにJavaScriptで使うのが強力。