SQL Example :Group Selector
2020/08/07

グループセレクタの設定


グループセレクタの設定は設定ファイルで行います。
インストールフォルダ下の /resource/group_selector.cnf をテキストエディタで編集してください。

設定ファイル構成

設定ファイルには3つのセクションがあります。

タブ名

グループセレクタのタブに表示される名称を定義します。

  • -- tabs で囲まれた中へ 改行 区切りで指定します
  • 同じ名前のタブは定義してはいけません
  • 最大 16 個まで
  • 以降に定義するクエリの「数」と「順」を必ず一致させてください

グループセレクタ抽出クエリ

グループセレクタの候補を抽出するためのクエリを定義します。
グループセレクタのタブを切り替えた時に発動し、抽出された列が候補一覧として表示されます。

  • -- queries で囲まれた中へ セミコロン+改行 区切りで定義します
  • 単一列が抽出されるようにしてください
  • コメントを記述したい場合は SQLite3 の文法を用いてください
  • list_view のカラム名は CatShanty2 メインメニューのヘルプ → DBカラム名一覧 で確認できます

アイテムリスト抽出クエリ

グループセレクタの候補(各行)をクリックした時に、実際にアイテムリストへ抽出するためのクエリとなります。
Item List 1 などで説明している記述と同じ形になります。

  • -- operators で囲まれた中へ セミコロン+改行 区切りで定義します
  • @click-string はクリックした候補(文字列)に置換されます
  • コメントを記述したい場合は SQLite3 の文法を用いてください
  • list_view のカラム名は CatShanty2 メインメニューのヘルプ → DBカラム名一覧 で確認できます

デフォルト定義ファイル解説

付属の定義ファイルを例に実際の動作の流れと定義を見てみます。

ジャンルの定義と動作

group_selector.cnf をテキストエディタで開くと、-- tabs セクションの2番目に ジャンル が定義してあります。

-- tabs

ジャンル

-- tabs

以降、各セクションの2番目が ジャンル タブ用の定義になります。

1) グループセレクタ候補の抽出

ユーザーが ジャンル タブへ切り替えを行うと、CatShanty2 は -- queries セクションで定義された ジャンル 用のクエリを実行します。

-- queries

SELECT DISTINCT genre_name FROM list_view ORDER BY genre_name;

-- queries

この単純なクエリは list_view から DISTINCT genre_name 、つまり 現在のアイテムリスト から ジャンル名を重複除去 で抽出します。
そしてこの抽出結果がそのままグループセレクタの候補一覧へ表示されます。

list_view は現在のアイテムリストを表示する元となっている DB の view (CatShanty2 において動的に構築されるテーブルのようなもの) です。  
あいまい検索など様々な条件を経て view が生成され、アイテムリストとして表示されています。  
グループセレクタは list_view を更に条件付けすることでアイテムリストの絞り込みを行うわけです。

2) アイテムリストを候補で絞り込む

次に、ユーザーが候補一覧にて アクション の項目をクリックしたとします。
すると CatShanty2 は -- operators セクションで定義された ジャンル 用のクエリを実行します。

-- operators

SELECT * FROM list_view WHERE genre_name = '@click-string';

-- operators

ここで @click-stringアクション という文字列に置換されますので、実際には次のクエリが実行されることになります。

SELECT * FROM list_view WHERE genre_name = 'アクション';

もうおわかりですね。
結果として、アイテムリストには list_view からジャンル名 'アクション' で絞り込まれたアイテムがリストアップされることになります。


評価の定義

少し変わった定義をしている部分を説明します。

1) グループセレクタ候補の抽出

見てのとおり、評価用のクエリは list_view を参照していません。
評価の場合、UIを考えると星0~5つまでの全選択肢をユーザーへ提示する方が自然な感じがします。

-- queries

SELECT value FROM json_each(
    '["☆☆☆☆☆","★☆☆☆☆","★★☆☆☆","★★★☆☆","★★★★☆","★★★★★"]'
  ); -- rating 無条件で全パターン向けUI候補;

-- queries

そこで JSON 配列に星のパターンを入れ、value を SELECT することで1要素が1行で抽出されるようにしています。
結果としてグループセレクタ候補には、これらの星パターンが全て並びます。

2) アイテムリストを候補で絞り込む

候補から星パターンをクリックすると、パターンそのものが文字列としてクエリへ渡されます。
実際のデータベース中では、評価は 0, 10, 20, 30, 40, 50 という数値で保存されていますので、パターンを数値に変換するクエリを書けば良いことになります。

-- operators

SELECT * FROM list_view WHERE rating = length(rtrim('@click-string', '☆')) * 10;

-- operators

例えば ★★★☆☆ をクリックした場合、以下のクエリが実行されることになります。

SELECT * FROM list_view WHERE rating = length(rtrim('★★★☆☆', '☆')) * 10;

まず rtrim('★★★☆☆', '☆')★★★☆☆★★★ に刈り込まれます。
そして length('★★★') となるため、文字数 3 が数えられます。
最終的に 3 * 10 が計算され、rating = 30 という条件でクエリが実行されます。

marm.nakamura