Balwant Kumar Singh
Balwant Kumar Singh

Reputation: 1178

Mule- Iterating through a Map in dataweave and skipping duplicate elements

I need to to iterate database query result in dataweave and skip duplicates as well as few elements based on some condition. Say, if vales for a column order is coming like: 10-ord, 11-ord, 12-ord, I should be picking up only 11-ord and skip any other rows which value ends with -ord.

Rest of the values which does not end with -ord should be picked up.

The current code gives distinct element but not the above highlighted condition. The current code is :

payload map ((payload, indexOfPayload) -> {
id: payload.orderId ,
number: payload.orderNumber
}) distinctBy $.number

Upvotes: 0

Views: 9780

Answers (5)

Srinivas
Srinivas

Reputation: 92

You can try both contains or the substring login like [3..5] matching ord and filtering the JSON objects.

Upvotes: 0

RAJ
RAJ

Reputation: 1

%dw 1.0
%var payload = [
    {
    "id":"value",
    "orderNumber": "10-ord"
    },
    {
    "id":"value",
    "orderNumber": "11-ord"
    },
    {
    "id":"value",
    "orderNumber": "11-ord"
    },
    {
    "id":"value",
    "orderNumber": "12-ord"
    },
    {
    "id":"value",
    "orderNumber": "13-ord"
    },
    {
    "id":"value",
    "orderNumber": "26"
    },
    {
    "id":"value",
    "orderNumber": "26"
    }
    ]
%output application/json
---
payload filter (not ($.orderNumber contains '-ord')) or $.orderNumber=='11-ord' map ((payload, indexOfPayload) -> {
    id: payload.id ,
    number: payload.orderNumber
}) distinctBy payload.orderNumber

Upvotes: 0

Abhay
Abhay

Reputation: 324

Using filter, distinctBy and or clause you can achieve it

%dw 1.0
%var payload = [
    {
    "id":"value",
    "orderNumber": "10-ord"
    },
    {
    "id":"value",
    "orderNumber": "11-ord"
    },
    {
    "id":"value",
    "orderNumber": "11-ord"
    },
    {
    "id":"value",
    "orderNumber": "12-ord"
    },
    {
    "id":"value",
    "orderNumber": "13-ord"
    },
    {
    "id":"value",
    "orderNumber": "14"
    },
    {
    "id":"value",
    "orderNumber": "14"
    }
]
%output application/json
---
payload filter (not($.orderNumber contains '-ord')) or $.orderNumber =='11-ord' map ((payload, indexOfPayload) -> {
    id: payload.id ,
    number: payload.orderNumber
}) distinctBy payload.orderNumber

Output

[
  {
    "id": "value",
    "number": "11-ord"
  },
  {
    "id": "value",
    "number": "14"
  }
]

Duplicate values and values with -ord are removed except one

Upvotes: 1

AnupamBhusari
AnupamBhusari

Reputation: 2415

You should use filter before mapping for better performance. Try following filter for your requirement

payload filter ($.orderNumber contains '-ord') and $.orderNumber == '11-ord' map ((payload, indexOfPayload) -> {
id: payload.orderId ,
number: payload.orderNumber
})

HTH

Upvotes: 0

Senthil c
Senthil c

Reputation: 341

You could achieve it based on the "filter" clause. I built a sample logic demonstrating your case below:

 %dw 1.0
%var payload = [
    {
    "id":"value",
    "orderNumber": "10-ord"
    },
    {
    "id":"value",
    "orderNumber": "11"
    },
    {
    "id":"value",
    "orderNumber": "12-ord"
    },
    {
    "id":"value",
    "orderNumber": "13-ord"
    },
    {
    "id":"value",
    "orderNumber": "14-ord"
    }

]
%output application/json
---
payload filter (not ($.orderNumber contains '-ord') )

Upvotes: 0

Related Questions