Outsystemsで動的なクエリを作成(ために文字列を分割)する方法

OutSystems備忘録

記載内容について

Aggregateで作成することが難しいような動的クエリをOutSystemsのSQLウィジェットを使用して動かすための方法を記載いたします。
どっちかというとロジック的な部分が多い記事になるためもっと上手く作れると思います。
センスねぇなぁと思いながらコメントに残していただけると主が喜びます。
出オチ感ありますけど公式非推奨の実装になる部分がありますので自己責任でお願いいたします。

2024/09/09時点では十分なデータが用意できていないため実際にクエリを動かすまでは試せていませんすみません…
ん?じゃあこの記事はなんなんでしょうか…

実装例

今回は検索ボックス1つで「and」,「or」検索を実装することを目標にしております。
下記記載の実装を目標としております。またAndやOrの数も動的に変化する想定で作成していきます。
A B ⇒ AとBを含む(AND条件検索)
A or B ⇒ AとBのいずれかを含む(OR条件検索)

※現時点ではWhere句の作成までを行ってます
上記画像の様にInputで受け取った検索文字列を半角スペースを区切り文字として分割、その後指定のアトリビュートに対してのWhere句を作成をした後画面に表示するまでを一旦のゴールとしております。

文字列の分割

Manage DependenciesからText(extension)のString_Splitを選択しApplyでImportします。
String_SplitはTextに渡した変数を自身が指定したDelimiters(区切り文字)で分割し、リストで返してくれるActionです。

Importが完了したら実際に「生成」ボタン押下時の「SearchOnClick」から呼ばれるサーバーアクション「SearchAction」を作っていきます。例として私が作成したアクションのパラメータを説明いたします。

  • KeyWord:画面のInputで受け取った値を受け取るInput Parameter(Text)
  • Out1:作成したWhere句を画面に表示するためのOutput Parameter(Text)
  • SQLIn:今回動的に作成されるWhere句を格納する変数(Text)
  • IsOr:「or」が入力された際の分岐を制御するためのフラグ(Boolean)

先ほどImportしたString_Splitをフローに挿入し分割対象となる変数(主の例の場合にはKeyWord)をTextに設定、区切り文字(主の場合は半角スペース)をDellimitersに設定する。
これによりString_SplitアクションのOutputとして分割された文字列がリスト型で返却されます。

分割された文字列からWhere句の作成

コメントで処理概要を記載した画像を添付したので参考にしていただければと思いますが主は基本的にConcat(a,b)を使用して文字列を条件に沿って結合していく形を取りました。
基本は”AND”で結合していくのですが、初回のループと”or”が入力された際の処理に少し悩んだので今回は初回ループはRownumberを、”or”が入力された時にはフラグを立てることで制御いたしました。
もっといい方法があると思いますのでコメントで教えてくださると幸いです。
ここまできたらループを抜けた後にOut1にSQLInをAssignして、画面側から読んであげれば実装は完了していると思います。

作成した変数をSQLで使用する方法(未実装、公式非推奨)

ここからはWidget内でのTestは確認したものの未実装の部分になりますので現状は参考程度にお願いいたします。(タイトルだとメイン事項ですね、タイトル詐欺ですねすみません)

SQLウィジェットで変数を使うためには以下の設定が必要になります

  • ParametersにInput Parameterを追加
  • 追加したInput Parameterの「Expand Inline」をTrueに変更(公式非推奨

これらの設定を完了することで画像のように動的クエリを作成することができる様になります。
しかし公式非推奨と記載した通りにSQLインジェクションのリスクやパフォーマンス面での影響もある様なので使用する際はよく調べてからお願いいたします。

終わりに

実際に実装する際はInputを複数に分けたりチェックボックスを活用することでAggregateでの実装ができる様な内容ですがどうしてもInput1つで実装したいとのことで調査をしてみたのでメモに残しました。公式非推奨なのでいまいちスッキリしませんでしたが誰かの助けになれば幸いです。
相変わらず稚拙な文章ですがこれからもニッチな更新を続けていくつもりなのでよろしくお願いいたします。

コメント

タイトルとURLをコピーしました