USER MANUALS

高度なクエリの実行

OData では、高度なリクエストを作成できるように以下のクエリオプションを定義しています。

  • $filter

  • $select

  • $orderby

  • $expand

選択: $filter

$filter システムクエリオプションを使用した URI は、 $filter 述語式を満たすコレクションのエンティティの一部を特定します。

式ではプロパティとリテラルを参照できます。リテラルには、文字列 (一重引用符で囲んで記述)、 null リテラル、数値、または boolean 値を使用できます。

このサービスでは、以下の演算と関数をサポートしています。

演算子

演算子

説明

eq

等しい

/actor?$filter=first_name eq 'GRACE'

ne

等しくない

/actor?$filter=first_name ne 'GRACE'

gt

より大きい

/actor?$filter=actor_id gt 5

ge

以上

/actor?$filter=actor_id ge 5

lt

より小さい

/actor?$filter=actor_id lt 10

le

以下

/actor?$filter=actor_id le 10

in

メンバーである

/actor?$filter=actor_id in (1,2,3)

and

論理積

/actor?$filter=actor_id gt 5 and actor_id lt 10

or

論理和

/actor?$filter=actor_id lt 5 or first_name eq 'GRACE'

not

論理否定

/actor?$filter=not (actor_id eq 1)

add

加算

/film?$filter=length add 30 gt 180

sub

減算

/film?$filter=length sub 30 gt 120

mul

乗算

/film?$filter=length mul 2 ge 300

div

除算

/film?$filter=length div 3 eq 60

mod

剰余

/film?$filter=length mod 10 eq 8

()

優先順位グループ

/actor?$filter=actor_id lt 7 and (first_name eq 'NICK' or actor_id gt 3)

文字列関数

文字列演算では、以下の各関数を使用できます。

  • 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 を連結した新しい文字列が返されます。

上記の関数の概要と使用例を以下の表に示します。

関数

bool contains(string p0, string p1)

/actor?$filter=contains(first_name, 'LO')

bool startswith(string p0, string p1)

/actor?$filter=startswith(first_name, 'JO')

bool endswith(string p0, string p1)

/actor?$filter=endswith(first_name,'ER')

int indexof(string p0, string p1)

/actor?$filter=indexof(last_name, 'LO') eq 3

int length(string p0)

/actor?$filter=length(first_name) eq 4

string substring(string p0, int pos)

/actor?$filter=substring(first_name, 2) eq 'RO'

string substring(string p0, int pos, int length)

/actor?$filter=substring(first_name, 2,3) eq 'TTH'

string tolower(string p0)

/actor?$filter=tolower(first_name) eq 'nick'

string toupper(string p0)

/actor?$filter=toupper(first_name) eq 'NICK'

string trim(string p0)

/actor?$filter=trim(first_name) eq 'JENNIFER'

string concat(string p0, string p1)

/actor?$filter=concat( concat(first_name,', '), last_name)  eq 'JENNIFER, DAVIS'

数学関数

数学関数として roundfloorceiling の 3 つがあります。それぞれにパラメータとして Double 型または Decimal 型の値を指定でき、そのパラメータと同じ型の戻り値が返されます。

関数

round

/film?$filter=round(replacement_cost) eq 21

floor

/film?$filter=floor(replacement_cost) eq 20

ceiling

/film?$filter=ceiling(replacement_cost) eq 21

日付関数

関数

int year(DateTimeOffset p0) int year(Date p0)

/actor?$filter=year(last_update) eq 2016

int month(DateTimeOffset p0) int month(Date p0)

/actor?$filter=month(last_update) eq 12

int day(DateTimeOffset p0) int day(Date p0)

/actor?$filter=day(last_update) eq 31

int hour(DateTimeOffset p0) int hour(TimeOfDay p0)

/actor?$filter=hour(last_update) eq 3

int minute(DateTimeOffset p0) int minute(TimeOfDay p0)

/actor?$filter=minute(last_update) eq 34

int second(DateTimeOffset p0) int second(TimeOfDay p0)

/actor?$filter=second(last_update) eq 33

DateTimeOffset now()

/actor?$filter=last_update lt now()

Date date(DateTimeOffset p0)

/actor?$filter=last_update lt date(now())

投影: $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]

コレクションを並べ替えるには、リソースパスでエントリのコレクションを指定する必要があります。指定しないと、このオプションを使用できません。

キーワードの ascdesc は、並べ替えの方向 (それぞれ昇順と降順) を指定します。 ascdesc も指定していない場合、アイテムは昇順で返されます。昇順の場合、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 変換の 簡単なグループ 機能が、クエリ対象のエンティティ上で定義されたフィールドに対してのみサポートされます。ナビゲーションフィールドのグループ化は、このマニュアルの「制限事項」のセクションで説明するとおり、サポートされていません。

また、このサービスは aggregateminmaxsumaverage の集計関数もサポートしています。

どちらの変換も、以下の例に示すように、単独でも、組み合わせても使用できます。

  • 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
        }
    ]
}
  • groupbyaggregate

/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
        }
    ]
}
Add feedback