高度なクエリの実行¶
graphql.enable.filtering
構成 プロパティが true
である場合、Denodo GraphQL サービスでは、GraphQL 標準機能にとどまらず、複雑なフィルタの指定、データの並べ替え、結果のグループ化、および集計関数の計算を実行できます。
フィルタリング¶
graphql.enable.filtering
が true
である場合、Denodo GraphQL サービスによって生成されるスキーマの各クエリ定義に、新しいオプション引数 _filter
が追加されます。
これにより、ユーザーは、等号以外の条件を使用して GraphQL サービスに対してクエリを実行でき、それらの条件を and
、 or
、および not
の各演算子を使用して組み合わせることができます。
以下の例のクエリでは、レンタル期間が 3 日、レンタル料が 3 より高いフィルムを選択します。
{
"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
以外に、必要な入力型が追加されます。
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
入力型で定義されています。「 比較演算子 」を参照してください。
フィルタリングの制限事項¶
以下のカスタムスカラー型は、この種のフィルタリングの入力フィールドとしてサポートされていません。
Blob
IntervalDaySecond
IntervalYearMonth
Xml
これらのカスタムスカラー型のほか、VDP の register
データ型または array
データ型から生成された GraphQL オブジェクト型も入力フィールドとしてサポートされていません。また、引数 _filter
とフィールド選択セットでフィールドを同時に指定することはできません。
並べ替え¶
graphql.enable.filtering
が true
である場合、Denodo GraphQL サービスによって生成されるスキーマの各クエリに、新しい引数 _orderby
が追加されます。
これにより、ユーザーは、GraphQL サービスに対してクエリを実行する際にデータを並べ替えることができます。
以下の例のクエリでは、フィルムを長さの降順、レンタル料の昇順に並べ替えています。
{
"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
以外に、必要な入力型が追加されます。
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.filtering
が true
である場合、Denodo GraphQL サービスによって生成されるスキーマにおいて、各クエリに新しい引数 _groupBy
が追加され、各ビュータイプに _aggregation
フィールドが追加されます。
これにより、ユーザーは、結果をグループ化して、そのデータの値 (平均、合計、最大など) を集計できます。
以下の例のクエリでは、フィルムの長さごとの平均レンタル料を取得します。
{
"data": {
"film": [
{
"_aggregation": [
{
"avg": {
"field": "rental_rate",
"value": 2.59
}
}
"length": 46
},
...
]
}
}
スキーマには、引数 _groupBy
と _aggregation
フィールド以外に、必要な型が追加されます。
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
句内で一意な名前を付けることによって、任意の関数を繰り返し実行できるようになります。
{
"data": {
"film": [
{
"_aggregation": {
"count": 1000,
"max1": {
"field": "rental_rate",
"value": "4.99"
},
"max2": {
"field": "rental_duration",
"value": "7"
},
"max3": {
"field": "length",
"value": "185"
}
}
}
]
}
}