Image
Top
Navigation

OrientDB Functions

OrientDB Function

OrientDB には、Database Functions と呼ばれる、Javasript で記述可能なサーバーサイトスクリプトが用意されています。
所謂 RDBMS のストアドプロシージャみたいなものですね。

現時点で、SQLとJavascriptで書くことが可能です。
また、Ruby,Scala,Javaも対応予定です。
Javaに関しては、javascript内の処理の一部をJavaで書くということは現時点で可能です。

ファンクションは、引数を渡して結果を取得することができまた、ファンクション間での呼び出しや、所謂再帰呼び出しといったものにも対応しています。

実行は、SQLからの呼び出しははもちろん、JavascriptやJava APIやRESTそしてOrientDB studioから実行することが可能です。

サンプルコード Hello! OrientDB

まず、サンプルとして与えられた引数に対して Hello! OrientDB, という文字を連結した文言を返す Function を作成します。
コードを以下に記します。

function sayHelloOrientDB(name){
   return "Hello! OrientDB," +name+"."
}

それでは実際にOrientDB Studioで書いてみましょう。
StudioのメニューからFunctionsを選択するとFunctionの管理画面が開きます。

こちらに上記のコードを実際に書いてみましょう。

SnapCrab_Desktop_2014-9-16_11-54-57_No-00

新規作成する場合は「New」ボタンをFunctionの名前は、「Name:」へ記述します。
そして「Language:」にはJavascriptを選択しましょう。
Functionに対する引数は「Prameters:」ボタンを押すと動的に入力項目が追加されます。
こちらに引数の名前を登録しましょう。今回は name という引数を登録しました。

Studioは、こちらの画面からもFunctionの実行が可能です。

下記のキャプチャの赤で囲った箇所に、Function名と引数の入力項目、そして「Execute」という緑のボタンが表示されます。

それでは引数の入力項目に[Yamaguchi]と入力して実行した結果を確認します。

SnapCrab_Desktop_2014-9-16_11-55-17_No-00

このような結果になります。

次に、このFunctionをSQLから呼び出してみましょう。

どのデータベースにも登録されている ouser の name を引数として上記のFunctionを実行してみます。

select sayHelloOrientDB(name) from ouser

SnapCrab_Desktop_2014-9-16_11-48-22_No-00

上記のサンプルでは、OrientDBにはデータベース作成時に ouser class にデフォルトでadminとreaderとwriterのレコードが登録されていますので、そちらを利用しています。

ouser 全てのレコードの name フィールドを取得しそれに、「Hello!~」と繋げてみました。

OrientDB Function の大体のイメージはつかめたでしょうか?

Javascript

Javascriptで書けるというのが非常によいですね、もちろん Javascript の繰り返し処理や条件分岐そして try catch やJavascriptの関数も使用可能です。

また、FunctionはRecursive(再帰呼び出し)にも対応しています。

以下に簡単な、リカーシブの例を載せます。

function fact(num)
{
if (num === 0)
    return 1;
else
    return num * fact( num - 1 );
}

上記のようにFunction内で再帰的に自関数を呼び出すことが可能です。

ofunction class

OrientDBに登録されたFunctionはどのようにして管理さているのでしょうか?
OrientDBでは、作成したFunctionは全て ofunction class に格納されています。
わかりやすく言うのであれば、作成した Function の実体を管理するテーブルが存在する(ちょっと正確な表現ではないのですが)と思っていただければよいかと思います。

そのため、ofunction class を操作することにより直接Functionを確認することも可能です。
それでは 登録されている function を全て表示してみましょう!

select from ofunction

上記のコードを studio で実行してみます。以下の実行結果のように 全ての Function が取得できました。

SnapCrab_Desktop_2014-9-16_18-51-35_No-00

サンプルその2

次にデータの登録を行うFunctionを作成してみます。
まずは、Insert 文による登録を行います。
Member というnameとemailとregistDate(登録日)の3つのフィールドを持つクラスに指定数だけデータを登録するFunctionです。
クラス、フィールドという表現だと分かりづらければ、Member というnameとemailとregistDate(登録日)の3つのカラムを持つテーブルにレコードをインサートすると置き換えて考えてください。


db.begin();
for(var i = 0 ; i < n ; i++){
    var name = prefix + "_" + i;
    var email = name + "@example.com";
    //javasript から java の API を呼び出してみます。
    var registDate = new java.util.Date();
    var result = db.command("insert into Member (name,email,registDate) values(?,?,?)", [name, email, registDate] );
}
db.commit();
return n;

上記のコードでは、コメントも付けましたがJava APIを呼び出す1例として registDate に対して new java.util.Date() の値をセットしています。

次はせっかくJavascriptで書いてるんだからJSONを使ってデータを登録する例です。

db.begin();
for(var i = 0 ; i < n ; i++){
    var name = prefix + "_" + i;
    var email = name + "@example.com";
    //javasript から java の API を呼び出してみます。
    var registDate = new java.util.Date();
    //ここまでは上記と一緒
    var member = {
    "@class":"Member",
    "name" : name,
    "email" : email,
    "registDate" : registDate 
    };
    var result = db.save(member);
}
db.commit();
return n;

上記のようにJSON内に、@classに対してクラス名を指定することにより直接データを保存することが可能です。

OrientDB の Function は REST API と組み合わせることが可能です。
RESTでの使用を前提としてFunction内にて返却するHTTPのステータスやリクエストオブジェクトの取得といったことも可能です。

クライントとRESTによる通信のみを行うAPサーバーであれば、従来はデータベースがいてRESTエンジン/インターフェースとして全面にアプリケーション・サーバーを置くといった構成が、OrientDBだけで賄うことが可能になってしまいます。

次は、REST API と連携したFunctionをご紹介したいと思います。