假设 in 中的记录数result_type
不会经常变化并且比 中的记录数小很多error_log
,您可以使用In-memory Lookup
snap 而不是Join
snap。除此之外,没有直接的方法可以使用常规快照来执行此操作。我建议尽可能在数据库中进行复杂的查询。以下是使用Script
snap 的实现。
样品管道
![在此处输入图像描述](https://i.stack.imgur.com/U5sWO.png)
内存查找
添加一个join_id
带有值1
(或其他)的字段(或其他),并在查找中基于此字段加入。这将在所有传入文档中添加整个查找(在您的情况下为类型)。
![在此处输入图像描述](https://i.stack.imgur.com/Ha1Qz.png)
脚本
try { load("nashorn:mozilla_compat.js"); } catch(e) { }
importPackage(com.snaplogic.scripting.language);
importClass(java.util.ArrayList);
importClass(java.util.LinkedHashMap);
var impl = {
input : input,
output : output,
error : error,
log : log,
execute : function () {
this.log.info("Executing Transform Script");
while (this.input.hasNext()) {
try {
var inDoc = this.input.next();
var outDocs = new ArrayList();
var errorLogId = inDoc.id;
var description = inDoc.description;
var types = inDoc.types;
var flag = false;
for(var idx in types) {
var type = types[idx];
if(description.toLowerCase().contains(type.type.toLowerCase())) {
var outDoc = new LinkedHashMap();
outDoc.put('error_log_id', errorLogId);
outDoc.put('result_type_id', type.id);
outDocs.add(outDoc);
}
}
if(outDocs.isEmpty()) {
var outDoc = new LinkedHashMap();
outDoc.put('error_log_id', errorLogId);
outDoc.put('result_type_id', null);
outDocs.add(outDoc);
}
for(var idx in outDocs) {
var outDoc = outDocs[idx];
this.output.write(inDoc, outDoc);
}
}
catch (err) {
var errDoc = new LinkedHashMap();
errDoc.put("error", err);
this.log.error(err);
this.error.write(errDoc);
}
}
this.log.info("Script executed");
},
cleanup : function () {
this.log.info("Cleaning up")
}
};
var hook = new com.snaplogic.scripting.language.ScriptHook(impl);
输出
![在此处输入图像描述](https://i.stack.imgur.com/7UGB9.png)