SuiteScript 中的输出迭代器 Map/Reduce 汇总函数

Output Iterator in SuiteScript Map/Reduce Summarize Function

我正在编写 map/reduce 脚本来处理一些自动计费处理。我 运行 在 GetInput 阶段搜索发票,在 Map 阶段按客户分组,然后在Reduce 阶段。但是,在 Summarize 阶段,只存在一对 key/value。因此,我创建了一个虚拟测试脚本来使用该功能并将其弄清楚,并 运行ning 陷入同样的​​问题。

这是我的测试脚本:

define(['N/search'], (search) => {

const getInputData = (inputContext) => {
    let filt = [
            ["trandate","on","3/29/2022"]
        ,   "and"
        ,   ["mainline","is","T"]
    ];
    let cols = [
            search.createColumn({ name : "tranid" })
        ,   search.createColumn({ name : "entity" })
        ,   search.createColumn({ name : "total" })
    ];
    let results;
    try {
        // custom search wrapper
        results = getSearchResults("invoice", filt, cols);
    }
    catch (err) {
        log.error({ title : "Error encountered retrieving invoices" , details : err });
    }
    
    return results;
}

const map = (mapContext) => {
    try {
        let data = JSON.parse(mapContext.value);
        let output = { key : "" , value : data };
        let rand = randomInt(0, 1); // custom random number generator
        if (rand === 0) {
            output.key = "FAILURE";
        }
        else {
            output.key = "SUCCESS";
        }
        mapContext.write(output);
    }
    catch (err) {
        log.error({ title : "Map Stage Error" , details : err });
    }
}

const reduce = (reduceContext) => {
    reduceContext.write({
            key : reduceContext.key
        ,   value : JSON.stringify(reduceContext.values)
    });
}

const summarize = (summaryContext) => {
    summaryContext.output.iterator().each((key, value) => {
        log.audit({ title : `summary -- ${key} -- ${typeof value}` , details : value });
    });
}

return {getInputData, map, reduce, summarize}

});

总的来说,摘要日志记录应该有两个要报告的关键条目,但只有一个。在测试中,我通过在 Map 中将值标记为 SUCCESSFAILURE 来尝试这两种方法阶段,然后将其传递到 Reduce 阶段,并将值传递到 Map 阶段以标记为 Reduce阶段的SUCCESSFAILURE,然后以发票记录ID为key传递。无论如何,Summarize 阶段中的输出迭代器只会报告一个键。我在一种特定情况下正确地完成了这项工作,但对于我的一生,我无法弄清楚什么是 different/wrong.

有什么见解吗?否则,我能想到的能够传播必要数据的唯一方法是利用 'N/cache' 模块,它工作得很好,但感觉应该是不必要的。

我的理解是你需要从each()回调函数中return true;,否则会停止处理。

const summarize = (summaryContext) => {
    summaryContext.output.iterator().each((key, value) => {
        log.audit({ title : `summary -- ${key} -- ${typeof value}` , details : value });
        return true;
    });
}

我是这样处理MP脚本错误的

summarize: function summarize(summarizeContext) {
        function handleErrorIfAny(summary)
        {
            var mapSummary = summary.mapSummary;
            var reduceSummary = summary.reduceSummary;

            handleErrorInStage('map', mapSummary);
            handleErrorInStage('reduce', reduceSummary);
        }
        function handleErrorInStage(stage, summary)
        {
            summary.errors.iterator().each(function(key, value){
                nLog.error('Failure in key ' + key, value);
                return true;
            });
        }
        handleErrorIfAny(summarizeContext);
    }