はじめに
先日、以下の記事を発表しました。
新しいテクノロジーに触れる時はいつでも楽しいものです。
まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。
本稿情報のソースとして、下記ドキュメントを参照ください。
異なるエンティティの結合
Fenl式によって生成される値はすべて、定数でなければ(たとえば、42
も、Fenlの式だと言えます)、エンティティに関連付けられています。
エンティティは、以下の性質を持ちます。
- 集計 (例
sum
:min
、 、first
) は、各値のエンティティ キーにスコープされます。 - 複数の引数 (すなわち
add
またはeq
) を受け入れる単純な関数では、非定数引数に互換性のあるエンティティ キー タイプがあり、同じエンティティ キーを持つ値の間で動作します。
このスコープ動作により、同一のエンティティ同士の一般的な操作を簡単に作成できますが、多くの場合、値を異なるエンティティ キーと組み合わせるニーズがあります。
例えば、式ProductReview.stars
は、個々のレビューがキーとなりますが、それぞれの内容は、Product
と言うエンティティに関係しています。
関数lookup
サポートは、このようなユースケースをサポートします。lookup
関数は 2 つの引数を取ります。最初の引数key
(キー式) は検索されるエンティティ キーを記述し、2 番目の引数value
(外部式) は検索される値を記述します。
lookup(key, value)
- キー式は「他の」エンティティ キーを識別し、「この」エンティティの値に対する操作として表現する必要があります。たとえば、個々の製品レビューに関連付けられたレビュー担当者に関する情報を検索したい場合、キー式は
ProductReview.reviewer_id
のようになります 。 - 外部表現
value
は、検索する値を記述し、「他の」エンティティの値に対する操作として表現します。
以下のように、各製品レビューから、関連する情報をまとめることができます。
{
product_id: ProductReview.product_id,
reviewer: ProductReview.reviewer_id,
reviewer_avg: lookup(ProductReview.reviewer_id, ProductReviewByReviewer.stars | mean()),
reviewer_count: lookup(ProductReview.reviewer_id, ProductReviewByReviewer.stars | count()),
}
ルックアップ式は、キー式が null
以外の値を生成するたびに、外部式の値を生成します。