2021年8月4日水曜日

Sedna XML Database用XQueryの外部関数(ひらがな→カタカナ変換)

 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 件のコメント: