Skip to content

データの絞り込み

概要

  • データソースのクエリ実行結果からチャートで描画するデータを絞り込むためには WhereFilter を指定します
  • WhereFilter は、カラムや定数の参照、比較演算子 (=, LIKE, IN, BETWEEN など)、AND / OR の組み合わせで構築します
  • WhereFilter は、フォームUIを使って編集できるようにするため、生成規則に一定の制約があります
    • 標準の演算子で表現できない条件は、カスタムSQL (RAW_STRING) を使って指定します

型定義

カラムや値の参照

ts
// データソースのクエリ実行結果のカラムを参照する際に利用
type SqlField = {
  type: 'FIELD';
  key: string;  // カラム名を指定
};

// 定数を指定する際に利用
type SqlConstant = {
  type: 'CONSTANT';
  value: string | number | boolean;
  datatype: 'STRING' | 'INTEGER' | 'FLOAT' | 'BOOLEAN' | 'DATE' | 'DATETIME' | 'TIMESTAMP';
};

// NULL を指定する際に利用
type NullConstant = {
  type: 'CONSTANT';
  value: null;
  datatype: 'BOOLEAN';  // NULL はデータ型によらず BOOLEAN として扱います
};

演算子の定義

演算子の引数は SqlField を先頭に、SqlConstant を2番目以降に指定します。

ts
type SqlOperator =
  | {
      /** =, !=, >, >=, <, <=, LIKE */
      type: 'OPERATOR';
      name: 'EQUAL' | 'NOT_EQUAL' | 'GT' | 'GTE' | 'LT' | 'LTE' | 'LIKE';
      // LIKE の場合、定数値に % (0文字以上) や _ (1文字) のワイルドカードを指定する
      args: [SqlField, SqlConstant];
    }
  | {
      /** IS NULL / IS NOT NULL */
      type: 'OPERATOR';
      name: 'IS' | 'IS_NOT';
      args: [SqlField, NullConstant];
    }
  | {
      /** IN / NOT IN */
      type: 'OPERATOR';
      name: 'IN' | 'NOT_IN';
      args: [SqlField, SqlConstant, ...SqlConstant[]];
    }
  | {
      /** BETWEEN */
      type: 'OPERATOR';
      name: 'BETWEEN';
      args: [SqlField, SqlConstant, SqlConstant];
    };

// カスタムSQLを指定する際に利用 (SqlOperator では表現できない条件のために利用)
type CustomSqlOperator = {
  type: 'RAW_STRING';
  body: string;  // 真偽値を返すSQL文字列を指定
};

AND / OR の組み合わせ

AND / OR は交互にしか組み合わせられず、 WhereFilter には AND 条件のみ直接指定できます。

ts
type SqlAndOperator = {
  type: 'OPERATOR';
  name: 'AND';
  args: (SqlOrOperator | SqlOperator | CustomSqlOperator)[];
};

type SqlOrOperator = {
  type: 'OPERATOR';
  name: 'OR';
  args: (SqlAndOperator | SqlOperator | CustomSqlOperator)[];
};

// AND / OR は交互にしか組み合わせられないため、AND 条件のグルーピングには間に OR を挟む必要があります
export type WhereFilter = SqlAndOperator;

設定例

ts
// category が "FOOD" または "DRINK" で、price が 1000 以上のデータに絞り込む場合
{
  type: 'OPERATOR',
  name: 'AND',
  args: [
    {
      type: 'OPERATOR',
      name: 'OR',
      args: [
        {
          type: 'OPERATOR',
          name: 'EQUAL',
          args: [
            { type: 'FIELD', key: 'category' },
            { type: 'CONSTANT', value: 'FOOD', datatype: 'STRING' },
          ],
        },
        {
          type: 'OPERATOR',
          name: 'EQUAL',
          args: [
            { type: 'FIELD', key: 'category' },
            { type: 'CONSTANT', value: 'DRINK', datatype: 'STRING' },
          ],
        },
      ],
    },
    {
      type: 'OPERATOR',
      name: 'GT',
      args: [
        { type: 'FIELD', key: 'price' },
        { type: 'CONSTANT', value: 1000, datatype: 'INTEGER' },
      ],
    },
  ],
}

// updated_at が 2025-01-01 〜 2025-12-31 の範囲のデータに絞り込む場合
{
  type: 'OPERATOR',
  name: 'AND',
  args: [
    {
      type: 'OPERATOR',
      name: 'BETWEEN',
      args: [
        { type: 'FIELD', key: 'updated_at' },
        { type: 'CONSTANT', value: '2025-01-01', datatype: 'DATE' },
        { type: 'CONSTANT', value: '2025-12-31', datatype: 'DATE' },
      ],
    },
  ],
}

// updated_at が created_at より後のデータに絞り込む場合
// (カラム同士の比較は、SqlOperator では表現できないため、カスタムSQLを利用します)
{
  type: 'OPERATOR',
  name: 'AND',
  args: [
    {
      type: 'RAW_STRING',
      body: 'updated_at > created_at',
    },
  ],
}