ibm-integration-busextended-sql

IBM App Connect Enterprise - Aggregate Group Node Results


I'm using the Group Nodes in App Connect ACE 11 to call a service multiple times and trying to aggregate the the responses. Everything works fine and the below is the result of InputRoot.ComIbmGroupCompleteNode.Group.

{
    "msg": {
        "GroupProperties": {
            "GroupId": "010000000000000000000000000000001000000000000000",
            "GroupName": "TSTGRP",
            "GroupCreationTime": 1593669682652,
            "GroupCommitTime": 1593669682707,
            "GroupCompleteTime": 1593669682806,
            "GroupOutputTime": 1593669682806,
            "GroupStatus": "Completed"
        },
        "Context": {
            "HTTP": {
                "RequestIdentifier": "45564854000000000e000000db851d0ecc11000000000000"
            },
            "RouterList": {}
        },
        "Replies": {
            "FLDR": {
                "ReplyId": "534f41503000000067e55223146300000400000000000000",
                "RequestSendTime": 1593669682674,
                "ReplyReceiptTime": 1593669682706,
                "Reply": {
                    "Root": {
                        "HTTPResponseHeader": {
                            "X-Original-HTTP-Status-Line": "HTTP/1.1 200 OK",
                            "X-Original-HTTP-Status-Code": 200,
                            "Date": "Thu, 02 Jul 2020 06:01:17 GMT",
                            "Content-Type": "application/json; charset=utf-8",
                            "Content-Length": "83",
                            "Connection": "keep-alive",
                            "Set-Cookie": "__cfduid=dfbd2cc294d944ed4cfdf6b72a343f8dc1593669677; expires=Sat, 01-Aug-20 06:01:17 GMT; path=/; domain=.typicode.com; HttpOnly; SameSite=Lax",
                            "X-Powered-By": "Express",
                            "X-Ratelimit-Limit": "10000",
                            "X-Ratelimit-Remaining": "9999",
                            "X-Ratelimit-Reset": "1592660247",
                            "Vary": "Origin, Accept-Encoding",
                            "Access-Control-Allow-Credentials": "true",
                            "Cache-Control": "max-age=43200",
                            "Pragma": "no-cache",
                            "Expires": "-1",
                            "X-Content-Type-Options": "nosniff",
                            "Etag": "W/\"53-hfEnumeNh6YirfjyjaujcOPPT+s\"",
                            "Via": "1.1 vegur",
                            "CF-Cache-Status": "HIT",
                            "Age": "15242",
                            "Accept-Ranges": "bytes",
                            "cf-request-id": "03afb689ec00007f11da290200000001",
                            "Server": "cloudflare",
                            "CF-RAY": "5ac626bcaa097f11-CMB"
                        },
                        "JSON": {
                            "Data": {
                                "userId": 1,
                                "id": 1,
                                "title": "delectus aut autem",
                                "completed": false
                            }
                        }
                    }
                }
            },
            "FLDR": {
                "ReplyId": "534f415031000000273b5323146300000400000000000000",
                "RequestSendTime": 1593669682707,
                "ReplyReceiptTime": 1593669682737,
                "Reply": {
                    "Root": {
                        "HTTPResponseHeader": {
                            "X-Original-HTTP-Status-Line": "HTTP/1.1 200 OK",
                            "X-Original-HTTP-Status-Code": 200,
                            "Date": "Thu, 02 Jul 2020 06:01:17 GMT",
                            "Content-Type": "application/json; charset=utf-8",
                            "Content-Length": "99",
                            "Connection": "keep-alive",
                            "Set-Cookie": "__cfduid=debd2bf084ee690942fb5d3439e41fa331593669677; expires=Sat, 01-Aug-20 06:01:17 GMT; path=/; domain=.typicode.com; HttpOnly; SameSite=Lax",
                            "X-Powered-By": "Express",
                            "X-Ratelimit-Limit": "500",
                            "X-Ratelimit-Remaining": "497",
                            "X-Ratelimit-Reset": "1593684076",
                            "Vary": "Origin, Accept-Encoding",
                            "Access-Control-Allow-Credentials": "true",
                            "Cache-Control": "max-age=43200",
                            "Pragma": "no-cache",
                            "Expires": "-1",
                            "X-Content-Type-Options": "nosniff",
                            "Etag": "W/\"63-+s0zIP5ZEQN9hypVJUneLybJ+L0\"",
                            "Via": "1.1 vegur",
                            "CF-Cache-Status": "HIT",
                            "Age": "8713",
                            "Accept-Ranges": "bytes",
                            "cf-request-id": "03afb68a0900007f29ad07c200000001",
                            "Server": "cloudflare",
                            "CF-RAY": "5ac626bcdc137f29-CMB"
                        },
                        "JSON": {
                            "Data": {
                                "userId": 1,
                                "id": 2,
                                "title": "quis ut nam facilis et officia qui",
                                "completed": false
                            }
                        }
                    }
                }
            },
            "FLDR": {
                "ReplyId": "534f4150320000000bbb5323146300000400000000000000",
                "RequestSendTime": 1593669682707,
                "ReplyReceiptTime": 1593669682737,
                "Reply": {
                    "Root": {
                        "HTTPResponseHeader": {
                            "X-Original-HTTP-Status-Line": "HTTP/1.1 200 OK",
                            "X-Original-HTTP-Status-Code": 200,
                            "Date": "Thu, 02 Jul 2020 06:01:17 GMT",
                            "Content-Type": "application/json; charset=utf-8",
                            "Content-Length": "84",
                            "Connection": "keep-alive",
                            "Set-Cookie": "__cfduid=dfbd2cc294d944ed4cfdf6b72a343f8dc1593669677; expires=Sat, 01-Aug-20 06:01:17 GMT; path=/; domain=.typicode.com; HttpOnly; SameSite=Lax",
                            "X-Powered-By": "Express",
                            "X-Ratelimit-Limit": "500",
                            "X-Ratelimit-Remaining": "499",
                            "X-Ratelimit-Reset": "1593684076",
                            "Vary": "Origin, Accept-Encoding",
                            "Access-Control-Allow-Credentials": "true",
                            "Cache-Control": "max-age=43200",
                            "Pragma": "no-cache",
                            "Expires": "-1",
                            "X-Content-Type-Options": "nosniff",
                            "Etag": "W/\"54-J3JtLgWuXjgj1OZdyAcKAqOaKHo\"",
                            "Via": "1.1 vegur",
                            "CF-Cache-Status": "HIT",
                            "Age": "8713",
                            "Accept-Ranges": "bytes",
                            "cf-request-id": "03afb68a0c00007f11da291200000001",
                            "Server": "cloudflare",
                            "CF-RAY": "5ac626bcea187f11-CMB"
                        },
                        "JSON": {
                            "Data": {
                                "userId": 1,
                                "id": 3,
                                "title": "fugiat veniam minus",
                                "completed": false
                            }
                        }
                    }
                }
            }
        }
    }
}

My question is how can I access the 3 JSON.Data elements and create a combined response. I know this is not a valid JSON and FLDR is a repeating key. Also this is not an array. How can I access these elements and create a combined response like this?

{
    "result1": {
        "userId": 1,
        "id": 1,
        "title": "delectus aut autem",
        "completed": false
    },
    "result2": {
        "userId": 1,
        "id": 2,
        "title": "quis ut nam facilis et officia qui",
        "completed": false
    },
    "result3": {
        "userId": 1,
        "id": 3,
        "title": "fugiat veniam minus",
        "completed": false
    }
}

Any help would be very much appreciated.


Solution

  • If you have a message tree containing that structure then you can access any part of it - regardless of whether it would be a valid JSON document.

    Have you tried writing a normal FOR loop in ESQL to iterate over the occurrences of FLDR?

    Note: this code is completely un-tested and probably contains syntax errors and defects...

    DECLARE index INTEGER 1;
    FOR refFLDR AS InputRoot.ComIbmGroupCompleteNode.Group.msg.Replies.FLDR[] DO
       DECLARE fieldName 'Result' || index;
       CREATE LASTCHILD OF OutputRoot.JSON.Data TYPE Name NAME fieldName FROM refFLDR;
       SET index = index + 1;
    END FOR;