「Jaql」関数を追加する

CodeZine / 2012年3月26日 14時0分

図2.JavaScriptオブジェクトとJsonオブジェクトの関係

 Jaql(a query language desired for JSON:JSON用に位置づけられたクエリ言語)は、JSON型式のデータを処理するためのクエリ言語です。以前の記事では、Jaqlの概要と使い方の基礎を紹介しました。今回は、Jaqlで使われる関数を追加し、記述の簡素化や再利用といったより高度な処理を実現する方法を説明します。

■Jaql関数を追加する

 Jaqlは、Hadoopで実行されるMapReduceジョブを短い構文で記述できるスクリプト言語です。こちらに紹介記事『「Jaql」を使ってMapReduceをより簡単に』(CodeZine)があります。

 本記事では、Jaqlで使われる関数を追加し、Jaqlの記述をより簡素化したり、再利用したり、より高度な処理をJava(TM)で実現したりする方法について説明します。

■Jaql既存関数の一覧

 関数の追加を検討するにあたり、既存の機能(演算子、ビルトイン関数)などを調査しておく必要があります。すでにあるものを追加する意味はありません。

Jaql言語コアJaqlビルトイン関数■Jaql関数

 Jaqlで関数を記述して再利用できます。記述形式は以下のようになります。

関数名 = fn(引数リスト)(ロジック)
 次の例では、引数aとbを受け取り、値を足し算して返します。

myNewFn = fn(a, b) ( a + b ); myNewFn(1,2);
 実行すると、以下のようになります。

3
■Jaql関数のモジュール化

 Jaql関数は、Jaqlスクリプトの前部に書いておけば動作しますが、一度書いたものを何度も書き直さずに再利用したいものです。そこで、分離したスクリプトファイルに書きこんで再利用するのが「モジュール」です。モジュールには、変数定義が書けるため、リテラルデータや、関数を書いておくことができます。

 モジュールは、拡張子「.jaql」で終わるファイルとして、保存し、実行時に読み込みます。たとえば、先ほどの「myNewFn」の定義をmodule1.jaqlに書いておきます。

 モジュールが置いてある場所は、jaqlshellを起動するときの「jp」パラメーターで指定する必要があります。たとえば、/home/idcuser/mymodulesにモジュールを置き、/home/idcuserでjaqlshellを起動するとしたら、以下のように指定します。

jaqlshell -jp mymodules
 例えば、起動後のスクリプトの先頭で、以下のようにしてインポートします。

import module1;
 同じ例で、/home/idcuser/mymodules/lib1/module2.jaqlのようにサブフォルダーに分類することもできます。このとき、サブフォルダーにあるファイルは、以下のように、コロン二つ「::」で接続してインポートします。

import lib1::module2;
 インポートが済んだら、モジュール名::関数名で呼び出しが可能となります。

module1::myNewFn(1,2);
 モジュール名を書くのが面倒であれば、モジュール名にカッコ( )をつけて関数名を指定してインポートすると、モジュール名を省略して利用できます。

import module1(myNewFn); myNewFn(1,2);
 (*)と記述することで、同じファイルに定義されているすべての関数を読み込むこともできます。

import module1(*); myNewFn(1,2);


■関連記事
Dojo道場 ~ 第10回「Dojo 最新動向 - Dojo 1.6」
「Jaql」関数を追加する
Windows AzureでNode.jsを実行しよう
ngCoreによるゲーム開発入門 ~ ステップバイステップで理解する開発の流れ
「忍者ロワイヤル」を真似してみよう! ~サンプルで学ぶ、ngCoreを使ったゲーム開発

■記事全文へ

CodeZine

トピックスRSS

ランキング