グリッド、データのグループ化およびOData

以前の記事の1つで、ODataプロトコルを使用してリモートサーバーでグリッドコントロールがどのように機能するかを簡単に説明しました。 最新のグリッドコントロールを使用すると、データを複数の列に簡単にグループ化できます。 グリッドが自動データグループ化を実行する場合に、RESTサーバーへの要求がどのように定式化されるかをより詳細に検討してみましょう。

利便性(なぜ必要なのか)


複数の列でレコードをグループ化できるグリッドコントロールにより、プログラマーとエンドユーザーの両方の生活が大幅に簡素化されます。 たとえば、タスクのリストをグループ化したり、ヘルプが必要なタスクを強調表示したり、優先度で分類したりすることができると便利です。

画像

次に、従業員ごとにグループ化し、選択した従業員のすべてのタスクを、ステータスと優先度別にグループ化して表示できます。

画像

開発者にとって特に便利なのは、わずか数行のコードでこのような快適なインターフェースを作成することができることです。

方法


サンプルタスクリストを用意しました
databoom.space/samples_devexpress_grouping.html

この例では、Devexpress dxDataGridを使用しました(このグリッドはDevExtreme Webコンポーネントセットの一部です)
詳細については、dxDataGridのドキュメントを参照してください。
js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid
例を参照してください:
js.devexpress.com/Demos/WidgetsGallery/#demo/datagridgridpagingandscrollingpager/generic/light/default
databoomサーバーとグループ化せずにグリッドがどのように機能するかの簡単な例:
databoom.space/samples_devexpress_grid.html
グリッドがデータブームで動作するためには、グリッドに表示するデータのリスト、たとえば人のリストを含むURLを指定するだけで十分です。
samples.databoom.space/api1/sampledb/collections/persons

グリッドでグループ化を有効にするには、プロパティを指定するだけです
groupPanel:{visible:true}
その後、グリッドを使用すると、列ヘッダーをグループ化パネルにドラッグしてデータをグループ化できます。

グリッドが最初のインプレッションで列のデータをグループ化するには、列の説明で以下を指定する必要があります。
groupIndex:0 (最初の列の場合、データがグループ化されるコンテンツによって)
groupIndex:1 (2番目の列など)

ほんの2、3の設定、そしてユーザーはあなたに感謝するでしょう:)

仕組み


タスクのリストを取得できるグリッドURLを指定しました
samples.databoom.space/api1/sampledb/collections

次に、グリッドはURLにさまざまな要求条件を追加することにより、サーバーへの要求を自動的に生成します。

ステータスと優先度でグループ化されたタスクのリストを表示するためにグリッドがサーバーに送信する最初の要求:
https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$top=21&$inlinecount=allpages

データはソートされているため、彼はグループとして最初のレコードの「Task_Status」および「Task_Priority」フィールドの値を取得します。 次に、これらのフィールドの値が重複するいくつかのエントリがあります。 次に、優先度が変更されたいくつかのエントリがあります。 つまり、この場合、並べ替えられたデータを取得するには単純なクエリで十分です。

グリッドを下にスクロールして残りのレコードを表示すると、グリッドはサーバーに次のレコードを要求します。たとえば:

https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$skip=29&$top=32&$inlinecount=allpages

この場合、別のクエリパラメータが追加されました。

上記のリクエストは、ステータスと優先度でソートされたタスクのリストを表示するためにグリッドがサーバーに送信する単純なリクエストと違いはありません。

次に、ステータスが「完了」のレコードのグループを折りたたんでみましょう。 グリッドは2つのリクエストをサーバーに送信します。

  1. https://samples.databoom.space/api1/sampledb/collections/tasks?$top=1&$filter=(Task_Status eq 'Completed')&$ inlinecount = allpages
  2. https://samples.databoom.space/api1/sampledb/collections/tasks?$orderby=Task_Status,Task_Priority,id&$top=31&$filter=((Task_Status ne 'Completed'))&$ inlinecount = allpages

最初のリクエスト

このリクエストは、ステータスが「Completed」(折りたたまれているもの)のレコードの数を調べるために必要です。

2回目のリクエスト

次のグループを折りたたむと、これらの2つのクエリの最初は、折りたたまれているグループのレコード数も要求しますが、次のクエリには、2つの折りたたまれたグループのレコードからの例外が既に含まれています:

したがって、グリッドは、ソート、単純なフィルタリング、およびページ出力条件を使用して、単純なクエリを非常にうまく処理します。

備考(動作方法)


多数のグループの場合、不等式($ filter = ... and ... and ... and ... and ...)の条件が多数あるすべての折りたたまれたグループをフィルター処理するクエリが大きくなり、効果が不十分になります。

グループのリストを取得してから、フィールドが等しいかどうかのレコード(特定のグループに属するすべてのレコード)を要求し、これらのフィールドでソートすることができます。 このようなクエリは、必要なインデックスが与えられると、1つのグループ内の少数のレコードをすばやく受け取り、この少数をソートします。

ただし、この方法で機能するには、データ集約のリクエストの実行を標準化する機能が必要です。

データ集約の要求を満たす機能はOData標準バージョン4.0登場し、グリッドコントロールのメーカーは製品の新しいバージョンでこれらの機能のサポートを実装する予定です。

Source: https://habr.com/ru/post/J254413/


All Articles