[BigQuery API(V2)] Javaでデータセットのルーティン情報を取得する

BigQuery API V2(Java)を使用して、
BigQueryデータセットのルーティンの情報を取得する方法
についてご紹介します。

**ルーティンとは**
処理を事前に定義しておいて、後から呼び出せるようにしておくためのコンポーネントです。
BigQueryでは、以下のリソースをルーティンと定義付けています。
|リソース|概要|
|---|---|
|リモート関数を含むユーザー定義関数（UDF）|SQL または JavaScript で記述するステートメント群|
|ストアドプロシージャ|SQLで記述するステートメント群|
|テーブル関数(TVF)|戻り値にテーブルを返すユーザー定義関数|

データセットのルーティン情報を取得するには、
データセットに対し適切なIAM権限が付与されている必要があります。

権限付与に関しては
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(2.権限付与)](https://qiita.com/doran/items/8b7ba29672527426e88d#2-権限付与)
を参照ください。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[BigQuery API(V2)] JavaでBigQueryを使う](https://qiita.com/doran/items/8b7ba29672527426e88d)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[ルーティン一覧を取得](#1-ルーティン一覧を取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[ルーティンを取得](#2-ルーティンを取得)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. ルーティン一覧を取得
指定したデータセットのルーティン一覧を取得します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.CLOUD_PLATFORM_READ_ONLY
https://www.googleapis.com/auth/bigquery.readonly
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Routines routines = bigquery.routines();
    
    Bigquery.Routines.List list = routines.list("プロジェクトID","データセットID");
    
    ListRoutinesResponse res = list.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/routines
が実行されます。

#### 1.2.2. クエリパラメータ
Bigquery.Routines.Listのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setMaxResults|Integer|結果の最大数|
|setPageToken|String|取得するページトークン|
|setReadMask|String|取得するフィールド名(カンマ区切り)<br><br>指定がない場合は、下記フィールドのみ取得<br>etag、projectId、datasetId、routineId、routineType、creationTime、lastModifiedTime、language、remoteFunctionOptions|
|setFilter|String|フィルタに一致するルーティンのみ取得<br><br>指定する形式："routineType:[RoutineType(enum)](#routinetype)"|

### 1.3. レスポンスの内容
#### ListRoutinesResponse
|メソッド|戻り値|説明|
|---|---|---|
|getNextPageToken|String|次のページトークン|
|getRoutines|List\<[Routine](#routine)\>|データセット内のルーティンリスト

#### Routine
|メソッド|戻り値|説明|
|---|---|---|
|getEtag|String|ハッシュ値|
|getRoutineReference|[RoutineReference](#routinereference)|ルーティンのリファレンス|
|getRoutineType|[RoutineType(enum)](#routinetype)|ルーティンの種類|
|getCreationTime|Long|ルーティンが作成された時刻(ミリ秒)|
|getLastModifiedTime|Long|ルーティンが最後に変更された時刻(ミリ秒)|
|getLanguage|[Language(enum)](#language)|ルーティンの言語|
|getArguments|List\<[Argument](#argument)\>|引数情報|
|getReturnType|[StandardSqlDataType](#standardsqldatatype)|ルーティンのデータ型情報|
|getReturnTableType|[StandardSqlTableType](#standardsqltabletype)|ルーティンタイプ情報|
|getImportedLibraries|List\<String\>|インポートされたJavaScriptライブラリのパス|
|getDefinitionBody|String|ルーティンの本体|
|getDescription|String|ルーティンの説明|
|getDeterminismLevel|[DeterminismLevel(enum)](#determinismlevel)|JavaScriptUDFの決定レベル|
|getStrictMode|Boolean|多くの一般的なエラーを検出するか|
|getRemoteFunctionOptions|[RemoteFunctionOptions](#remotefunctionoptions)|リモート機能固有のオプション|
|getSparkOptions|[SparkOptions](#sparkoptions)|Spark固有のオプション|
|getDataGovernanceType|[DataGovernanceType(enum)](#datagovernancetype)|データガバナンスタイプ|

#### RoutineReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|
|getDatasetId|String|データセットID|
|getRoutineId|String|ルーティンID|

#### Argument
|メソッド|戻り値|説明|
|---|---|---|
|getName|String|引数の名前|
|getArgumentKind|[ArgumentKind(enum)](#argumentkind)|引数の種類|
|getMode|[Mode(enum)](#mode)|引数の入出力モード|
|getDataType|[StandardSqlDataType](#standardsqldatatype)|引数のデータ型情報|

#### StandardSqlTableType
|メソッド|戻り値|説明|
|---|---|---|
|getColumns|List\<[StandardSqlField](#standardsqlfield)\>|このテーブルの列の種類|

#### RemoteFunctionOptions
|メソッド|戻り値|説明|
|---|---|---|
|getEndpoint|String|ユーザー提供のリモートサービスのエンドポイント|
|getConnection|String|リモートサービスにリクエストを送信するための認証情報を保持するユーザー指定の接続オブジェクトの完全修飾名|
|getUserDefinedContext|Map\<String,String\>|ユーザー定義コンテキスト|
|getMaxBatchingRows|Long|リモートサービスに送信される各バッチの最大行数|

#### SparkOptions
|メソッド|戻り値|説明|
|---|---|---|
|getConnection|String|Spark接続オブジェクトの完全修飾名|
|getRuntimeVersion|String|ランタイムバージョン|
|getContainerImage|String|ランタイム環境のカスタムコンテナーイメージ|
|getProperties|Map\<String,String\>|構成プロパティ|
|getMainFileUri|String|SparkアプリケーションのメインファイルURI|
|getPyFileUris|List\<String\>|PySparkアプリケーションのPYTHONPATHに配置されるPythonファイル|
|getJarUris|List\<String\>|ドライバーおよびエグゼキューターのCLASSPATHに含めるJARファイル|
|getFileUris|List\<String\>|各エグゼキュータの作業ディレクトリに配置されるファイル|
|getArchiveUris|List\<String\>|各エグゼキュータの作業ディレクトリに抽出されるアーカイブファイル|
|getMainClass|String|jarUris内のクラスの完全修飾名|

#### StandardSqlField
|メソッド|戻り値|説明|
|---|---|---|
|getName|String|名前|
|getType|[StandardSqlDataType](#standardsqldatatype)|パラメータのタイプ|

#### StandardSqlDataType
|メソッド|戻り値|説明|
|---|---|---|
|getTypeKind|[TypeKind(enum)](#typekind)|トップレベルのタイプ|
|getArrayElementType|[StandardSqlDataType](#standardsqldatatype)|【getTypeKind()が"ARRAY"の場合】<br>配列の要素の型|
|getStructType|[StandardSqlStructType](#standardsqlstructtype)|【getTypeKind()が"STRUCT"の場合】<br>構造体のフィールド|

#### StandardSqlStructType
|メソッド|戻り値|説明|
|---|---|---|
|getFields|List\<[StandardSqlField](#standardsqlfield)\>|構造体のフィールド|

#### TypeKind
|定義値|内容|
|---|---|
|TYPE_KIND_UNSPECIFIED|無効なタイプ|
|STRING|文字列|
|BYTES|バイト(base64文字列としてエンコード)|
|INT64|8byte整数(10進数の文字列としてエンコード)|
|NUMERIC|16byte整数(10進数の文字列としてエンコード)|
|BIGNUMERIC|32byte整数(10進数の文字列としてエンコード)|
|BOOL|真偽値|
|FLOAT64|浮動小数点数(数値または文字列「NaN」、「Infinity」、「-Infinity」としてエンコード|
|TIMESTAMP|タイムスタンプ|
|DATE|日付|
|TIME|時間|
|DATETIME|日付時刻|
|GEOGRAPHY|地理空間データ(WKTとしてエンコード)|
|ARRAY|配列型(Type.array_typeと一致するタイプのリストとしてエンコード)|
|STRUCT|構造体型(Type.struct_type[i]型のフィールドを持つリストとしてエンコード)|
|JSON|JSON文字列(tabledata.listが使用)|

#### RoutineType
|定義値|内容|
|---|---|
|ROUTINE_TYPE_UNSPECIFIED|デフォルト値|
|SCALAR_FUNCTION|リモート関数を含むユーザー定義関数（UDF)|
|PROCEDURE|ストアドプロシージャ|
|TABLE_VALUED_FUNCTION|テーブル関数|

#### Language
|定義値|内容|
|---|---|
|LANGUAGE_UNSPECIFIED|デフォルト値|
|SQL|SQL言語|
|JAVASCRIPT|JavaScript言語|
|PYTHON|Python言語|
|JAVA|Java言語|
|SCALA|スカラ言語|

#### ArgumentKind
|定義値|内容|
|---|---|
|ARGUMENT_KIND_UNSPECIFIED|デフォルト値|
|FIXED_TYPE|引数は完全に指定された型の変数|
|ANY_TYPE|引数は構造体や配列を含む任意の型|

#### Mode
|定義値|内容|
|---|---|
|MODE_UNSPECIFIED|デフォルト値|
|IN|引数は入力専用|
|OUT|引数は出力専用|
|INOUT|引数は入力でもあり出力でもある|

#### DeterminismLevel
|定義値|内容|
|---|---|
|DETERMINISM_LEVEL_UNSPECIFIED|未指定|
|DETERMINISTIC|UDFは決定的|
|NOT_DETERMINISTIC|UDFは決定論的ではない|

#### DataGovernanceType
|定義値|内容|
|---|---|
|DATA_GOVERNANCE_TYPE_UNSPECIFIED|未指定|
|DATA_MASKING|データマスキング|

## 2. ルーティンを取得
指定したルーティンのメタデータを取得します。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.CLOUD_PLATFORM_READ_ONLY
https://www.googleapis.com/auth/bigquery.readonly
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
ルーティンIDは、[RoutineReferenceのgetRoutineId()](#routinereference)で取得できる値を使用します。

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Routines routines = bigquery.routines();
    
    Bigquery.Routines.Get get = routines.get("プロジェクトID","データセットID","ルーティンID");
    
    Routine res = get.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
GET:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/routines/{ルーティンID}
が実行されます。

#### 2.2.2. クエリパラメータ
Bigquery.Routines.Getのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setReadMask|String|取得するフィールド名(カンマ区切り)<br>指定がない場合は、全てのフィールドが取得される|

### 2.3. レスポンスの内容
#### Routine
[1.3. レスポンスの内容(Routine)](#routine)と同じです。

<br>
<br>
おしまい。。