Performance 改进leftJoin嵌套mapObject在等价性不匹配时的性能

Performance 改进leftJoin嵌套mapObject在等价性不匹配时的性能,performance,optimization,mule,dataweave,Performance,Optimization,Mule,Dataweave,我正在使用下面的dataweave函数,它确实有效 %dw 2.0 import * from dw::core::Arrays output application/json var mysqlInvoices = [ { "id": 1, "owner": "Joseph" }, { "id": 2, "owner

我正在使用下面的
dataweave
函数,它确实有效

%dw 2.0
import * from dw::core::Arrays
output application/json

var mysqlInvoices = [
    {
        "id": 1,
        "owner": "Joseph"
    },
    {
        "id": 2,
        "owner": "Maria"
    }
]

var sapInvoices = [
    {
        "number": 3,
        "issuedBy": "XYZ"
    },
    {
        "number": 4,
        "issuedBy": "ABC"
    }
]
---
leftJoin(mysqlInvoices, sapInvoices, (m) -> m.id, (s) -> s.number) map (item, index) -> 
  (item.l mapObject (sItem, sKey) -> 
        (if ((sKey) as String == "id") "identifier" 
        else if ((sKey) as String == "owner") "ownerName" 
        else (sKey)): sItem)
  ++ 
  (if (item.r != null) 
    item.r mapObject (sItem, sKey) -> 
        (sKey): sItem
  else 
    sapInvoices[0] mapObject 
        (sItem, sKey) -> (sKey): "") 
但是,我想我是否可以从两点改进此功能:

  • 改变关键条件:
  • 我不认为这是检查每个键是否匹配的最佳实践,如果条件改变:

    (if ((sKey) as String == "id") "identifier" 
    else if ((sKey) as String == "owner") "ownerName" 
    else (sKey)): sItem
    
  • leftJoin
    与键不匹配时,使用原始对象将其映射为空字符串:
  • 我对这两点感到不舒服,我相信有办法改进这段代码,我只是不知道如何改进


    如果有一种非常不同的方法来完成相同的任务,我也很感激这种建议。

    如果代码看起来简单一点,请尝试以下内容:

    %dw 2.0
    import * from dw::core::Arrays
    output application/json
    
    var mysqlInvoices = [
        {
            "id": 1,
            "owner": "Joseph"
        },
        {
            "id": 2,
            "owner": "Maria"
        }
    ]
    
    var sapInvoices = [
        {
            "number": 3,
            "issuedBy": "XYZ"
        },
        {
            "number": 4,
            "issuedBy": "ABC"
        }
    ]
    
    var fs2rn = {
        id: "identifier",
        owner: "ownerName"
    }
    
    var rightEmpty= {number:"",issuedBy:""}
    ---
    leftJoin(
        // Do the field renaming at the very begining
        mysqlInvoices map ($ mapObject {(fs2rn[$$] default $$): $}), 
        sapInvoices, 
        (m) -> m.identifier, 
        (s) -> s.number
    )
    // Iterate over the results
    // Get just the values, and colapse the objects into a single object
    map (
        {($ pluck $)}
    )
    // Iterate over the results and use pattern-matching to 
    // 
    map (
        $ match {
            // Check if you have an id but not a number fields
            // In which case add the rightEmpty object
            case o if (o.identifier? and not (o.number?)) -> o ++ rightEmpty
            // Or give the object because you now have both an id and a number
            else o -> o
        }
    )
    
    我使用的特性和功能有:

    • 动态元素
    • 弹拨
    • 使用
      match
      操作符进行模式匹配

    如果我给你一个建议,那就是最好缩进你的代码。尽管如此,还是干得不错

    根据George的回答,您可以删除Purch和match,并直接合并左右表。见下文:

    %dw 2.0
    import * from dw::core::Arrays
    output application/json
    
    var mysqlInvoices = [
        {
            "id": 1,
            "owner": "Joseph"
        },
        {
            "id": 2,
            "owner": "Maria"
        }
    ]
    
    var sapInvoices = [
        {
            "number": 3,
            "issuedBy": "XYZ"
        },
        {
            "number": 4,
            "issuedBy": "ABC"
        }
    ]
    
    var fs2rn = {
        id: "identifier",
        owner: "ownerName"
    }
    
    var rightEmpty= {number:"",issuedBy:""}
    ---
    leftJoin(
        // Do the field renaming at the very begining
        mysqlInvoices map ($ mapObject {(fs2rn[$$] default $$): $}), 
        sapInvoices, 
        (m) -> m.identifier, 
        (s) -> s.number
    ) map (item) -> item.l ++ (item.r default rightEmpty)
    

    对于原始问题的第2项,我们不能在leftJoin之后使用map(item)->item.l++(item.r默认为rightEmpty)。这将只合并两个对象item.l和item.r,如果item.r为null,则默认为rightEmpty。您可能是正确的!您不需要最后一张
    地图
    ,也不需要
    弹拨
    。添加您的修改答案好友!
    %dw 2.0
    import * from dw::core::Arrays
    output application/json
    
    var mysqlInvoices = [
        {
            "id": 1,
            "owner": "Joseph"
        },
        {
            "id": 2,
            "owner": "Maria"
        }
    ]
    
    var sapInvoices = [
        {
            "number": 3,
            "issuedBy": "XYZ"
        },
        {
            "number": 4,
            "issuedBy": "ABC"
        }
    ]
    
    var fs2rn = {
        id: "identifier",
        owner: "ownerName"
    }
    
    var rightEmpty= {number:"",issuedBy:""}
    ---
    leftJoin(
        // Do the field renaming at the very begining
        mysqlInvoices map ($ mapObject {(fs2rn[$$] default $$): $}), 
        sapInvoices, 
        (m) -> m.identifier, 
        (s) -> s.number
    ) map (item) -> item.l ++ (item.r default rightEmpty)