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 中将值标记为 SUCCESS 或 FAILURE 来尝试这两种方法阶段,然后将其传递到 Reduce 阶段,并将值传递到 Map 阶段以标记为 Reduce阶段的SUCCESS或FAILURE,然后以发票记录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);
}
我正在编写 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 中将值标记为 SUCCESS 或 FAILURE 来尝试这两种方法阶段,然后将其传递到 Reduce 阶段,并将值传递到 Map 阶段以标记为 Reduce阶段的SUCCESS或FAILURE,然后以发票记录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);
}