Expression tree support via IQbservable<T>
IQbservable<T>による式木のサポート
Rx.NETの初期リリースが完了した後、私たちはIObservable<T>の式木サポートに着手し、IQueryable<T>とのデュアル化を実現しました。これにより、LINQ to SQLのようなクエリプロバイダを作成することができ、ユーザの意図を実行時に分析し、イベント処理式を最適化したり、式をターゲット言語に翻訳したり、リモートサービスにクエリを送信したりすることが可能になります。
After finalizing the initial release of Rx.NET, we started work on expression tree support for IObservable<T>, thus the dual to IQueryable<T>. This enables the creation of query providers, similar to LINQ to SQL, that can analyze user intent at runtime, and optimize event processing expressions, translate these expressions to a target language, and/or submit queries to a remote service.
code:C#
public interface IQbservable<out T> : IObservable<T>
{
Type ElementType { get; }
Expression Expression { get; }
IQbservableProvider Provider { get; }
}
public interface IQbservableProvider
{
IQbservable<T> CreateQuery<T>(Expression expression);
}
Rxの式木サポートの初期設計では、式木を使ってオブザーバーを引用する機能がありませんでした。観測可能なシーケンスのみが引用されたカウンターパートを持っていました。これは、observableクエリ式がサービスに送信され、ローカルのオブザーバに接続される接続クライアントのシナリオには便利ですが、イベント処理サブスクリプション式全体(つまりオブザーバを含む)のサービスへのリモートには対応していません。Reaqtorを設計する際に、この機能が追加されました。これにより、オフラインのクライアントがReaqtorサービスに永続的なイベント処理サブスクリプションを送信することが可能になり、そこで信頼性の高い維持が行われます。
This initial design of expression tree support for Rx omitted the ability to quote observers using expression trees. Only observable sequences had a quoted counterpart. While this is useful for connected client scenarios where an observable query expression is submitted to a service and connected to a local observer, it doesn’t support remoting an entire event processing subscription expression (i.e. including an observer) to a service. When designing Reaqtor, this facility was added, thus allowing for offline clients that submit a standing event processing subscription into the Reaqtor service, where it’s reliably maintained.
このインターフェースのIQbservable<T>のOの代わりにQを使った違和感のある綴りは、タイポではありません。これは、式と引用の同音異義性のダジャレで、引用された型は引用されていない同等のものと同じように見えるようにしたのです。
The funky spelling of this interface with a Q instead of an O in IQbservable<T> is not a typo. It’s a pun on homoiconicity of expressions and quotations, so we made the quoted type look the same as the non-quoted equivalent.
Rx.NET 1.1では、LINQ to WMI Events用のクエリプロバイダ実装のサンプルとともに、式木のサポートを出荷しました。このサンプルでは、クエリがWQLに変換されます。長年にわたって構築された他のサンプルにはLINQ to Twitterがありますが、この機能が広く採用されることはありませんでした。その理由の1つは、翻訳対象として機能するストリーミング・イベント処理用のクエリ言語が不足していたためです。Reaqtorでは、この機能を使って、クライアントとサービスの間で、ある言語から別の言語への変換を行わずに式ツリーを送信することを始めました。
We shipped support for expression trees in Rx.NET 1.1 with a sample query provider implementation for LINQ to WMI Events, where queries get translated to WQL. Some other sample that was built over the years is LINQ to Twitter, but this functionality never got widespread adoption in part due to the lack of query langages for streaming event processing that could act as translation targets. In Reaqtor, we started using this functionality to ship expression trees between clients and services, without any transpilation from one language into another.