Infinity
Infinity

Reputation: 526

Counting Number of elements in Json based on Item match Dataweave 2.0

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

Answers (1)

user3078986
user3078986

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

Related Questions