SCRIPT()
TQLは、SRC と MAP のコンテキストでJavaScriptを使用できる SCRIPT() 関数を提供します
Since v8.0.36
。
使い慣れたプログラミング言語でロジックを記述し、より柔軟で強力なスクリプトを作成できます。
構文: SCRIPT({main_code})
構文: SCRIPT({init_code}, {main_code})
構文: SCRIPT({init_code}, {main_code}, {deinit_code})
- init_code:初期化コード(省略可。ただし deinit_code がある場合は必須)
- main_code:必須の実行コード
- deinit_code:終了時に実行するコード(省略可)
init_code は最初に1回だけ実行されます。main_code は必須です。
注意事項
現在の SCRIPT() はGojaベースのJavaScript実行環境を使用します。
Typed Array、テンプレートリテラル(バッククォート文字列)、const、アロー関数を使用できます。
"use strict" による厳格モードも有効です。
正規表現の先読み((?=...)、(?!...))と後方参照(\1 など)も使用できます。
対応する言語機能は、利用するMachbase Neoに組み込まれた実行環境のバージョンに従います。
JSHモジュール
Since v8.0.52require() を使って、SCRIPT() 内にJSHモジュールをインポートできます。
SCRIPT({
const { arrange } = require("mathx")
arrange(0, 6, 3).forEach((i) =>$.yield(i))
})
CSV()コンテキストオブジェクト
Machbase Neoは、コンテキストオブジェクトとして $ 変数を提供します。JavaScriptは、このオブジェクトを通じてレコードやデータベースにアクセスし、新しいレコードを出力できます。
$.payload:リクエスト本文のデータ。SCRIPT()がSRCノードの場合にのみ存在し、それ以外はundefinedです。$.params:リクエストのクエリパラメーター。$.result:SCRIPT()関数が出力する結果のカラム名と型を指定します。$.key、$.values:現在のレコードのキーと値にアクセスします。MAPコンテキストでのみ使用できます。$.yield():値だけを渡して新しいレコードを出力します。$.yieldKey():キーと値を渡して新しいレコードを出力します。$.yieldArray():配列1つを引数として受け取り、レコードを出力します。$.db():新しいデータベース接続を返します。$.db().query():SQLクエリを実行します。$.db().exec():SELECT以外のSQLを実行します。$.request().do():リモートサーバーにHTTPリクエストを送信します。
$.payload
$.payload からリクエスト本文のデータを読み取れます。入力データがない場合は undefined です。
SRCノードとして使用する場合にのみアクセスできます。
| |
リクエスト本文なしで呼び出すと、$.payload は undefined になります。
curl -o - -X POST http://127.0.0.1:5654/db/tql/test.tql結果は既定値の name,0,10 です。
リクエスト本文を渡すと、次のように動作します。
curl -o - -X POST http://127.0.0.1:5654/db/tql/test.tql \
-d '{"prefix":"testing", "offset":10, "limit":10}'結果:testing,10,10
$.params
$.params は、リクエストのクエリパラメーターを提供します。
ドット表記($.params.name)と角括弧表記($.params["name"])の両方を使用できます。
| |
パラメーターなしで呼び出す場合:
curl -o - -X POST http://127.0.0.1:5654/db/tql/test.tql結果:name,0,10
パラメーターを渡す場合:
curl -o - -X POST "http://127.0.0.1:5654/db/tql/test.tql?prefix=testing&offset=12&limit=20"結果:testing,12,20
$.result
SCRIPT が出力する結果のカラムと型を定義します。
次の例のように、初期化コード内で設定します。
| |
$.key
現在のレコードのキーにアクセスします。MAPコンテキストでのみ定義され、SRCでは undefined です。
| |
hello-1,key is 0
hello-2,key is 1
hello-3,key is 2$.values
現在のレコードの値配列にアクセスします。MAPコンテキストでのみ使用でき、SRCでは undefined です。
| |
出力:
the first value is string,2nd value is 10,3rd is 3.14
$.yield()
新しいレコードを次のステップに出力します。キーには連番が自動的に割り当てられます。
$.yield(field1, field2, field3);$.yieldKey()
yieldKey() は $.yield() と同様に動作しますが、最初の引数でレコードのキーを指定します。
$.yieldKey(key, field1, field2, field3);$.yieldArray()
Since v8.0.39配列に格納されたレコードを出力します。
可変長引数を受け取る $.yield() と異なり、$.yieldArray() はレコードを表す配列1つを受け取ります。
配列を扱う場合に便利です。
var arr = [];
for( i = 0; i < unknown; i++) {
arr.push(field_values[i]);
}
$.yieldArray(arr);$.db()
新しいデータベース接続を返します。接続は query() と exec() 関数を提供します。
$.db({bridge: "sqlite"}) のように option オブジェクトを引数に指定すると、
Machbaseデータベースの代わりに、ブリッジ接続したデータベースへの新しい接続を返します。
オプション
optionパラメーターは次のバージョンからサポートされます Since v8.0.37 。
{
bridge: "name", // ブリッジ名
}$.db().query()
JavaScriptから $.db().query() でデータベースを検索できます。
query() の戻り値に forEach() でコールバック関数を適用し、クエリ結果を反復処理します。
.forEach() のコールバック関数が明示的に false を返すと、反復処理は直ちに終了します。
true を返すか、何も返さない場合(undefined を返す場合)は、
クエリ結果の末尾まで反復処理を続けます。
| |
cpu.percent,1725330085908925000,73.9
cpu.percent,1725343895315420000,73.6
cpu.percent,1725343898315887000,6.1$.db().query() の結果から特定のカラムを選び、$.yield() で出力できます。
すべてのカラムをまとめて出力するには、$.yieldArray() を使用します
Since v8.0.39
。
| |
または、$.db().query().yield() を使って自動的に出力できます
Since v8.0.39
。
| |
$.db().exec()
SQLがSELECT文でない場合は、$.db().exec() を使用してINSERT、DELETE、CREATE TABLE文を実行します。
| |
$.request().do()
構文: $.request(url [, option]).do(callback)
リクエストオプション
{
method: "GET|POST|PUT|DELETE", // 既定値は "GET"
headers: { "Authorization": "Bearer auth-token"}, // キーと値のマップ
body: "body content if the method is POST or PUT"
}レスポンスを処理するコールバック関数を指定して .do() を呼び出すと、実際のリクエストを送信します。コールバック関数は、各種プロパティとメソッドを持つResponseオブジェクトを引数として受け取ります。
レスポンス
| プロパティ | 型 | 説明 |
|---|---|---|
.ok | Boolean | レスポンスのステータスコードが成功の場合に true(200<= status < 300) |
.status | Number | HTTPレスポンスコード |
.statusText | String | ステータスコードとメッセージ(例:200 OK) |
.url | String | リクエストURL |
.headers | Map | レスポンスヘッダー |
Responseオブジェクトには、レスポンス本文を取得するメソッドがあります。
| メソッド | 説明 |
|---|---|
.text(callback(txt)) | 本文を文字列としてコールバックに渡す |
.blob(callback(bin)) | 本文をバイナリ配列としてコールバックに渡す |
.csv(callback(row)) | 本文をCSVとして解析し、各行(レコード)に対して callback() を呼び出す |
使用方法
$.request("https://server/path", {
method: "GET",
headers: { "Authorization": "Bearer auth-token" }
}).do( function(rsp){
console.log("ok:", rsp.ok);
console.log("status:", rsp.status);
console.log("statusText:", rsp.statusText);
console.log("url:", rsp.url);
console.log("Content-Type:", rsp.headers["Content-Type"]);
});finalize()
SCRIPT() 内のJavaScriptコードで function finalize() {} を定義すると、
すべてのレコードを処理した後に、システムがこの関数を自動的に呼び出します。
次の2つのコード例は同じ動作をし、どちらも最後のレコードとして 999 を出力します。
FAKE( arrange(1, 3, 1) )
SCRIPT({
function finalize() {
$.yield(999);
}
$.yield($.values[0]);
})
CSV()FAKE( arrange(1, 3, 1) )
SCRIPT({
// 初期化処理なし
},{
// メイン処理
$.yield($.values[0]);
}, {
// 終了処理;
$.yield(999);
})
CSV()この例は、1、2、3、999 の4レコードを出力します。
例
Hello World
SCRIPT({
console.log("Hello World?");
})
DISCARD()結果

組み込みMathオブジェクト
JavaScriptの組み込み関数を使用できます。
| |
結果
JSONの解析
| |
結果
{
"data": {
"columns": [ "NAME", "AGE", "IS_MEMBER", "HOBBY" ],
"types": [ "string", "int32", "bool", "string" ],
"rows": [ [ "James", 24, true, "book,game" ] ]
},
"success": true,
"reason": "success",
"elapse": "627.958µs"
}CSVの取得
| |
JSONテキストの取得
この例は、リモートサーバーからJSONを取得し、JavaScriptで解析する方法を示します。
| |
