如何在 Dataweave 中将按小时分隔的连续日期分组在一起?

san*_*nda 1 mule dataweave mulesoft

我有以下输入数据,我试图将连续的日期时间分组在一起,并按小时递增。使用版本:Dataweave 2.3、Mule 4.3

Input data.
["2020-03-03T06:00:00", "2020-03-03T07:00:00", "2020-03-03T08:00:00", 
"2020-03-03T09:00:00", "2020-03-03T13:00:00", "2020-03-03T14:00:00", 
"2020-03-03T15:00:00", "2020-03-04T06:00:00", "2020-03-04T07:00:00", 
"2020-03-04T08:00:00", "2020-03-04T09:00:00"]
Run Code Online (Sandbox Code Playgroud)

业务逻辑:从上面的输入来看,一些数据是按小时连续的。索引 (0,1,2,3) 和 (4,5,6) 和 (7,8,9,10) 按小时分组。目的是将这些连续日期合并在一起并创建如下对象集,其中 fromDate 是组中的最低日期,toDate 是组中的最高日期。希望我清楚要求。

Expected Output.
[{"fromDate" : "2020-03-03T06:00:00", "toDate" : "2020-03-03T09:00:00" },
 {"fromDate" : "2020-03-03T13:00:00", "toDate" : "2020-03-03T15:00:00" },
 {"fromDate" : "2020-03-04T06:00:00", "toDate" : "2020-03-04T09:00:00" }]
Run Code Online (Sandbox Code Playgroud)

我尝试过map、groupby、reduce,但无法解决这个问题。请帮忙。

mac*_*val 5

非常有趣的挑战。为了做到这一点,我实现了一个名为 clusterBy 的函数,它将匹配给定条件的连续元素分组。一旦我有了它,我只需要将每个簇的第一个和最后一个映射到对象中。请参阅下面的代码

%dw 2.0 
fun clusterWhile<T>(elements: Array<T>,  criteria: (source:T, target:T) -> Boolean) = do {
    fun clusterLoop(elements, value, carrier, criteria) = 
        elements  match {
            case [] ->  carrier
            case [x ~ xs] ->  
                if(criteria(value, x)) do {
                    var updatedCarrier = carrier update {
                        case [-1] -> $ << x    
                    }
                    ---
                    clusterLoop(xs, x, updatedCarrier, criteria)
                }
            else 
                clusterLoop(xs, x, carrier << [x], criteria)
    }

    ---
    elements match {
        case [] -> []
        case [x ~ xs] -> clusterLoop(xs, x, [[x]], criteria)
    }
}    


---
payload 
    clusterWhile ((source, target) -> target as DateTime - source as DateTime == |PT1H|)
    map ((item, index) -> {
        fromDate: item[0],
        toDate: item[-1]
})
Run Code Online (Sandbox Code Playgroud)