Sedna XML Databaseは XQueryの機能拡張をするために外部関数を作れるようになっている。今後このあたりも真似していきたいものだ。
ソースのコアな部分を乗せておく
コードはまだ少し危険な書き方をしているけど、まぁ動くし問題ないかな
unionなんて久しぶりに使った。
リトルエンディアンで並び順を迷った跡がうかがえて笑える。
食品成分表のデータで先頭の項目であるアマランサスを検索する際に、ひらがなで「あまらんさす」としているのだが、
今回作ったhirakata外部関数で、カタカナに変換され、検索文字列として使用される。
クエリは以下のような実装になっている。
declare function で今回作成したhirakata外部関数の呼び出し定義をしている。
declare function se:hirakata($a as xs:string*) as xs:string external;
<DATA TYPE='JSON' OUTPATH="//DATA/LIST" FORCEARRAY="//LIST/FOOD">
(: 複数のFOODを返す場合には、その上位にラッパーを作り、OUTPATHに指定をする :)
(: FORCEARRAYはのラッパーの下位のFOODが1件の場合でもJSON配列で返すために指定する :)
<LIST>
{
(:PARAMS:)
let $searchstr := se:hirakata($id)
for $food in doc('test2.db')//FOODS/FOOD
where contains($food/SEARCH_NAME,$searchstr) or contains($food/ADDITIONAL,$searchstr) or $food/@FOOD_ID=$searchstr
order by $food/@FOOD_ID
return
<FOOD>
{$food/JP_DISP_NAME}
{$food/ENERC_KCAL}
{$food/PROT-}
{$food/FAT-}
{$food/CHOCDF-}
{$food/VITA_RAE}
{$food/TOCPHA}
{$food/NE}
{$food/ADDITIONAL}
{$food/SEARCH_NAME}
</FOOD>
}
</LIST>
</DATA>
0 件のコメント:
コメントを投稿