高度なクエリの実行¶
OData では、高度なリクエストを作成できるように以下のクエリオプションを定義しています。
$filter
$select
$orderby
$expand
選択: $filter¶
$filter
システムクエリオプションを使用した URI は、 $filter
述語式を満たすコレクションのエンティティの一部を特定します。
式ではプロパティとリテラルを参照できます。リテラルには、文字列 (一重引用符で囲んで記述)、 null
リテラル、数値、または boolean 値を使用できます。
このサービスでは、以下の演算と関数をサポートしています。
演算子¶
演算子 |
説明 |
例 |
---|---|---|
eq |
等しい |
|
ne |
等しくない |
|
gt |
より大きい |
|
ge |
以上 |
|
lt |
より小さい |
|
le |
以下 |
|
in |
メンバーである |
|
and |
論理積 |
|
or |
論理和 |
|
not |
論理否定 |
|
add |
加算 |
|
sub |
減算 |
|
mul |
乗算 |
|
div |
除算 |
|
mod |
剰余 |
|
() |
優先順位グループ |
|
文字列関数¶
文字列演算では、以下の各関数を使用できます。
contains(string p0, string p1)
:p0
で指定したプロパティ名の値に文字列p1
が使用されていればtrue
、使用されていなければfalse
が返されます。startswith(string p0, string p1)
:p0
で指定したプロパティ名の値が文字列p1
で始まる場合はtrue
、それ以外の場合はfalse
が返されます。endswith(string p0, string p1)
:p0
で指定したプロパティ名の値が文字列p1
で終わる場合はtrue
、それ以外の場合はfalse
が返されます。indexof(string p0, string p1)
:p0
で指定したプロパティ名の値の中で文字列p1
が占める位置が返されます。length(p0)
:p0
で指定したプロパティ名の値の長さが返されます。substring(string p0, int pos)
:p0
で指定したプロパティ名の値の部分文字列が新しい文字列として返されます。この部分文字列は、pos
で指定した位置にある文字から文字列末尾までの文字列です。substring(string p0, int pos, int length)
:p0
で指定したプロパティ名の値の部分文字列が新しい文字列として返されます。この部分文字列は、pos
で指定した位置にある文字からpos
+length
の位置にある文字までの文字列です。tolower(string p0)
:p0
で指定したプロパティ名の値を小文字に変換した文字列が返されます。toupper(string p0)
:p0
で指定したプロパティ名の値を大文字に変換した文字列が返されます。trim(string p0)
:p0
で指定したプロパティ名の値から先頭と末尾の空白を削除した文字列が返されます。concat(string p0, string p1)
: 文字列p0
と文字列p1
を連結した新しい文字列が返されます。
上記の関数の概要と使用例を以下の表に示します。
関数 |
例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
数学関数¶
数学関数として round
、 floor
、 ceiling
の 3 つがあります。それぞれにパラメータとして Double
型または Decimal
型の値を指定でき、そのパラメータと同じ型の戻り値が返されます。
関数 |
例 |
---|---|
round |
|
floor |
|
ceiling |
|
日付関数¶
関数 |
例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
投影: $select¶
$select
システムクエリオプションを指定すると、明示的に要求したプロパティのみが返されます。 $select
式には、プロパティのカンマ区切りリストまたはアスタリスク演算子 (*
) を指定できます。アスタリスク演算子を使用すると、すべてのプロパティが取得されます。
例:
/denodo-odata.svc/movies/actor?$select=actor_id,first_name,last_name
応答:
{
"@odata.context":"/denodo-odata.svc/movies/$metadata#actor(actor_id,first_name,last_name)",
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS"
},
...
]
}
例:
/denodo-odata.svc/movies/actor?$select=*
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor(*)",
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS",
"last_update": "2006-02-15T11:34:33Z"
},
...
]
}
注釈
$select
式では複合プロパティを指定できます。
denodo-odata.svc/admin/struct_table_film?$select=film_data/title
応答:
{
"@odata.context":"/denodo-odata.svc/admin/$metadata
#struct_table_film(film_data/title)",
"value": [
{
"@odata.id": "/denodo-odata.svc/admin/struct_table_film(1)",
"film_data": {
"title": "ACADEMY DINOSAUR"
}
...
}
...
]
}
結果の並べ替え: $orderby¶
$orderby
クエリパラメータは、アイテムが返される順序を指定します。
/denodo-odata.svc/<database name>/collectionName?$orderby=attribute [asc|desc]
コレクションを並べ替えるには、リソースパスでエントリのコレクションを指定する必要があります。指定しないと、このオプションを使用できません。
キーワードの asc
と desc
は、並べ替えの方向 (それぞれ昇順と降順) を指定します。 asc
も desc
も指定していない場合、アイテムは昇順で返されます。昇順の場合、Null 値は Null 以外の値よりも前に置かれ、降順の場合はその逆の順序になります。
複数の属性を基準として並べ替えることもできます。
/denodo-odata.svc/<database name>/collectionName?$orderby=attribute1 [asc|desc],attribute2 [asc|desc]
例:
/denodo-odata.svc/movies/address?$orderby=zip,client_identifier desc
一部の RDMBS (Oracle など) の場合、 null
値の順序付けは、OData 仕様で定義されている方法と逆の方法で行われます。つまり、OData 仕様での null
値は ASC
配列では最初に配置し、 DESC
配列では最後に配置する必要がありますが、一部の RDMBS ではその逆もあります。
OData 仕様の定義で順序付けを行うようにするには、 {<DENODO_HOME>}/resources/apache-tomcat/webapps/denodo-odata4-service/WEB-INF/classes/configuration.properties
ファイルを開き、 forceSpecNullOrdering
プロパティを true
に設定します。
パラメータの別名¶
パラメータの別名は、 @
記号を接頭辞とする識別子です。クエリの式に使用することで、同じリテラルを何回も記述する必要がなくなる、長いリテラルを読みやすい位置に記述できるなどの利点があります。
例:
/denodo-odata.svc/movies/film?$filter=contains(title,@p1) and not contains(description,@p1)&@p1='ACADEMY DINOSAUR'
結果の最大数の指定: $top¶
$top
オプションを使用すると、コレクションの先頭から n
件のエントリを選択できます。 n
は負数ではない整数です。
/denodo-odata.svc/<database name>/collectionName?$top=n
例:
/denodo-odata.svc/movies/actor?$top=1
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS",
"last_update": "2006-02-15T11:34:33Z"
}
]
}
オフセットの指定: $skip¶
$skip
オプションを使用すると、コレクションの先頭から n
件のエントリが応答に表示されません。 n
は負数ではない整数です。
denodo-odata.svc/<database name>/collectionName?$skip=n
例:
/denodo-odata.svc/movies/actor?$skip=199
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
"value": [
{
"actor_id": 200,
"first_name": "THORA",
"last_name": "TEMPLE",
"last_update": "2006-02-15T11:34:33Z"
}
]
}
結果の総数の要求: $count¶
$count
システムクエリオプションを指定すると、応答で返されるアイテムの数が結果と共に返されます。
以前の構文 $inlinecount=allpages
が、OData 4 では短縮されて $count=true
になっています。
$count
システムクエリオプションでは、 $top
、 $skip
、および $expand
の各クエリオプションが無視され、指定した $filter
に一致する結果のみで構成されたページのすべてにわたり、そこに存在する結果の総数が返されます。
例:
/denodo-odata.svc/movies/actor?$count=true
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
"@odata.count": 200,
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS",
"last_update": "2006-02-15T11:34:33Z"
},
...
]
}
例:
/denodo-odata.svc/movies/actor?$count=true&$filter=actor_id eq 1
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
"@odata.count": 1,
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS",
"last_update": "2006-02-15T11:34:33Z"
}
]
}
例:
/denodo-odata.svc/movies/actor?$count=false
応答:
$count
オプションを指定していないリクエストと同じ actor データ:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
"value": [
{
"actor_id": 1,
"first_name": "PENELOPE",
"last_name": "GUINESS",
"last_update": "2006-02-15T11:34:33Z"
},
...
]
}
ラムダ演算子: any¶
OData では、 ラムダ演算子
というコレクションで Boolean 式を評価する演算子を定義しています。ラムダ演算子の引数は、後ろにコロン (:) が付いたラムダ変数名と、ナビゲーションパスで識別される関連エンティティのプロパティを指すラムダ変数名を使用する Boolean 式です。
any 演算子は、Boolean 式をコレクションの各メンバーに適用し、その式がコレクションのいずれかのメンバーに当てはまる場合に true
を返し、それ以外の場合は false
を返します。
/denodo-odata.svc/<DBNAME>/collectionName?$filter=relatedEntity/any(f:f/relatedEntityField <OPERATION> <VALUE>)
/denodo-odata.svc/<DBNAME>/collectionName?$filter=relatedEntity/any(f:f/relatedEntityField <OPERATION> <VALUE>)
例:
/denodo-odata.svc/country?$filter=city/any(f:f/city_id eq 2)
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#country",
"value": [
{
"country_id": 82,
"country": "Saudi Arabia",
"last_update": "2006-02-15T02:44:00Z"
}
]
}
例:
/denodo-odata.svc/country?$filter=country_id eq 87&$expand=city($filter=address_sakila/any(f:f/address_id eq 56))
応答:
{
"@odata.context": "/denodo-odata.svc/movies/$metadata#country(city())",
"value": [
{
"country_id": 87,
"country": "Spain",
"last_update": "2006-02-15T02:44:00Z",
"city": [
{
"city_id": 1,
"city": "A Coruna (La Coruna)",
"country_id": 87,
"last_update": "2006-02-15T02:45:25Z"
}
]
}
]
}
なお、Denodo OData サービスでは、 All
演算子はサポートされていません。
システムクエリオプション: $apply¶
集計動作は、$apply クエリオプションを使用してトリガーされます。連続的に適用されるよう、スラッシュで区切って指定された一連の変換が実行されます。
Denodo OData Service では、groupby 変換の 簡単なグループ 機能が、クエリ対象のエンティティ上で定義されたフィールドに対してのみサポートされます。ナビゲーションフィールドのグループ化は、このマニュアルの「制限事項」のセクションで説明するとおり、サポートされていません。
また、このサービスは aggregate
と min
、 max
、 sum
、 average
の集計関数もサポートしています。
どちらの変換も、以下の例に示すように、単独でも、組み合わせても使用できます。
groupby
/denodo-odata.svc/database/film?$apply=groupby((release_year,rating))
応答:
{
"@odata.context": "http://localhost:9090/denodo-odata4-service/denodo-odata.svc/database/$metadata#film(release_year,rating)",
"value": [
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "G"
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "PG"
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "PG-13"
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "R"
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "NC-17"
}
]
}
aggregate
/denodo-odata.svc/database/payment?$apply=aggregate(amount with max as max_amount,amount with min as min_amount,amount with average as avg_amount,amount with sum as sum_amount)
応答:
{
"@odata.context": "http://localhost:9090/denodo-odata4-service/denodo-odata.svc/database/$metadata#payment(amount)",
"value": [
{
"@odata.id": null,
"max_amount": 11.99,
"min_amount": 0.00,
"avg_amount": 4.200667,
"sum_amount": 67416.51
}
]
}
groupby
とaggregate
/denodo-odata.svc/database/film?$filter=rental_duration eq 6&$orderby=rating desc&$apply=groupby((release_year,rating),aggregate(length with average as avg_length,rental_duration with average as avg_rental_duration))&$top=4
応答:
{
"@odata.context": "http://localhost:9090/denodo-odata4-service/denodo-odata.svc/database/$metadata#film(release_year,rental_duration,length,rating)",
"value": [
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "R",
"avg_length": 127.1852,
"avg_rental_duration": 6.0
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "PG-13",
"avg_length": 118.52,
"avg_rental_duration": 6.0
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "PG",
"avg_length": 104.8205,
"avg_rental_duration": 6.0
},
{
"@odata.id": null,
"release_year": "2006-01-01",
"rating": "NC-17",
"avg_length": 111.7895,
"avg_rental_duration": 6.0
}
]
}