SRC
すべての tql スクリプトは、少なくとも1つのデータソース関数で開始する必要があります。
SRC 関数には複数の種類があります。SQL() は Machbase Neo、またはブリッジ接続した外部データベースで
SQL を実行してレコードを生成します。FAKE() はテストデータ、CSV() は CSV ファイルを読み込み、
BYTES() はファイルシステム・HTTP リクエスト・MQTT ペイロードからバイナリデータを取得します。

SQL()
構文: SQL( [bridge(),] sqltext [, params...])
bridge()bridge(’name’): 指定したブリッジで SQL を実行します。sqltextstring: データベースで実行する SELECT 文。複数行にはバッククォート(`)を使います。params: バインドパラメーターを渡す可変長引数。
例
- Machbase のクエリ
SQL (`
SELECT time, value
FROM example
WHERE name ='temperature'
LIMIT 10000
`)- 位置パラメーターを使う可変長引数のクエリ
SQL(`SELECT time, value FROM example WHERE name = ? LIMIT ?`,
param('name') ?? 'temperature',
param('limit') ?? 10)- 名前付きパラメーターのクエリ
SQL(`SELECT time, value FROM example WHERE name = :name LIMIT :limit`,
named('name', param('name') ?? 'temperature'),
named('limit', param('limit') ?? 10))- ブリッジ先データベースのクエリ
SQL( bridge('sqlite'), `SELECT * FROM EXAMPLE`)SQL(
bridge('sqlite'),
`SELECT time, value FROM example WHERE name = ?`,
param('name') ?? "temperature")named() Since v8.7.0
構文: named( name, value )
SQL の :name など、名前付きバインドプレースホルダーへ渡すパラメーターを指定します。
namestring: SQL の:nameプレースホルダーに対応するパラメーター名。valueany: バインドする値。
例
SQL("SELECT time, value FROM tag_simple WHERE name = :name LIMIT :one",
named("name", "tag1"),
named("one", 1))SQL(`
SELECT * FROM example
WHERE name = :name
AND time BETWEEN :from AND :to
`,
named("name", "microwave"),
named("from", "2023-03-01 14:00:00"),
named("to", "2023-03-01 14:10:00"))SQL_SELECT()
構文: SQL_SELECT( fields..., from(), between() [, limit()] )
Since v8.0.15
fieldsstring: 取得する列名。複数指定できます。
SQL_SELECT() は SQL() と同じ機能を、SQL 文ではなくオプション関数で指定できます。
特に時間範囲を簡潔に記述できます。
次の例は、内部で SELECT time, value FROM example WHERE NAME = 'temperature' AND time BETWEEN ...
という形式の SQL を生成します。
SQL_SELECT(
'time', 'value',
from('example', 'temperature'),
between('last-10s', 'last')
)上のコードは次の SQL に相当します。
SQL(`SELECT
time, value
FROM
EXAMPLE
WHERE
name = 'temperature'
AND time BETWEEN (
SELECT MAX_TIME-10000000000
FROM V$EXAMPLE_STAT
WHERE name = 'temperature')
AND (
SELECT MAX_TIME
FROM V$EXAMPLE_STAT
WHERE name = 'temperature')
LIMIT 0, 1000000
`)from()
構文: from( table, tag [, time_column [, name_column] ] )
テーブル名とタグ名を指定します。内部では ... FROM <table> WHERE NAME = <tag> ... を構成します。
tablestring: テーブル名。tagstring: タグ名。time_columnstring: 時刻列名。デフォルトは'time'。name_columnstring: タグ列名。デフォルトは'name'。 Since v8.0.5
between()
構文: between( fromTime, toTime [, period] )
時間範囲を指定します。内部では ... WHERE ... TIME BETWEEN <fromTime> AND <toTime> ... を構成します。
fromTimestring|number:'now'、'last'などの式、またはナノ秒単位の Unix epoch。toTimestring|number: 終了時刻。periodstring|number: 区間の長さ。期間文字列またはナノ秒の数値で指定し、正の値だけが有効です。
例えば 'now-1h30m' は現在から1時間30分前、'last-30s' は最新時刻から30秒前を表します。
period を指定すると、GROUP BY time と集計関数を含む SQL を生成します。
この場合、fields に基準時刻列を含める必要があります。
日時文字列は parseTime() でナノ秒タイムスタンプに変換してください。詳細は
parseTime()を参照してください。
between( parseTime("2023-03-01 14:00:00", "DEFAULT", tz("Local")),
parseTime("2023-03-01 14:05:00", "DEFAULT", tz("Local")))limit()
構文: limit( [offset ,] count )
SELECT ... LIMIT offset, count を生成します。
offsetnumber: デフォルト0。countnumber。
CSV()
構文: CSV( file(file_path_string) | payload() [, charset()] [,field()...[, header()]] )
CSV を読み込み、キーと値からなるレコードを生成します。キーは連番、値は CSV のフィールドです。
file() には絶対パスを指定します。payload() は HTTP POST 本文から直接 CSV を読み込めるため、
リモートクライアントから受信したデータをすぐに保存する API の作成に便利です。
file() | payload(): 入力ストリーム。field(idx, type, name): フィールド定義。header(bool): 先頭行をヘッダーとして扱うか。charset(string): UTF-8 以外の CSV の文字セット。 Since v8.0.8logProgress([int]):n行ごとに進捗ログを出力。省略時は500,000行。 Since v8.0.29
// HTTP リクエスト本文から CSV を読み込む例
// 例:
// barn,1677646800,0.03135
// dew_point,1677646800,24.4
// dishwasher,1677646800,3.33e-05
CSV(payload(),
field(0, stringType(), 'name'),
field(1, timeType('s'), 'time'),
field(2, floatType(), 'value'),
header(false)
)
APPEND(table('example'))CSV() と APPEND() を組み合わせると、簡潔で実用的な API を作れます。
コマンドラインの import と比べて約5倍遅いものの、HTTP リクエストごとに数千件以上を処理する場合は
INSERT() より高速です。
HTTP POST がない場合にも動作させるには、?? 演算子を使用できます。
CSV(payload() ?? file('/absolute/path/to/data.csv'),
field(0, floatType(), 'freq'),
field(1, floatType(), 'ampl')
)
CHART_LINE()file()
構文: file(path)
指定パスのファイルを開き、入力ストリームを返します。HTTP URL のリソースも取得できます Since v8.0.7 。
pathstring: ファイルの絶対パス、または HTTP/HTTPS URL。
CSV( file(`http://127.0.0.1:5654/db/query?`+
`format=csv&`+
`q=`+escapeParam(`select * from example limit 10`)
))
CSV() // または JSON()
payload()
構文: payload()
HTTP POST または MQTT PUBLISH で渡された本文を入力ストリームとして返します。
field()
構文: field(idx, typefunc, name)
CSV フィールドの型を指定します。
idxnumber: 0始まりのフィールドインデックス。typefunc: フィールドの型を指定する関数。namestring: フィールド名。
| 型関数 | 型 |
|---|---|
stringType() | string |
doubleType() | double |
datetimeType() | datetime |
boolType() | boolean Since v8.0.20 |
floatType() | 非推奨。doubleType() を使用
Since v8.0.20 |
timeType() | 非推奨。datetimeType() を使用
Since v8.0.20 |
stringType() と boolType() は引数を取りません。datetimeType() は時刻の単位や形式を指定できます。
Unix epoch を使う場合は、次のように単位を指定します。
datetimeType('s')datetimeType('ms')datetimeType('us')datetimeType('ns')
人が読む日時形式を使う場合は、形式とタイムゾーンを併せて指定します。
datetimeType('DEFAULT', 'Local')
CSV(payload() ??
`name,2006-01-02 15:04:05.999,10`,
field(1, datetimeType('DEFAULT', 'Local'), 'time'))
CSV()datetimeType('RFC3339', 'EST')
CSV(payload() ??
`name,2006-01-02T15:04:05.999Z,10`,
field(1, datetimeType('RFC3339', 'EST'), 'time'))
CSV()タイムゾーンの省略時は UTC です。
datetimeType('RFC822')
第1引数は timeformat() と同じ形式を使います。詳細は
timeformatを参照してください。
charset()
構文: charset(name)
Since v8.0.8
namestring: 文字セット名。
サポートする文字セット:
UTF-8, ISO-2022-JP, EUC-KR, SJIS, CP932, SHIFT_JIS, EUC-JP, UTF-16, UTF-16BE, UTF-16LE, CP437, CP850, CP852, CP855, CP858, CP860, CP862, CP863, CP865, CP866, LATIN-1, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-10, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, KOI8R, KOI8U, MACINTOSH, MACINTOSHCYRILLIC, WINDOWS1250, WINDOWS1251, WINDOWS1252, WINDOWS1253, WINDOWS1254, WINDOWS1255, WINDOWS1256, WINDOWS1257, WINDOWS1258, WINDOWS874, XUSERDEFINED, HZ-GB2312
SCRIPT()
ユーザー定義のスクリプト言語をサポートします。例は SCRIPTを参照してください。
HTTP()
簡潔な DSL で HTTP リクエストを送信できます。例は HTTPを参照してください。
BYTES(), STRING()
構文: BYTES( src [, separator(char), trimspace(boolean) ] )
構文: STRING( src [, separator(char), trimspace(boolean) ] )
src: データソース。payload()、file()、文字列定数を指定できます。separator(char): 任意。separator("\n")のように指定すると行ごとに分割します。trimspace(boolean): 任意。空白を除去するか。デフォルトはfalse。
入力を区切り文字で分割してレコードを生成します。キーは増加する整数です。
例
STRING('A,B,C', separator(","))→["A"]、["B"]、["C"]の3レコード。STRING('A,B,C')→["A,B,C"]の1レコード。
BYTES() と STRING() は戻り値の型だけが異なり、前者はバイト配列、後者は文字列を返します。
STRING(payload() ?? `12345
23456
78901`, separator("\n"))上のコードは ["12345"]、[" 23456"]、[" 78901"] の3レコードを生成します。
STRING(payload() ?? `12345
23456
78901`, separator("\n"), trimspace(true))空白を除去すると、["12345"]、["23456"]、["78901"] になります。
STRING( file(`http://example.com/data/words.txt`), separator("\n") )HTTP アドレスからデータを取得する例です。file() は HTTP URL をサポートします
Since v8.0.7
。
ARGS()
構文: ARGS()
Since v8.0.7
親 TQL フローから渡された引数を値とするレコードを生成します。主に WHEN...do() サブフローの SRC に使います。
| |
実行すると、コンソールに次のように出力されます。
OUTPUT: 2 WORLDFAKE()
構文: FAKE( generator )
generator:oscillator()、meshgrid()、linspace()、arrange()、csv()、json()のいずれか。
指定したジェネレーターでテストデータを生成します。
oscillator()
構文: oscillator( freq() [, freq()...], range() )
周波数と時間範囲を指定して波形データを生成します。複数の freq() を指定すると合成波形になります。
| |
freq()
構文: freq( frequency, amplitude [, bias, phase])
amplitude * SIN( 2*Pi * frequency * time + phase) + bias の正弦波を生成します。
frequencynumber: 周波数(Hz)。amplitudenumber。biasnumber。phasenumber: ラジアン。
range()
構文: range( fromTime, duration, period )
fromTime から fromTime + duration までの時間範囲を定義します。
fromTimestring|number:'now'、'last'、またはナノ秒単位の epoch。durationstring|number: 期間。例:'-1d2h30m'、'1s100ms'。periodstring|number: サンプル間隔。期間文字列またはナノ秒の数値で指定し、正の値だけが有効です。
arrange()
構文: arrange(start, stop, step)
Since v8.0.12
startnumberstopnumberstepnumber
| |
1
1.5
2linspace()
構文: linspace(start, stop, num)
1次元の等間隔シーケンスを生成します。
| |
1
2
3meshgrid()
構文: meshgrid(xseries, yseries)
x軸とy軸の値を組み合わせたメッシュデータを生成します。
| |
1,10
1,20
1,30
2,10
2,20
2,30
3,10
3,20
3,30csv()
構文: csv(content)
Since v8.0.7
contentstring: CSV 文字列。
指定した CSV 内容をレコードへ変換します。
| |
A,10,true
B,20,false
C,30,truejson()
構文: json({...})
Since v8.0.7
複数の JSON 配列をレコードへ変換します。
| |
A,10,true
B,20,false
C,30,true
