[OutSystems]Reactive Web AppのAggregate最適化


Reactive Web Appで、Aggregateの最適化が効かずに、サーバからクライアントへの通信時に使用されない属性まで送られてしまうという問題について、改善がEAP(2021/3/20時点)に来ていたので動作確認してみます。

ちなみに、以前Qiitaに書きました。記事はReactive Web AppのAggregateは全データが露出するです。

また、EAPの詳細ページは、以下になります。
Technical Preview - Server-to-client data transfer optimization

環境

Personal Environment(Version 11.10.0 (Build 22910))
Service Studio(Version 11.10.13)

EAPの機能を有効化

EAPの機能を試すためには、LifeTimeから該当機能を有効にしなければなりません。
LifeTimeを開き、Environments > 右上の「Options」ドロップダウンリスト > Technical Preview。

「Client-side optimizations for Reactive Web Apps」を有効にして、「Save」ボタンをクリック。

ドキュメントによると、この設定後対象モジュールをPublishする必要があります。

動作確認用セットアップ

簡単なEntityを用意し、2レコードだけ登録しておきました。
それをテスト用画面のAggregateで全件取得しています。

Aggregateの結果をTableに表示した場合

Aggregateを画面にドラッグ&ドロップしてTableに全列を表示するようにした場合の通信キャプチャは以下の通り。

{"versionInfo":{"hasModuleVersionChanged":false,"hasApiVersionChanged":false},"data":{"List":{"List":[{"LogRecordSample":{"Id":"0","Message":"AsynchronoulsLoggingAPIテスト - LogRecord","Instant":"2020-12-31T13:37:39Z","Severity":3}},{"LogRecordSample":{"Id":"0","Message":"AsynchronoulsLoggingAPIテスト - LogRecord","Instant":"2020-12-31T13:52:09Z","Severity":3}}]},"Count":2}}

わかりにくいのでブラウザの開発者ツールでeval()してみます。
表示している全列が通信データに載っていますね。

Aggregateの結果を画面で使用しない場合

Aggregateを定義するだけしておいて、画面では全く使わない場合です。
通信キャプチャは以下の通り。

{"versionInfo":{"hasModuleVersionChanged":false,"hasApiVersionChanged":false},"data":{"List":{"List":[{"LogRecordSample":{"Id":"0","Message":"","Instant":"1900-01-01T00:00:00","Severity":0}},{"LogRecordSample":{"Id":"0","Message":"","Instant":"1900-01-01T00:00:00","Severity":0}}]},"Count":-1}}

eval()した結果。本来であれば、属性ごと落ちてほしいところですが、属性は残り、OutSystemsにおける型のデフォルト値として返ってくるようです。

Aggregateの1レコードの1列だけ使った場合

画面にExpressionをおいて、GetLogRecordSamples.List.Current.LogRecordSample.MessageをValueに設定した場合。

{"versionInfo":{"hasModuleVersionChanged":false,"hasApiVersionChanged":false},"data":{"List":{"List":[{"LogRecordSample":{"Id":"0","Message":"AsynchronoulsLoggingAPIテスト - LogRecord","Instant":"1900-01-01T00:00:00","Severity":0}},{"LogRecordSample":{"Id":"0","Message":"AsynchronoulsLoggingAPIテスト - LogRecord","Instant":"1900-01-01T00:00:00","Severity":0}}]},"Count":-1}}

eval()した結果。使った属性については全レコードで返ってくるようですね。