VARIATION addEdgesFromExpr_predicatesAtEnd
input {
    "pipeline": [
        {
            "$lookup": {
                "from": "A",
                "as": "fromA",
                "localField": "s1",
                "foreignField": "s1"
            }
        },
        {
            "$unwind": {
                "path": "$fromA"
            }
        },
        {
            "$lookup": {
                "from": "B",
                "as": "fromB",
                "localField": "s2",
                "foreignField": "s2"
            }
        },
        {
            "$unwind": {
                "path": "$fromB"
            }
        },
        {
            "$match": {
                "$expr": {
                    "$eq": [
                        "$fromA.a",
                        "$fromB.a"
                    ]
                }
            }
        },
        {
            "$lookup": {
                "from": "C",
                "as": "fromC",
                "localField": "s3",
                "foreignField": "s3"
            }
        },
        {
            "$unwind": {
                "path": "$fromC"
            }
        },
        {
            "$match": {
                "$expr": {
                    "$eq": [
                        "$fromB.b",
                        "$fromC.b"
                    ]
                }
            }
        },
        {
            "$lookup": {
                "from": "D",
                "as": "fromD",
                "localField": "s4",
                "foreignField": "s4"
            }
        },
        {
            "$unwind": {
                "path": "$fromD"
            }
        },
        {
            "$match": {
                "$and": [
                    {
                        "$expr": {
                            "$eq": [
                                "$fromC.c",
                                "$fromD.c"
                            ]
                        }
                    },
                    {
                        "$expr": {
                            "$eq": [
                                "$fromD.d",
                                "$fromA.d"
                            ]
                        }
                    }
                ]
            }
        }
    ]
}
output: {
    "graph": {
        "nodes": [
            {
                "collectionName": "test.pipeline_test",
                "accessPath": {
                    "filter": {}
                },
                "embedPath": ""
            },
            {
                "collectionName": "test.A",
                "accessPath": {
                    "filter": {}
                },
                "embedPath": "fromA"
            },
            {
                "collectionName": "test.B",
                "accessPath": {
                    "filter": {}
                },
                "embedPath": "fromB"
            },
            {
                "collectionName": "test.C",
                "accessPath": {
                    "filter": {}
                },
                "embedPath": "fromC"
            },
            {
                "collectionName": "test.D",
                "accessPath": {
                    "filter": {}
                },
                "embedPath": "fromD"
            }
        ],
        "edges": [
            {
                "predicates": [
                    {
                        "op": "eq",
                        "left": {"$numberInt":"0"},
                        "right": {"$numberInt":"1"}
                    }
                ],
                "left": {"$numberInt":"0"},
                "right": {"$numberInt":"1"}
            },
            {
                "predicates": [
                    {
                        "op": "eq",
                        "left": {"$numberInt":"2"},
                        "right": {"$numberInt":"3"}
                    }
                ],
                "left": {"$numberInt":"0"},
                "right": {"$numberInt":"2"}
            },
            {
                "predicates": [
                    {
                        "op": "exprEq",
                        "left": {"$numberInt":"4"},
                        "right": {"$numberInt":"5"}
                    }
                ],
                "left": {"$numberInt":"1"},
                "right": {"$numberInt":"2"}
            },
            {
                "predicates": [
                    {
                        "op": "eq",
                        "left": {"$numberInt":"6"},
                        "right": {"$numberInt":"7"}
                    }
                ],
                "left": {"$numberInt":"0"},
                "right": {"$numberInt":"3"}
            },
            {
                "predicates": [
                    {
                        "op": "exprEq",
                        "left": {"$numberInt":"8"},
                        "right": {"$numberInt":"9"}
                    }
                ],
                "left": {"$numberInt":"2"},
                "right": {"$numberInt":"3"}
            },
            {
                "predicates": [
                    {
                        "op": "eq",
                        "left": {"$numberInt":"10"},
                        "right": {"$numberInt":"11"}
                    }
                ],
                "left": {"$numberInt":"0"},
                "right": {"$numberInt":"4"}
            },
            {
                "predicates": [
                    {
                        "op": "exprEq",
                        "left": {"$numberInt":"12"},
                        "right": {"$numberInt":"13"}
                    }
                ],
                "left": {"$numberInt":"3"},
                "right": {"$numberInt":"4"}
            },
            {
                "predicates": [
                    {
                        "op": "exprEq",
                        "left": {"$numberInt":"15"},
                        "right": {"$numberInt":"14"}
                    }
                ],
                "left": {"$numberInt":"1"},
                "right": {"$numberInt":"4"}
            }
        ]
    },
    "resolvedPaths": [
        {
            "nodeId": {"$numberInt":"0"},
            "fieldName": "s1"
        },
        {
            "nodeId": {"$numberInt":"1"},
            "fieldName": "s1"
        },
        {
            "nodeId": {"$numberInt":"0"},
            "fieldName": "s2"
        },
        {
            "nodeId": {"$numberInt":"2"},
            "fieldName": "s2"
        },
        {
            "nodeId": {"$numberInt":"1"},
            "fieldName": "a"
        },
        {
            "nodeId": {"$numberInt":"2"},
            "fieldName": "a"
        },
        {
            "nodeId": {"$numberInt":"0"},
            "fieldName": "s3"
        },
        {
            "nodeId": {"$numberInt":"3"},
            "fieldName": "s3"
        },
        {
            "nodeId": {"$numberInt":"2"},
            "fieldName": "b"
        },
        {
            "nodeId": {"$numberInt":"3"},
            "fieldName": "b"
        },
        {
            "nodeId": {"$numberInt":"0"},
            "fieldName": "s4"
        },
        {
            "nodeId": {"$numberInt":"4"},
            "fieldName": "s4"
        },
        {
            "nodeId": {"$numberInt":"3"},
            "fieldName": "c"
        },
        {
            "nodeId": {"$numberInt":"4"},
            "fieldName": "c"
        },
        {
            "nodeId": {"$numberInt":"4"},
            "fieldName": "d"
        },
        {
            "nodeId": {"$numberInt":"1"},
            "fieldName": "d"
        }
    ],
    "prefix": [
        {
            "$lookup": {
                "from": "A",
                "as": "fromA",
                "localField": "s1",
                "foreignField": "s1"
            }
        },
        {
            "$unwind": {
                "path": "$fromA"
            }
        },
        {
            "$lookup": {
                "from": "B",
                "as": "fromB",
                "localField": "s2",
                "foreignField": "s2"
            }
        },
        {
            "$unwind": {
                "path": "$fromB"
            }
        },
        {
            "$match": {
                "$expr": {
                    "$eq": [
                        "$fromA.a",
                        "$fromB.a"
                    ]
                }
            }
        },
        {
            "$lookup": {
                "from": "C",
                "as": "fromC",
                "localField": "s3",
                "foreignField": "s3"
            }
        },
        {
            "$unwind": {
                "path": "$fromC"
            }
        },
        {
            "$match": {
                "$expr": {
                    "$eq": [
                        "$fromB.b",
                        "$fromC.b"
                    ]
                }
            }
        },
        {
            "$lookup": {
                "from": "D",
                "as": "fromD",
                "localField": "s4",
                "foreignField": "s4"
            }
        },
        {
            "$unwind": {
                "path": "$fromD"
            }
        },
        {
            "$match": {
                "$and": [
                    {
                        "$expr": {
                            "$eq": [
                                "$fromC.c",
                                "$fromD.c"
                            ]
                        }
                    },
                    {
                        "$expr": {
                            "$eq": [
                                "$fromD.d",
                                "$fromA.d"
                            ]
                        }
                    }
                ]
            }
        }
    ],
    "suffix": []
}

