Aggregate two payloads in Mule ESB

2019-09-16 12:52发布

问题:

My mule code is hitting two tables and getting some details. First one is order details, which I am storing in a flow variable i.e order and another database is returning order item details which I am storing in orderitem variable.

I want to aggregate both the payload based on one condition. Every orderId has order items (which is stored in flowVars.orderitem) and map these order items to respective orderID.

flowVars.order value is as below

[{partnerId=e83185e9f33e4234ba9eaa81dba515ad, orderId=12345, orderDate=2017-02-28 16:41:41.0, id=22}, {partnerId=e83185e9f33e4234ba9eaa81dba515ad, orderId=123456, orderDate=2017-02-28 16:41:41.0, id=23}, {partnerId=e83185e9f33e4234ba9eaa81dba515ad, orderId=11111, orderDate=2017-02-28 16:41:41.0, id=24}, {partnerId=e83185e9f33e4234ba9eaa81dba515ad, orderId=321123, orderDate=2017-05-19 15:25:41.0, id=26}]

and flowVars.orderitem value is as below

 [{productCode=ELT-LP-ICND1-020067, orderId=12345, quantity=10, id=14}, {productCode=ELT-IP-ICND1-1.0, orderId=12345, quantity=11, id=15}, {productCode=ELT-LP-ICND1-020067, orderId=123456, quantity=12, id=16}, {productCode=ELT-IP-ICND1-1.0, orderId=123456, quantity=13, id=17}, {productCode=ELT-LP-ICND1-020067, orderId=11111, quantity=14, id=18}, {productCode=ELT-IP-ICND1-1.0, orderId=11111, quantity=15, id=19}, {productCode=ELT-LP-ICND2-020067, orderId=321123, quantity=5, id=20}]

Expected Output

[
  {
    "orderId": "12345",
    "orderDate": "2017-02-28T16:41:41",
    "partnerId": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderItems": [
       {
          "productCode": "ELT-LP-ICND1-020067",
          "quantity": "10"
        },
        {
          "productCode": "ELT-IP-ICND1-1.0",
          "quantity": "11"
        }
    ]
  },
  {
    "orderId": "123456",
    "orderDate": "2017-02-28T16:41:41",
    "partnerId": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderItems": [
        {
          "productCode": "ELT-LP-ICND1-020067",
          "quantity": "12"
        },
        {
          "productCode": "ELT-IP-ICND1-1.0",
          "quantity": "13"
        }
    ]
  },
  {
    "orderId": "11111",
    "orderDate": "2017-02-28T16:41:41",
    "partnerId": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderItems": [
       {
          "productCode": "ELT-LP-ICND1-020067",
          "quantity": "14"
        },
        {
          "productCode": "ELT-IP-ICND1-1.0",
          "quantity": "15"
        }
    ]
  },
  {
    "orderId": "321123",
    "orderDate": "2017-05-19T15:25:41",
    "partnerId": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderItems": [
      {
          "productCode": "ELT-LP-ICND1-020067",
          "quantity": "5"
        }
    ]
  }
]

Here I need to show respective order item details of an order. So basically I need to combine both the payloads.

I tried using dataweave but not luck.

Dataweave code:

%dw 1.0
%output application/json
%var mergeddata = flowVars.orderitem groupBy $.orderId  
---
 flowVars.order map ((data,index) ->
     {
    orderid: data.orderId,
    partnerid: data.partnerId,
    orderdate: data.orderDate,
    order: flowVars.orderitem default [] map ((data1 ,indexOf)  ->
           {
            (productcode: data1.productCode) when (data1.orderId == data.orderId),      
            (quantity: data1.quantity) when (data1.orderId == data.orderId) ,
            (id: data1.id) when (data1.orderId == data.orderId) 
            }

            )})  

And output after transformation:

{
    "orderid": "12345",
    "partnerid": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderdate": "2017-02-28T16:41:41",
    "order": [
      {
        "productcode": "ELT-LP-ICND1-020067",
        "quantity": 10,
        "id": 14
      },
      {
        "productcode": "ELT-IP-ICND1-1.0",
        "quantity": 11,
        "id": 15
      },
      {

      },
      {

      },
      {

      },
      {

      },
      {

      }
    ]
  },
  {
    "orderid": "123456",
    "partnerid": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderdate": "2017-02-28T16:41:41",
    "order": [
      {

      },
      {

      },
      {
        "productcode": "ELT-LP-ICND1-020067",
        "quantity": 12,
        "id": 16
      },
      {
        "productcode": "ELT-IP-ICND1-1.0",
        "quantity": 13,
        "id": 17
      },
      {

      },
      {

      },
      {

      }
    ]
  },
  {
    "orderid": "11111",
    "partnerid": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderdate": "2017-02-28T16:41:41",
    "order": [
      {

      },
      {

      },
      {

      },
      {

      },
      {
        "productcode": "ELT-LP-ICND1-020067",
        "quantity": 14,
        "id": 18
      },
      {
        "productcode": "ELT-IP-ICND1-1.0",
        "quantity": 15,
        "id": 19
      },
      {

      }
    ]
  },
  {
    "orderid": "321123",
    "partnerid": "e83185e9f33e4234ba9eaa81dba515ad",
    "orderdate": "2017-05-19T15:25:41",
    "order": [
      {

      },
      {

      },
      {

      },
      {

      },
      {

      },
      {

      },
      {
        "productcode": "ELT-LP-ICND2-020067",
        "quantity": 5,
        "id": 20
      }
    ]
  }
]

As you can see that I am almost there and able to map order item details with respective orderId but still I am getting some blank values after transformation.

Can anyone help me to achieve expected output. Thanks in advance!!!

回答1:

You need to filter the flowVars.orderitem map, rather than iterate it in full and only print values when the orderId matches.

    order: ((flowVars.orderitem default []) filter (data.orderId == $.orderId)) map ((data1 ,indexOf) -> {
            productcode: data1.productCode,      
            quantity: data1.quantity
            id: data1.id
    })

You can then remove all of those 'when' statements too.