Java関数
すべてのモジュールで、次のライブラリが自動的にインポートされます。
java.lang.*
java.math.*
java.text.*
java.util.*
これらのライブラリにある任意の関数を利用することができます。
例:
java.util.Random を使う場合
create variable Random generator = new Random();
insert into CreateMeasurement
select
"12345" as source,
"c8y_TemperatureMeasurement" as type,
current_timestamp().toDate() as time,
{
"c8y_TemperatureMeasurement.T1.value", generator.nextInt(12) + 18,
"c8y_TemperatureMeasurement.T1.unit", "C",
"c8y_TemperatureMeasurement.T2.value", generator.nextInt(12) + 18,
"c8y_TemperatureMeasurement.T2.unit", "C",
"c8y_TemperatureMeasurement.T3.value", generator.nextInt(12) + 18,
"c8y_TemperatureMeasurement.T3.unit", "C",
"c8y_TemperatureMeasurement.T4.value", generator.nextInt(12) + 18,
"c8y_TemperatureMeasurement.T4.unit", "C",
"c8y_TemperatureMeasurement.T5.value", generator.nextInt(12) + 18,
"c8y_TemperatureMeasurement.T5.unit", "C"
} as fragments
from pattern[every timer:at(*, *, *, *, *, */30)];
java.math.BigDecimal を使う場合
select
getNumber(m, "c8y_TemperatureMeasurement.T.value").divide(new BigDecimal(3),2,RoundingMode.HALF_UP)
from MeasurementCreated m;
データベース関数
履歴データにアクセスするため、データベースに直接次のような関数を利用することができます。
ほとんどの関数は、複数形式に対応しています:
findOne…(…): クエリ結果がただ1つのオブジェクトを含むことを期待し、そうでなければ失敗する。
findFirst…(…): クエリ結果の最初のオブジェクトを返却する。結果がなければ “null” を返却する。
findAll…(…): クエリ結果のすべてのオブジェクトを返却する。
以下の表は利用可能なすべての関数のリストです。略号 “…” は “findOne”, “findFirst”, “findAll” に置き換えてください。
また、返却型は"findAll"の場合はList、それ以外は取得対象のオブジェクトです。
関数名(および類似形式)
返却型
引数リスト
findManagedObjectById
ManagedObject
id*:String* id*:GId*
findFirstManagedObjectParent findOneManagedObjectParent
ManagedObject
managedObjectId*:String* managedObjectId*:GId*
…ManagedObjectByFragmentType
List | ManagedObject
fragmentType*:String*
…ManagedObjectByType
List | ManagedObject
type*:String*
findEventById
Event
id*:String* id*:GId*
findFirstEventByFragmentType findOneEventByFragmentType
Event
fragmentType*:String*
…EventByFragmentTypeAndSource
List | Event
fragmentType*:String*, source*:String*
…EventByFragmentTypeAndSourceAndTimeBetween
List | Event
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*
…EventByFragmentTypeAndSourceAndTimeBetweenAndType
List | Event
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*, type*:String*
…EventByFragmentTypeAndSourceAndType
List | Event
fragmentType*:String*, source*:String*, type*:String*
…EventByFragmentTypeAndTimeBetween
List | Event
fragmentType*:String*, from*:Date*, to*:Date*
…EventByFragmentTypeAndTimeBetweenAndType
List | Event
fragmentType*:String*, from*:Date*, to*:Date*, type*:String*
findFirstEventByFragmentTypeAndType findOneEventByFragmentTypeAndType
Event
fragmentType*:String*, type*:String*
…EventBySource
List | Event
source*:String*
findMeasurementById
Measurement
id*:String* id*:GId*
findFirstMeasurementByFragmentType findOneMeasurementByFragmentType
Measurement
fragmentType*:String*
…MeasurementByFragmentTypeAndSource
List | Measurement
fragmentType*:String*, source*:String*
…MeasurementByFragmentTypeAndSourceAndTimeBetween
List | Measurement
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*
…MeasurementByFragmentTypeAndSourceAndTimeBetweenAndType
List | Measurement
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*, type*:String*
…MeasurementByFragmentTypeAndSourceAndType
List | Measurement
fragmentType*:String*, source*:String*, type*:String*
…MeasurementByFragmentTypeAndTimeBetween
List | Measurement
fragmentType*:String*, from*:Date*, to*:Date*
…MeasurementByFragmentTypeAndTimeBetweenAndType
List | Measurement
fragmentType*:String*, from*:Date*, to*:Date*, type*:String*
findFirstMeasurementByFragmentTypeAndType findOneMeasurementByFragmentTypeAndType
Measurement
fragmentType*:String*, type*:String*
…MeasurementBySource
List | Measurement
source*:String*
findLastMeasurementByFragmentTypeAndSourceAndTimeBetween
Measurement
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*
findLastMeasurementByFragmentTypeAndSourceAndTimeBetweenAndType
Measurement
fragmentType*:String*, source*:String*, from*:Date*, to*:Date*, type*:String*
findLastMeasurementByFragmentTypeAndTimeBetween
Measurement
fragmentType*:String*, from*:Date*, to*:Date*
findLastMeasurementByFragmentTypeAndTimeBetweenAndType
Measurement
fragmentType*:String*, from*:Date*, to*:Date*, type*:String*
findOperationById
Operation
id*:String* id*:GId*
findFirstOperationByAgent findOneOperationByAgent
Operation
agentId*:String*
…OperationByAgentAndStatus
List | Operation
agentId*:String*, status*:String*
findFirstOperationByDevice findOneOperationByDevice
Operation
deviceId*:String*
…OperationByDeviceAndStatus
List | Operation
deviceId*:String*, status*:String*
…OperationByStatus
List | Operation
status*:String*
…OperationByCreationTimeBetween
List | Operation
from*:Date*, to*:Date*
findAlarmById
Alarm
id*:String* id*:GId*
…AlarmBySource
List | Alarm
sourceId*:String*
…AlarmBySourceAndStatus
List | Alarm
sourceId*:String*, status*:String*
…AlarmBySourceAndStatusAndType
List | Alarm
sourceId*:String*, status*:String*, type*:String*
…AlarmBySourceAndStatusAndTimeBetween
List | Alarm
sourceId*:String*, status*:String*, from*:Date*, to*:Date*
…AlarmBySourceAndTimeBetween
List | Alarm
sourceId*:String*, from*:Date*, to*:Date*
findFirstAlarmByStatus findOneAlarmByStatus
Alarm
status*:String*
…AlarmByStatusAndTimeBetween
List | Alarm
status*:String*, from*:Date*, to*:Date*
…AlarmByTimeBetween
List | Alarm
from*:Date*, to*:Date*
ヘルパー関数
フラグメントへのアクセス
フラグメントは次のヘルパー関数でアクセスできます:
Object getObject(Object event, String path[, Object defaultValue])
String getString(Object event, String path[, String defaultValue])
Number getNumber(Object event, String path[, Number defaultValue])
Boolean getBoolean(Object event, String path[, Boolean defaultValue])
Date getDate(Object event, String path[, Date defaultValue])
List getList(Object event, String path[, List defaultValue])
オブジェクト構造内では、JsonPath (ルート要素 $ を使用しない) で追跡できます。
例:
select
getNumber(m, "c8y_TemperatureMeasurement.T.value")
from MeasurementCreated m;
select
e.event as event
from EventCreated e
where getObject(e, "c8y_Position") is not null;
キャスト
cast() 関数により Object のような型で受け取ったデータ型を適切な型に変換できることがあります。
Javaプリミティブ型へのキャスト:
cast(myVariable, long)
他の型では、フルパッケージ名を含むクラス名を指定する必要があります。
cast(event.managedObject.childAssets[0], com.cumulocity.model.ID)
current_timestamp
current_timestamp() 関数で、現在のサーバー時刻を取得できます。Things Cloudストリームで利用できる toDate() 関数によって簡単に Date データ型に変換できます。
例:
insert into CreateAlarm
select
"c8y_HighTemperatureAlarm" as type,
current_timestamp().toDate() as time,
event.event.source as source,
CumulocitySeverities.WARNING as severity,
CumulocityAlarmStatuses.ACTIVE as status,
"The device has high temperature" as text
from EventCreated event;
inMaintenanceMode
inMaintenanceMode() 関数で、デバイスがメンテナンスモードにあるかをすぐに調べられます。ID をパラメータとして取り、boolean 値を返却します。
例:
insert into SendEmail
select
"receiver1@cumulocity.com,receiver2@cumulocity.com" as receiver,
"cc@cumulocity.com" as cc,
"bcc@cumulocity.com" as bcc,
"reply@cumulocity.com" as replyTo,
"Example mail" as subject,
"This mail was sent to test the SendEmail stream in Cumulocity" as text
from EventCreated e
where not inMaintenanceMode(e.event.source);
replaceAllPlaceholders
テキストに可変値を含める場合、連結記号(||)を利用することができます。
insert into SendEmail
select
"receiver1@cumulocity.com,receiver2@cumulocity.com" as receiver,
"cc@cumulocity.com" as cc,
"bcc@cumulocity.com" as bcc,
"reply@cumulocity.com" as replyTo,
"Example mail" as subject,
"An event with the text " || e.event.text || " has been created." as text
from EventCreated e;
テキストが長く、可変値データを多く持つ場合、replaceAllPlaceholders() 関数が有用です。この関数の利点として、現在のオブジェクトの使用だけではなく、アラーム、メジャーメント、イベントを発生させたデバイスのすべての情報にアクセスすることができます。
テキスト文字列に、値を示すJsonPath(ルート要素の$を除いたもの)を入れたハコ(placeholder)を置き、#{} でくくります。デバイスオブジェクトの情報にアクセスするには、JsonPath を source で開始してください。
ハコを含む文字列と、ハコを埋めるオブジェクトを指定して関数を呼びます。そして、sourceデバイスが自動的に検索されます。
例:
create variable string myMailText =
"The device #{source.name} with the serial number #{source.c8y_Hardware.serialNumber} created an event with the text #{text} at #{time}. The device is located at #{source.c8y_Address.street} in #{source.c8y_Address.city}.";
insert into SendEmail
select
"receiver1@cumulocity.com,receiver2@cumulocity.com" as receiver,
"cc@cumulocity.com" as cc,
"bcc@cumulocity.com" as bcc,
"reply@cumulocity.com" as replyTo,
"Example mail" as subject,
replaceAllPlaceholders(myMailText, e.event) as text
from EventCreated e;
toNumberSetParameter
モジュール外のタイマーパターン設定に toNumberSetParameter() 関数が使えます。タイマーパターンを含むモジュールをデプロイすると、デプロイ時にパターンが固定され、モジュールを再デプロイするまで変更できません。
変数がデプロイ時にすぐ解決できる場合であれば、タイマーパターンを変数で設定することができます。これにより、タイマーパターンをマネージドオブジェクトに格納することができます。デプロイ時にそれを読み込み、タイマーパターンとして書き込むことができます。
toNumberSetParameter() 関数は、文字列をタイマーパターンの入力となる NumberSetParameter 型に変換します。
タイマーパターンに関する詳細は ここ をご参照ください。
例:
create variable ManagedObject device = findManagedObjectById("12345");
create variable string minuteVal = getString(device, "config.minute");
create variable string hourVal = getString(device, "config.hour");
create variable string dayOfMonthVal = getString(device, "config.day");
create variable string monthVal = getString(device, "config.month");
create variable string dayOfWeekVal = getString(device, "config.weekday");
insert into CreateOperation
select
"PENDING" as status,
"12345" as deviceId,
{ "c8y_Restart", {} } as fragments
from
pattern [every timer:at(toNumberSetParameter(minuteVal),
toNumberSetParameter(hourVal),
toNumberSetParameter(dayOfMonthVal),
toNumberSetParameter(monthVal),
toNumberSetParameter(dayOfWeekVal))];