【SAPUI5】OData(2) ODataを構成するもの

## はじめに
[前回](https://qiita.com/tami/items/411a226d1ea6bb25b5f1)の記事では、ODataの概要について説明しました。
今回は、ODataを構成する要素（Entity type, Entity setなど）について書きます。

※OData関連の投稿一覧は以下の記事をご参照ください。
[【SAPUI5】OData(1) ODataとは](https://qiita.com/tami/items/411a226d1ea6bb25b5f1)

## ODataの構造
ODataは、データ構造をmetadataとして記述します。
metadataには以下のようなものが含まれます。

|要素  |説明  |
|---|---|
|Entity Type|データの構造を定義したもの。Entityを一意に特定するkeyを持つ。Entity Typeを構成する要素のことをpropertyという|
|Entity|Entity Typeのインスタンス  |
|Entity Set|Entityの集合  |
|Navigation property|Entity同士の関係。カーディナリティを持つ|
|Action|元のデータに変更を加えうる操作  |
|Function|元のデータに変更を加えない操作。たとえばフィルタなど |

ABAPに親しんだ人にとっては、Entity Type=構造の型、Entity Set=内部テーブル、Entity= 内部テーブルの1行と考えるとわかりやすいと思います。

**Entity Type, Entity, Entity Setのイメージ**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/7d054dd9-c711-53c8-1a33-0738cc85f397.png)



## 実際のmetadataを見てみる
metadataを見る際はブラウザに `<サービスURL>/$metadata` と入力します。
試しにTripPin Serviceというサンプルサービスのmetadataを見てみましょう。
https://services.odata.org/TripPinRESTierService/(S(jiypl3wubcokjjg4zf40jtvx))/$metadata

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/7c38c761-1e7e-9974-218b-94039790413c.png)

なんだかびっしり書かれていてわかりづらいですね。
それもそのはず、機械が読めるように記述してあるのですから。
あと、TripPin Serviceで利用可能なインターフェースがすべて書いてあるので、大量になっています。

ここでは、Personに関係する部分について、少し詳しく見てみましょう。
※個々の要素の使い方については私もまだわかっていないので、metadataの構成要素がここにあるなあ、というのを確認する程度です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/1d5e732a-b123-f7a1-4d67-6db042961180.png)

PersonというEntity TypeはUserNameがキーになっています。このほかにFirstName, LastNameなどの属性を持っています。
一番下にNavigation Propertyとして、FriendsとBestFriendへのリンクを持っています。Friendsは友達のリスト、BestFriendは一人だけの親友につながっています。（Tripsについては割愛）

PersonとFriends, BestFriendの関係
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/8ecf6ab9-76fc-1099-8860-f2d4ec9673c1.png)


スクロールダウンすると、GetPersonWithMostFriendsというファンクションがあります。このファンクションはPerson型の1件のデータを返すようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/7ed1fece-e332-c0d9-7691-981b8942df9e.png)
一番下までスクロールすると、EntityContainerというタグがあります。
この中にEntity Setが定義されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/3ef08995-2ecc-3d1b-e643-8b5e0c9f4023.png)
Person型のEntity Setとして、Peopleが定義されています。（複数形になっていることに注意）
PeopleはNavigationPropertyBindingとして、Friends, BestFriendなどを持っています。
その下にFunctionImportとして、上で定義されいてたファンクション"GetPersonWithMostFriends"が載っています。
どうやらファンクションを使えるようにするには、FunctionImportにも記載する必要があるようです。

## ブラウザからEntity Setを取得してみる
実際のデータはどのようになっているのでしょうか。
ブラウザから`<サービスURL>/<Entity Set>`と入力すると、Entity Setの中身を見ることができます。
以下のように入力してみます。
https://services.odata.org/TripPinRESTierService/(S(jiypl3wubcokjjg4zf40jtvx))/People
文字が詰まっていて見づらいですが、Peopleの中身を見ることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/ac36c489-c08a-63b5-62d5-480f64db8c73.png)

2019/1/2追記
Chromeの場合、拡張機能のJSON Formatterを入れると見やすい形で表示されます。
参考：http://www.atmarkit.co.jp/ait/articles/1611/09/news036.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/311c1d34-08b6-239c-8292-81325a3cfd8d.png)



## まとめ

- ODataを構成する要素には、Entity Type, Entity, Entity Set, Navigation propertyなどがある
- どのようなEntityが使えるかは、metadataに記載されている
- metadataは`<サービスURL>$metadata`で見ることができる

##参考
[OData Version 4.0. Part 1: Protocol Plus Errata 03](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html#_Service_Document_Request)

## 関連記事
[OData(1) ODataとは](https://qiita.com/tami/items/411a226d1ea6bb25b5f1)
[OData(3) ODataのQuery optionを使ってみる](https://qiita.com/tami/items/181cabc4cd8c51ce87b2)