Definitions
IRPの第2の側面は、既存のアーティファクトの上に合成したり、パラメータを導入したりできる新しいアーティファクトの定義を可能にすることです。コールドアーティファクトの場合は、Define*メソッドを使って定義を行うことができます。
The second aspect of IRP enables the definition of new artifacts, which may compose over existing artifacts and introduce parameters. For cold artifacts, definitions can be performed using Define* methods:
code:C#
Task DefineObservableAsync<T, R>(Uri uri, Expression<Func<T, IAsyncReactiveQbservable<R>>> observable);
Task DefineObserverAsync<T, R>(Uri uri, Expression<Func<T, IAsyncReactiveQbserver<R>>> observer);
...
例えば、高温の演算子を次のように定義することができます。
For example, one could define a high-temperature operator as follows:
code:C#
await ctx.DefineObservableAsync<double, WeatherInfo>(new Uri("eg://weather/hightemp"), t => ctx.Weather.Where(w => w.Temperature > t));
サービスに定義が提出されると、指定された識別子を使って定義されたアーティファクトを参照することができます。
Once a definition is submitted to a service, the defined artifact can be referred to using the specified identifier.
IRPは、フィルタリングやプロジェクションなどの様々な演算子がプリミティブとして組み込まれている従来のデータベースシステムとは異なり、ビルトインの演算子という概念がありません。IRPの世界では、すべての演算子は最終的に定義されます。演算子の中には、既存の演算子を参考にして定義できるものもあれば(例:Aggregateを参考にしたMin)、具体的な実装を参照する式を使って定義されるプリミティブもあります(サービスがホストする演算子ライブラリの不透明なコードに裏付けられています)。
IRP does not have any notion of built-in operators unlike traditional database systems where various operators such as filtering and projection are treated as primitives that are built-in. In the world of IRP, every operator ultimately gets defined. Some operators can be defined in terms of existing ones (e.g. Min in terms of Aggregate) while others are primitives that get defined using an expression that refers to a concrete implementation (backed by opaque code in an operator library hosted by the service).