ユーザー定義関数
このトピックの例では、既存の .NET 関数またはユーザー定義関数 (UDF) のメソッド呼び出しを使用して、StreamInsight LINQ 演算子の式を拡張する方法を示します。
UDF を使用すると、式をどのように複雑化することも可能です。このような式は、フィルター述語、射影、結合述語などの通常の式が使用される任意の場所で使用できます。ただし、このようなメソッド呼び出しはイベントごとに評価されることに注意してください。ユーザー定義関数は、実行時にアダプターが指定および使用されるのと同じ方法で StreamInsight サーバーからアクセスできるアセンブリにコンパイルする必要があります。
UDF のパラメーターと戻り値には、StreamInsight プリミティブ型のいずれかを指定する必要があります。さらに、UDF のためにカルチャ関連パラメーターが使用されます。
例
次の例では、ユーザー定義関数を使用して StreamInsight クエリの機能を拡張する方法を示します。
ユーザー定義フィルター
受信したイベントを理論的に判断し、イベントを出力に渡すかまたは除外するユーザー定義フィルター演算子を作成することができます。このようなユーザー定義フィルターでは、ユーザー定義データを理論的に判断することも、イベントのフィルターのプロセスに複雑なロジックや特別なロジックを含めることもできます。
ユーザー定義射影
ユーザー定義射影式は、ユーザー定義フィルターと同様に新しいペイロード値を生成することができます。この値の計算は、StreamInsight で提供されている式機能では実行できません。
使用例
次の例では、ペイロード フィールドに MyFunc 関数を適用することによって、フィルター式のユーザー定義計算を使用します。
// Assuming the following input event type:
public class MyPayload
{
public int id;
public int a;
public int b;
public double value;
}
var filteredStream = from e in stream
where e.value > MyFunc(e.a * e.b)
select e;
次の例では、MyFunctions.valThreshold ユーザー定義関数がフィルター述語に指定されます。
var filteredStream = from e in stream
where e.value < MyFunctions.valThreshold(e.id)
select e;
次の例では、valThreshold ユーザー定義関数を使用します。この関数は、1 つのパラメーターを受け取り、値を返します。
public class MyFunctions
{
public static int valThreshold(int id)
{
switch (id)
{
case 1:
return 15;
case 2:
return 11;
case 3:
return 18;
default:
return 0;
}
}
}
次の例に示すとおり、ユーザー定義射影関数は、射影の他の式と同様に使用することができます。
var result = from e in stream
select new { location = MyFunctions.Lookup(e.id) };
ユーザー定義関数は、組み込みプリミティブ型以外にもカルチャ関連情報をパラメーターとして受け取ることができます。使用できる型を次に示します。
CultureInfo
StringComparison
CompareOptions
次の例は、カルチャ固有情報を UDF に提供する方法を示しています。
// Assuming the following input event type:
public class MyPayload
{
public int id;
public string name;
}
var result = from e in stream
select new { location = MyFunctions.Lookup2(
e.name,
new CultureInfo("en-US"),
CompareOptions.IgnoreCase)
};
カルチャ情報は、次の例に示すとおり、入力ストリームのイベント フィールドから取得することもできます。その場合には、CepUtility.GetEventFieldCulture ヘルパー関数を使用します。
var result = from e in stream
select new { location = MyFunctions.Lookup2(
e.name,
CepUtility.GetEventFieldCulture(e.name),
CompareOptions.IgnoreCase)
};