ASTERIA Warp Core/Core+でサブフロー処理を考える

## はじめに
ASTERIA Warp Standard Edition/Enterprise Editionで利用できる「サブフロー呼び出し」機能は構築で非常に役立つ機能です。下位EditionのCore/Core+では残念ながらサブフロー呼び出しが行えません。どうしてもサブフロー的に共通処理呼び出しがしたい！という場合もあると思います。万が一の時に使用できるかもしれないCore/Core+でのサブフロー的な呼び出し方法を紹介します。

## 事前知識
ASTERIA Warpはエラー処理に優れており、処理フローに対しエラー処理を別個に用意しException処理を独立させる事が可能です。通常は各フローのプロパティーの「汎用エラー処理」に専用エラー処理を設定されている事でしょう。
それ以外のエラー処理として、エラーが発生するコンポーネントではそのエラーに対応するエラー処理として別フローを指定する事が可能です。そしてそれがCore/Core+で別フローを起動する唯一の方法です。
エラー処理として呼び出しされるフローで通常のサブフローとは異なる呼び出し方がされます。エラー処理の詳細は、ADNの[エラー処理を設定するには](https://support.asteria.com/hc/ja/articles/115000350888)を参照してください。

エラー処理として呼び出されたフローは
1. エラーが発生したコンポーネントの入力ストリームが渡される
1. エラーが発生したフローのフロー変数と同名の公開フロー変数に値が渡される
1. 発生したエラーがパラメータを持つエラーの場合、システム変数にパラメータ値として渡される。
1. ExceptionReturnにより呼び出し元フローに戻る事ができ、その際にストリームを返却する事ができる

となっています。
Subflowコンポーネントの変わりに、このエラー処理を利用します。

### メインフロー
このフローは受け渡された内容、戻ってきた内容を確認するためだけのものですが、エラー処理の起点となるのはFileGetコンポーネントのみでこのコンポーネントのエラー処理にサブフローを指定する事で疑似的なサブフロー呼び出しを行います。

![12-Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680444/eaac5bcc-2913-8b4d-4f74-42ccc3e5c1b5.jpeg)

#### フロー変数
|フロー変数 | データ型 | 初期値 | 公開
|-----------|-----------|-----------|---|
| 受け渡し変数1 | String | |しない
| 受け渡し変数2 | integer| |しない

【処理概要】
1. 受け渡し情報の準備
1. サブフロー呼び出し
1. 戻りストリームの処理

サブフローの呼び出しは「FileGet」で行います。

### 受け渡し準備
サブフローに渡すストリーム、変数の準備を行っています。

VelocityでCSVを指定していますが、これは何でも構いません。エラーが発生するFileGetの入力にわたすため、Mapperは「入力をそのまま出力」をはいとしています。

#### ストリーム型(CSV)
|フィールド名 | データ型 |
|-----------|-----------|
| メインカラム1 | String |
| メインカラム2 | Integer |

[FileGet](https://help.asteria.com/documentation/warp/ja/current/flow/designer/reference/component/FileSystem(Get).html)のエラーは、「汎用」と「ファイルが存在しない」があり、それぞれパラメータ「FilePath」があり、エラー発生時のファイルパスの値が受け渡せます。こちらもサブフローに値として渡せるフィールドととる事が出来ますので、この例では値を設定しています。また、サブフロー側の公開変数と同名の変数も同様に値渡しできますので、こちらにも値を事前に設定をしています。

![12-Mapper1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680444/54e3046b-2e43-70ed-ed67-000c8b2fbb9f.jpeg)

#### レイヤー
| レイヤー名 | レイヤー条件 |
|-----------|-----------|
| 移送      | なし      |


### サブフロー呼び出し
エラーを発生させるコンポーネントはエラーがあれば何でも良いですがリソースを消費せずエラーパラメータのあるFileGetを選択します。このコンポーネントはファイルパスに指定したファイルがない場合にエラーを発生しますので、呼び出すエラーは、「ファイルが存在しない」とします。FileGetのエラー処理の「ファイルが存在しない」にサブフローを指定します。（当然そのファイルパスで指定した名前のファイルがあってはいけません）
ファイルを読み込みしないこのFileGetに指定するストリームは何で設定するか、という事になりますが、エラーで戻ってくるストリームがある場合、その戻りストリームに合わせてストリームを設定します。そうしなければ、戻りストリームを利用する事が出来ません。戻りストリームが必要ないのであればなんでも構いませんが、この方法では通常のサブフロー呼び出しの様に直接戻り値が受け取れません。そのため処理結果などの判定のためのストリーム（PerameterListなど）を設定しても良いでしょう。
今回のサブフローでは、CSV形式で４つのカラムで戻ってきますので、そのストリームを設定しておきます。


:::note ExceptionReturnの戻り値につてい
ExceptionReturn戻り値は、通常のサブフローとは異なりそのままでは戻り値にアクセスできません。エラーフロー側で設定した戻り値は、メインフローに戻った際、エラーメッセージに格納されますがシステム変数からはアクセスできません。通常のサブフロー呼び出しの様に戻り値による処理分岐をする場合は、BranchByExceptionを使用し一旦エラーメッセージ（戻り値）を取得しその値により分岐を行います。

[ヘルプ：ExceptionReturn ](https://help.asteria.com/documentation/warp/ja/current/flow/designer/reference/component/ExceptionReturn.html)
:::


#### ストリーム型(CSV)
|フィールド名 | データ型 |
|-----------|-----------|
| field1 | String |
| field2 | String |
| field3 | String |
| field4 | String |

ここで注意が必要なのは、戻ってきたストリームはエラー側で指定されたストリームで定義されたものであり、メイン側で定義されるストリームはあくまで次のMapperで値にアクセスするためのものです。そのため戻り側で設定しているカラム名ではなくFileGet側で設定したカラム名になりますが、中身は戻ってきたストリームの値となります。このあたりは実際に実行してみて動作内容を確認する必要があります。

### 戻りストリームの処理
このMapperでは戻りのストリームをレコード型のストリームにマッピングしています。戻りストリームが利用可能であることを示すためのものです。

![12-Mapper2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680444/10109bcd-780c-db23-880c-8600fd7bba3f.jpeg)

#### レイヤー
| レイヤー名 | レイヤー条件 |
|-----------|-----------|
| 移送      | なし      |

## サブフロー
今回のサブフローは受け渡されたデータをCSV型にして戻す処理としています。
入力ストリームはCSVストリームで、メインフローのFileGetに入力されたストリームと同じものです。フロー変数は受け渡されるフロー変数を公開で設定しておきます。
戻りストリームは受け渡された情報を加工しCSV型で戻します。



### 処理フロー
![13-Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680444/5b7c5e1c-d24c-ec0c-305e-0319661ab177.jpeg)

【処理概要】
1. ストリームをテキストに変換
1. 戻りストリームの成型
1. ExceptionReturnでストリームを戻し、次のコンポーネントに移動させる

#### 入力ストリーム（CSV）
|フィールド名 | データ型 |
|-----------|-----------|
| 受け渡されたストリームカラム1 | String |
| 受け渡されたストリームカラム2 | String |

#### フロー変数
|フロー変数 | データ型 | 初期値 | 公開
|-----------|-----------|-----------|---|
| 受け渡し変数1 | String | |する
| 受け渡し変数2 | integer| |する


### 戻りストリームの成型
入力ストリームをテキスト可したもの、受け渡し変数の１と２、システム変数でエラーパラメータとして指定された値をEmbedで加工して項目に設定しています。

![13-Mapper1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680444/167cfa85-3a8a-d413-69e0-0549f0b5a984.jpeg)

#### レイヤー
| レイヤー名 | レイヤー条件 |
|-----------|-----------|
| 移送      | なし      |

## 最後に
本来であればこのエラー処理はこの様な呼び出し方を行う事はありません。ですが、この処理が、「FileGetの読み込みファイルが存在しない場合にそのファイルをDBから取得し生成する処理」などの形であればどうでしょうか？実際の構築の対象にはなると思います。少しイレギュラーな形での紹介となりましたが、エラー処理フローの利用方法を一度検証しておけば、Core/Core+でのサブフロー的構築が１つの解決方法として役立つのではと思います。