DataWeaveを使いこなす その5

DataWeaveを使いこなしてみよう第5弾。今回は関数を絡めた実装方法となります。

スポンサーリンク

使い方

関数を定義して呼び出し

TransformMessageなどのDataWeave内で関数を定義し、その場で呼び出す方法です、まずは、関数の定義としては、以下のようにfunキーワードを使って定義します。

fun 関数名(引数1, 引数2, ...) = コード

前回使用した野菜を種類別に表示させる関数を例として記載してみましょう。JSON内で記載しているif文関数化しないで書くの以下のような記載になりますが。

%dw 2.0
output application/json
var vegetableData = [
	{
		"vegetable" : "大根",
		"kind" : 1
	},
	{
		"vegetable" : "キャベツ",
		"kind" : 2
	},
	{
		"vegetable" : "トマト",
		"kind" : 3
	}
]
---
vegetableData map(value, index) ->(
{
	"vegetable": value.vegetable,
	"kindName": if(value.kind == 1) "根菜類" 
		else if(value.kind == 2) "葉茎菜類" 
		else if(value.kind == 3) "果菜類" 
		else "その他"
})

kindNameのところ、vegetableKindという関数を定義して記載すると以下のような書き方になります。

%dw 2.0
output application/json
var vegetableData = [
	{
		"vegetable" : "大根",
		"kind" : 1
	},
	{
		"vegetable" : "キャベツ",
		"kind" : 2
	},
	{
		"vegetable" : "トマト",
		"kind" : 3
	}
]
fun vegetableKind(kind) = if(kind == 1) "根菜類" 
		else if(kind == 2) "葉茎菜類" 
		else if(kind == 3) "果菜類" 
		else "その他"
---
vegetableData map(value, index) ->(
{
	"vegetable": value.vegetable,
	"kindName": vegetableKind(value.kind)
})

関数を定義することにより、コードの再利用化や可読性が増すことになるのでより一層使いやすくなるのではないかと思います。

モジュールを使用した関数呼び出し

関数を自前で作らなくてもDataWeaveには様々なモジュールが提供されています。これらのモジュールを使用することで、変換処理や計算処理を効率化することができます。

使い方はDataWeave本文に使用したいモジュールをインポートします。Javaのimport文と似たような記載ですね。

import 使用したい関数1,使用したい関数2,... from 使用したいモジュール

後は、モジュール内で定義されている関数を使用することができますので、使用したい箇所で関数を呼び出します。

今回はdw::core::Datesというモジュールのdateという関数を使って年月日から日付を作成する関数を使ってみましょう。赤字の部分がインポートしたモジュールとそれを使用した関数になります。

%dw 2.0
import date from dw::core::Dates
output application/json
var vegetableData = [
	{
		"vegetable" : "大根",
		"kind" : 1,
		"expiryDateYear" : 2023,
		"expiryDateMonth" : 7,
		"expiryDateDay" : 31
	},
	{
		"vegetable" : "キャベツ",
		"kind" : 2,
		"expiryDateYear" : 2023,
		"expiryDateMonth" : 7,
		"expiryDateDay" : 25
	},
	{
		"vegetable" : "トマト",
		"kind" : 3,
		"expiryDateYear" : 2023,
		"expiryDateMonth" : 7,
		"expiryDateDay" : 27
	}
]
fun vegetableKind(kind) = if(kind == 1) "根菜類" 
		else if(kind == 2) "葉茎菜類" 
		else if(kind == 3) "果菜類" 
		else "その他"
---
vegetableData map(value, index) ->(
{
	"vegetable": value.vegetable,
	"kindName": vegetableKind(value.kind),
	"expiryDate": date({year: value.expiryDateYear, month: value.expiryDateMonth, day: value.expiryDateDay})
})

この状態で実行すると、年月日がきっちり日付形式で表示されます。

[
  {
    "vegetable": "大根",
    "kindName": "根菜類",
    "expiryDate": "2023-07-31"
  },
  {
    "vegetable": "キャベツ",
    "kindName": "葉茎菜類",
    "expiryDate": "2023-07-25"
  },
  {
    "vegetable": "トマト",
    "kindName": "果菜類",
    "expiryDate": "2023-07-27"
  }
]

どのモジュールにどういった関数があるかは、DataWeaveのリファレンスを参考にしてください。

ここでご紹介した他にもJavaでクラスやメソッドを作成し、コールする方法もあります。変換がより複雑なロジックについてはJavaと絡めて使うとよりDataWeaveがごちゃらずに実装できるかと思います。

MuleSoft
スポンサーリンク

コメント