高度なクエリの実行

graphql.enable.filtering 構成 プロパティが true である場合、Denodo GraphQL サービスでは、GraphQL 標準機能にとどまらず、複雑なフィルタの指定、データの並べ替え、結果のグループ化、および集計関数の計算を実行できます。

フィルタリング

graphql.enable.filteringtrue である場合、Denodo GraphQL サービスによって生成されるスキーマの各クエリ定義に、新しいオプション引数 _filter が追加されます。

これにより、ユーザーは、等号以外の条件を使用して GraphQL サービスに対してクエリを実行でき、それらの条件を andor 、および not の各演算子を使用して組み合わせることができます。

以下の例のクエリでは、レンタル期間が 3 日、レンタル料が 3 より高いフィルムを選択します。

Query with complex filtering

複雑なフィルタリングを使用したクエリ

複雑なフィルタリングを使用したクエリの応答
{
  "data": {
     "film": [
             {
             "film_id": 2,
             "title": "ACE GOLDFINGER",
             "description": "An Astounding Epistle of a
                   Database Administrator And an Explorer who
                   must Find a Car in Ancient China",
             "length": 48,
             "rental_duration": 3,
             "rental_rate": 4.99
             },

        ...
     ]
  }
}

スキーマには、引数 _filter 以外に、必要な入力型が追加されます。

複雑なフィルタリングを行うための GraphQL スキーマ
type Query {
    order(cust_id: Int, order_id: Int, total_price: BigInteger, order_desc: String, order_date: Timestamp, last_updated_time: Timestamp, _first: Int, _offset: Int, _filter: FilterInput, _orderBy: [SortInput!], _groupBy: [String!]): [order]!
}

# Only one is allowed: eq | neq | gt | gte | lt | lte | in | isnull | like  | regexp_like | regexp_ilike
input FilterExpressionInput {
  containsand: String
  containsor: String
  eq: String
  field: String!
  gt: String
  gte: String
  in: String
  iscontained: String
  isnull: String
  like: String
  lt: String
  lte: String
  neq: String
  regexp_ilike: String
  regexp_like: String
}

# Only one is allowed: and | expression | not | or
input FilterInput {
  and: [FilterInput!]
  expression: FilterExpressionInput
  not: FilterInput
  or: [FilterInput!]
}

複雑なフィルタリングで使用できる比較演算子は、 FilterExpressionInput 入力型で定義されています。「 比較演算子 」を参照してください。

フィルタリングの制限事項

以下のカスタムスカラー型は、この種のフィルタリングの入力フィールドとしてサポートされていません。

  • Array

  • Blob

  • IntervalDaySecond

  • IntervalYearMonth

  • Struct

  • Xml

また、フィールドは、引数 _filter とフィールド選択セットに同時に指定することはできません。

Invalid query with complex filtering

複雑なフィルタリングを使用した無効なクエリ

並べ替え

graphql.enable.filteringtrue である場合、Denodo GraphQL サービスによって生成されるスキーマの各クエリに、新しい引数 _orderby が追加されます。

これにより、ユーザーは、GraphQL サービスに対してクエリを実行する際にデータを並べ替えることができます。

以下の例のクエリでは、フィルムを長さの降順、レンタル料の昇順に並べ替えています。

Query with sorting

並べ替えを使用したクエリ

並べ替えを使用したクエリの応答
{
  "data": {
     "film": [
        …

             {
             "film_id": 991,
             "title": "WORST BANGER",
             "description": "A Thrilling Drama of a Madman And
                  a Dentist who must Conquer a Boy in The
                  Outback",
             "length": 185,
             "release_year": "2006-01-01",
             "rental_rate": 2.99
             },
             {
             "film_id": 141,
             "title": "CHICAGO NORTH",
             "description": "A Fateful Yarn of a Mad Cow And a
                   Waitress who must Battle a Student in
                  California",
             "length": 185,
             "release_year": "2006-01-01",
             "rental_rate": 4.99
             },

        ...
     ]
  }
}

スキーマには、引数 _orderby 以外に、必要な入力型が追加されます。

並べ替えを行うための GraphQL スキーマ
type Query {
    order(cust_id: Int, order_id: Int, total_price: BigInteger, order_desc: String, order_date: Timestamp, last_updated_time: Timestamp, _first: Int, _offset: Int, _filter: FilterInput, _orderBy: [SortInput!], _groupBy: [String!]): [order]!
}

#Only one is allowed: asc | desc
input SortInput {
  asc: String
  desc: String
}

グループ化と集計関数

graphql.enable.filteringtrue である場合、Denodo GraphQL サービスによって生成されるスキーマにおいて、各クエリに新しい引数 _groupBy が追加され、各ビュータイプに _aggregation フィールドが追加されます。

これにより、ユーザーは、結果をグループ化して、そのデータの値 (平均、合計、最大など) を集計できます。

以下の例のクエリでは、フィルムの長さごとの平均レンタル料を取得します。

Query with group by and aggregation functions

グループ化と集計関数を使用したクエリ

グループ化と集計関数を使用したクエリの応答
{
  "data": {
     "film": [
             {
                "_aggregation": [
                {
                   "avg": {
                        "field": "rental_rate",
                        "value": 2.59
                    }
                }
             "length": 46
             },

        ...
     ]
  }
}

スキーマには、引数 _groupBy_aggregation フィールド以外に、必要な型が追加されます。

グループ化と集計関数を使用するための GraphQL スキーマ
type Query {
    order(cust_id: Int, order_id: Int, total_price: BigInteger, order_desc: String, order_date: Timestamp, last_updated_time: Timestamp, _first: Int, _offset: Int, _filter: FilterInput, _orderBy: [SortInput!], _groupBy: [String!]): [order]!
}

type order {
  cust_id: Int
  order_id: Int
  total_price: BigInteger
  order_desc: String
  last_updated_time: Timestamp
  order_date: Timestamp
  order_detail: [order_detail]!    # Denodo association
  _aggregation: AggregationFunction!
}

type Aggregated {
  field: String!
  value: String!
}

type AggregationFunction {
  avg(field: String): Aggregated
  count: BigInteger
  first(field: String): Aggregated
  last(field: String): Aggregated
  max(field: String): Aggregated
  median(field: String): Aggregated
  min(field: String): Aggregated
  stdev(field: String): Aggregated
  stdevp(field: String): Aggregated
  sum(field: String): Aggregated
  var(field: String): Aggregated
  varp(field: String): Aggregated
}

使用できる集計関数は、 AggregationFunction 型で定義されています。「 集計関数 」を参照してください。

クエリで集計関数を複数回使用する

関数は AggregationFunction 型のフィールドなので、GraphQL の 別名 メカニズムを使用しない限り、同じ集計関数を複数回使用することができません。各関数呼び出しに _aggregation 句内で一意な名前を付けることによって、任意の関数を繰り返し実行できるようになります。

Query with a repeated aggregation function (max)

集計関数 (max) を繰り返し実行するクエリ

集計関数 (max) を繰り返し実行するクエリの応答
{
    "data": {
        "film": [
            {
                "_aggregation": {
                    "count": 1000,
                    "max1": {
                        "field": "rental_rate",
                        "value": "4.99"
                    },
                    "max2": {
                        "field": "rental_duration",
                        "value": "7"
                    },
                    "max3": {
                        "field": "length",
                        "value": "185"
                    }
                }
            }
        ]
    }
}