Dataweave 2.0 Operations in Mule

Author: Abhinav Patel

What do we mean by dataweave?

Weaving in itself is an action to make a pattern using some elements. Weaving a cloth will involve creating the pattern of passing threads at right angle to one another. 

Dataweave is a tool provided by mulesoft to create a desirable data format from given input data.There are various functionality that dataweave supports:

  1. Mapping
  2. SQL operations 
  3. Message streaming
  4. Custom Function requirement

Dataweave scripts have two different sections:

  1. Header : contains of the metadata that could be further utilized in body
  2. Body : this consists of all the operations required for generation of desirable output.

         These are separated b y “—”

For the entire dataweave tutorial we will be using the input mentioned below: 

Input payload:

Let’s give it a try: 


Dataweave Expression (read the note for functional requirement)

Expected Output
** To get json output **
%dw 2.0
output application/json

Payload

Note: – In this example we are just trying to convert the XML input to json output.
{
 “users”: {
   “user”: {
     “name”: “Alex Jordan”,
     “age”: “32”
   },
   “user”: {
     “name”: “Alexa Jordan”,
     “age”: “24”
   },
   “user”: {
     “name”: “Ale Jordan”,
     “age”: “25”
   },
   “admin”: {
     “name”: “Alexix Jordan”,
     “age”: “26”
   }
 }
}
** For removing null values **
%dw 2.0
output application/json
skipNullOn = ‘everywhere’

payload.users.*user


Note:-  For a given scenario if we need to fetch the details of all the user from given input
[
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 },
 {
   “name”: “Alexa Jordan”,
   “age”: “24”
 },
 {
   “name”: “Ale Jordan”,
   “age”: “25”
 }
]
** to sort user according to age (doesn’t work for null values) **
%dw 2.0
output application/json
skipNullOn = “everywhere”

payload.users.*user orderBy($.age)

Note:- If we need to fetch the details of all the users sorted based on their age from youngest to oldest
[
 {
   “name”: “Alexa Jordan”,
   “age”: “24”
 },
 {
   “name”: “Ale Jordan”,
   “age”: “25”
 },
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 }
]
** to sort user according to age in descending order (doesn’t work for null values) **
%dw 2.0
output application/json
skipNullOn = “everywhere”

payload.users.*user orderBy(-$.age)


Note:- If we need to fetch the details of all the users sorted based on their age from oldest to youngest 
[
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 },
 {
   “name”: “Ale Jordan”,
   “age”: “25”
 },
 {
   “name”: “Alexa Jordan”,
   “age”: “24”
 }
]
** to use sizeOf function with nested sorted function **
%dw 2.0
output application/json
skipNullOn = “everywhere”

payload.users.*user orderBy(sizeOf($.name))


Note:-  if we need to sort the details of all the users based on the length of their name
[
 {
   “name”: “Ale Jordan”,
   “age”: “25”
 },
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 },
 {
   “name”: “Alexa Jordan”,
   “age”: “24”
 }
]
** use of splitBy function**
%dw 2.0
output application/json
skipNullOn = “everywhere”

payload.users.*user orderBy(sizeOf($.name splitBy(” “)[0]))

Note:-  if we need to sort the details of all the users based on the length of their first name
[
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 },
 {
   “name”: “Alexa Jordan”,
   “age”: “24”
 },
 {
   “name”: “Ale Jordan”,
   “age”: “25”
 }
]
** Use of if-else Condition **
%dw 2.0
output application/json

payload.users.*user map(a,b) ->
if (a.age <= 25)
{ response : “You age is less than or equal to 25” }
else { response : “Your age is greater than 25” }

Note:- If we need to define different operation based on age 
[
 {
   “response”: “Your age is greater than 25”
 },
 {
   “response”: “You age is less than or equal to 25”
 },
 {
   “response”: “You age is less than or equal to 25”
 }
]
** Matches exact value for string**
%dw 2.0
output application/json

payload.users.*user map(a,b) ->
if (matches(a.name, /Alex Jordan/))
{ response : “Welcome admin” }
else { response : “You do not have admin privileges” }


Note:- Lets say we need to write logic based on some regex pattern

[
 {
   “response”: “Welcome admin”
 },
 {
   “response”: “You do not have admin privileges”
 },
 {
   “response”: “You do not have admin privileges”
 }
]
** Function Call **
%dw 2.0
output application/json
fun UpperCase(input_value) = upper(input_value)

payload.users.*user map(a,b) ->
name : UpperCase(a.name)

Note:- If we have to create a function that change the case of the input string provide
[
 {
   “name”: “ALEX JORDAN”
 },
 {
   “name”: “ALEXA JORDAN”
 },
 {
   “name”: “ALE JORDAN”
 }
]
**Example of pluck**
%dw 2.0
output application/json

payload.users.*user map(a,b) ->
  a pluck ($$ ++ ” is ” ++ $)

Note:- for a give requirement we need to return back message the is composed of the attribute and its value
[
 [
   “name is Alex Jordan”,
   “age is 32”
 ],
 [
   “name is Alexa Jordan”,
   “age is 24”
 ],
 [
   “name is Ale Jordan”,
   “age is 25”
 ]
]
**Example of filter **
%dw 2.0
output application/json

payload.users.*user filter(a,b)->(a.age > 25)

Note:- If we have to retrieve all the records of user whose age is greater than 25
[
 {
   “name”: “Alex Jordan”,
   “age”: “32”
 }
]
**Example of Reduce**
%dw 2.0
output application/json

(payload.users.*user.age reduce ((val, initial_value = 0) -> initial_value + val)  )/3


Note:- If we need to retrieve the average age of the user .
 
27.0
 

 

If you have reached this point and understood the operations discussed above then lets try some basic exercise for self-evaluation.

Requirement: Write a dataweave scriptthat accepts a 2-digit number >20 and prints the table of that number

Expected Output (for input value 21):

[ “21 * 0 = 21”, 
“21 * 1 = 42”,
 “21 * 2 = 63”, 
“21 * 3 = 84”, 
“21 * 4 = 105”, 
“21 * 5 = 126”, 
“21 * 6 = 147”,
 “21 * 7 = 168”, 
“21 * 8 = 189”, 
“21 * 9 = 210”]

Wrapping up:

With dataweave your imagination is the only limit. This article just deals with basic dataweave operations and their real life implementation. 

For mule such articles on MuleSoft continue reading the blogs by Apisero.

We use cookies on this site to enhance your user experience. For a complete overview of how we use cookies, please see our privacy policy.