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”, “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*

ヘルパー関数

フラグメントへのアクセス

フラグメントは次のヘルパー関数でアクセスできます:

オブジェクト構造内では、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))];