2023年7月21日金曜日

時間のかかる対話モード・レポートの初回表示を抑制する

先日こちらの記事で作成したAPEXアプリケーションですが、ページのロード時に必ずLlama.cpp(Llama2)のサーバーに問い合わせが発行され、ページ・ロードが完了するまでにとても時間がかかります。

対話モード・レポートのソースがローカル・データベースではなく、REST APIなどを経由したデータ・ソースである場合では、無駄なAPI呼び出しは避けたいです。また、課金が発生する場合は、ボタンを明示的に押したときに限りAPIを呼び出すように限定したいです。

エクスポートされている以下のアプリケーションに、上記の要件を満たすため動的アクションを追加しました。
https://github.com/ujnak/apexapps/blob/master/exports/llama2-ui-test.zip

対話モード・レポートの表示に時間がかかる場合に活用できる、一般的な実装です。

以下の2つの機能を実装しています。
  1. ページ・ロード時は、対話モード・レポートに一覧を表示しない(データ・ソースへの問い合わせを行わない)。
  2. ボタンQUERYをクリックすると対話モード・レポートのリフレッシュが開始します。リフレッシュが完了するまでボタンQUERYを無効化し、連続したクリックを無視します。リフレッシュが完了したら、ボタンQUERYを有効化します。
以下、追加した実装の説明です。

最初に対話モード・レポート属性遅延ロードオンに変更します。

遅延ロードがオフの場合、ページ・ロードの間に対話モード・レポートの表示が行われるため、後で使用するリフレッシュ前のイベントが発生しません。リフレッシュ前のイベントが取れないと、リフレッシュ処理をキャンセルできません。


対話モード・レポートに動的アクションを作成します。識別名前Before Refresh Responseとしています。

実行イベント有効範囲1回を選択します。

遅延ロードオンであるため、ページ・ロード時にイベントapexfreshが対話モード・レポートに送られ、ページ・ロードとは非同期で対話モード・レポートのリフレッシュが開始されます。ページ・ロード時のリフレッシュ処理が常に1回目のリフレッシュになるため、動的アクションBefore Refresh Responseはページ・ロードのときだけ評価されます。

タイミングイベントリフレッシュ前選択タイプリージョンリージョンResponseになります。


TRUEアクションとしてイベントの取消を選択します。動的アクションタイミングリフレッシュ前なので、これから実行されるはずだったリフレッシュ処理が取り消されます。時間のかかるLlama.cpp(Llama2)への問い合わせもキャンセルされます。


ボタンQUERYをクリックしたときに実行されるTRUEアクションを追加します。

TRUEアクションとして無効化を選択し、影響を受ける要素選択タイプボタンボタンQUERYを選びます。対話モード・レポートのリフレッシュを行なうアクションよりも先に実行されるよう、Trueアクションの一番上に配置します。


対話モード・レポートに動的アクションを作成します。

タイミングイベントリフレッシュ後を選択します。


TRUEアクションとして有効化を選択します。影響を受ける要素選択タイプボタンボタンとしてQUERYを選択することにより、ボタンQUERYをクリックしたときに無効化されたボタンを、再度クリック可能な状態に戻します。


以上で機能の追加は完了です。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

メモ

リージョンのリフレッシュをJavaScriptのコードから行なう場合は、対話モード・レポートの静的IDがllama2だとすると、

古いやり方(今でも動く):
apex.event.trigger("#llama2","apexrefresh");

新しいやり方:
apex.region("llama2").refresh();