Reputation: 526
I have Input as below, response need to orderBy ClientNo
and also add the SeqNo
based on the number of repeats of same ClientNo
.
Example if ClientNo:7011
repeats 2 times, it should add the seqNo: 1 and next object as 2, similarly for ClientNo:7022
etc..
Please let me know if the question is unclear. Thanks for your help in advance.
%dw 2.0
---
payload orderBy $.ClientNo map (payload01,index) -> {
ClientNo: payload01.ClientNo,
Quantity:payload01.Quantity,
SeqNo: ????( Required to calculate repeats of seqNo based on $.ClientNo match dynamically )
Volume:payload01.Volume,
TrackDetails:payload01.TrackDetails
}
Input:
[
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
output:
[
{
"ClientNo":7011,
"Quantity":80,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"SeqNo":3,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
}
]
Upvotes: 0
Views: 1325
Reputation:
Give this a try, there is a caveat for this to work you must use a 4.3.0 Mule Runtime, it can be done with a prior version--let me know and I 'll do it when possible:
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var updatedCounters = result.c update {
case f at ."$(rec.ClientNo)" -> f + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[rec.ClientNo as Key]}
}
}
)
}).r
The key to the solution is to keep track of a set of counters, reduce
also feels a natural fit.
EDIT: solution for mule runtimes prior to 4.3.0
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var k = rec.ClientNo as Key
var updatedCounters = {
(result.c - k),
(k): result.c[k] + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[k]}
}
}
)
}).r
orderBy $.SeqNo
orderBy $.ClientNo
Upvotes: 2