Table.View を使用してクエリ フォールディングを実装す

このコンテンツは開発中です。 エントリには、部分的な内容が含まれる場合があります。

Power Query と M 言語の強力な機能の 1 つは、クエリ フォールディング (別名「クエリ委任」および「述語プッシュダウン」) です。 クエリ フォールディングを使用すると、M エンジンは、M クエリで表現された変換をソースのネイティブ クエリ言語でソースにプッシュできるため、データ処理がより効率的になります。

データ ソースは、さまざまなレベルのクエリ機能をサポートします。 一貫したデータ変換を提供するために、M エンジンは、ソースに送信できない変換を補正 (ローカルで処理を実行) します。 データ コネクタには、その機能をエンジンに報告して、処理できる変換を分類し、適切なクエリ構文を生成し、M エンジンに残りの作業を処理させる役割があります。 データ コネクタは、Table.View 関数を介してクエリ フォールディングの動作を実装できます。

Table.View は、クエリ操作の既定のハンドラーをオーバーライドするために使用されます。 ほとんどのハンドラーは省略可能であり、ソースがサポートする操作のフォールディングを実装できるようにします。 ハンドラーが処理できないクエリ式を検出すると、エラーが発生して、M エンジンが既定の操作ハンドラーにフォールバックする可能性があります。

以下のセクションでは、Table.View でサポートされているハンドラーについて説明します。

必須ハンドラー

Table.View の実装には、次のハンドラーが必要です。

Handler 関数シグネチャ まとめ
GetRows () as table (必須) テーブルの結果を返します。 常に最後に呼び出されるハンドラー。
GetType () as type (必須) GetRows から想定されるテーブルの M type を返します。

GetRows

GetRows ハンドラーは、データ ソース関数 (例: テーブル) の結果を返します。 これは、最後に呼び出されるハンドラーであり、他のハンドラーによって設定された、すべてのクエリ状態情報を考慮に入れる必要があります。

GetType

GetType ハンドラーは、GetRows への呼び出しの結果の M テーブル型を返します。 基本的な実装では、このハンドラーは GetRows の結果に対して Value.Type() を呼び出します。 クエリを評価せずに (固定メタデータを使用するか、メタデータ/スキーマ サービスをクエリすることで) 結果のスキーマを決定できるソースは、このハンドラーでこれらの操作を実行します。

Value.Type(GetRows()) を返すと、GetRows() が 2 回呼び出されることに注意してください。 GetRows() を呼び出さないと種類を判別できない場合は、共通変数に結果を格納することをお勧めします。 例については、以下のサンプルを参照してください。

基本ハンドラー

次のハンドラーは、M RowExpression 値を処理せずに実装でき、通常は拡張機能の実装が簡単です。

Handler 関数シグネチャ まとめ
GetRowCount () as number number を返します。 GetRows を呼び出さずにカウントを決定できる最適化として使用されます。
OnDistinct (columns as list) Table.Distinct の結果として呼び出されます。
OnRenameColumns (renames as list) 列の名前を変更するときに呼び出されます (Table.RenameColumns)。
OnSelectColumns (columns as list) 特定の列を選択するときに呼び出されます。
OnSkip (count as number) Table.Skip を使用するときに呼び出されます。
OnSort (order as list) テーブルが並べ替えられたときに呼び出されます (Table.Sort)。
OnTake (count as number) 取得する行数を制限するときに呼び出されます (Table.FirstN)。

GetRowCount

数値を返します。 GetRowCount 操作の既定のハンドラーは、GetRows ではなく Table.RowCount を呼び出すことです。 ソースがクエリを評価せずに合計行数を計算できる場合は、このハンドラーをオーバーライドします。

OnDistinct

列名のリストを受け取ります。 ハンドラーは、指定された列の値が重複している行を削除する必要があります (つまり、残りの行は区別されます)。 「Table.Distinct」を参照してください。

OnRenameColumns

Table.RenameColumns の引数と同じように、リストのリストを受け取ります。 各内部リストには 2つの text メンバーがあります。最初のメンバーは古い列名で、2 番目のメンバーは新しい列名です。

OnSelectColumns

ユーザーが選択した列名のリストを受け取ります。 「Table.SelectColumns」を参照してください。

OnSkip

結果セットからスキップする必要がある行数を示す数値を受け取ります。 「Table.Skip」を参照してください。

OnSort

次のタイプのレコードのリストを受け取ります。

type [ Name = text, Order = Int16.Type ]

ここで、Name は列の名前であり、OrderOrder.Ascending または Order.Descending と同じです。 「Table.Sort」を参照してください。

OnTake

GetRows から返される行の最大数を示す数値を受け取ります。 「Table.FirstN」を参照してください。

式ハンドラー

次のハンドラーは、M RowExpression 値を処理する必要があります。

Handler 関数シグネチャ まとめ
OnAddColumns (constructors) 計算列 (Table.AddColumn) を追加するときに呼び出されます。
OnGroup (keys, aggregates) さまざまな集計変換に対して呼び出されます。
OnJoin (joinSide, leftTable, rightTable, joinKeys, joinKind) 2 つのテーブルの結合を実行するときに呼び出されます。
OnSelectRows (selector) 式 (Table.SelectRows) に基づいて行を選択するときに呼び出されます。

直接クエリ ハンドラー

拡張機能から直接クエリ機能を有効にするには、次のハンドラーが必要です。 拡張機能は、完全な直接クエリ サポートを宣言せずに、クエリ フォールディングを実装できることに注意してください。 直接クエリ サポートは、Table.View ハンドラーの大部分が実装されている場合にのみ有効にする必要があります。

Handler 関数シグネチャ まとめ
GetExpression () as record
OnInvoke (function, arguments, index) 直接クエリ機能を決定するために呼び出されます。