有很多方法可以在文档数组之间进行映射。但在您创建之前,请考虑以下著作:
- Techcommunity SoftwareAG - appendToDocumentList 对性能的影响
- quest4apps.com - 避免 appendToDocumentList 的原因
正如#2的提示所说,它们有 6 种方式从最快到最慢排列如下(但我将在前三种中举一个例子,因为后三种显然很慢,这被认为是可以避免的):
1. Java Loop:通过Java服务完成的循环。
- 创建 java 服务最简单的方法是首先映射输入输出。
- 右键单击并单击“生成代码”直到出现对话框
选择选项“用于实现此服务”
并创建服务
- 只需将代码重新排列成这样:
public static final void mappingDocuments(IData pipeline) throws ServiceException {
// pipeline
IDataCursor pipelineCursor = pipeline.getCursor();
// Instantiate input A
IData[] A = IDataUtil.getIDataArray(pipelineCursor, "A");
// Initiate output B
IData[] B = new IData[A.length];
if (A != null)
{
for (int i = 0; i < A.length; i++)
{
// Populate the Field in doc A
IDataCursor ACursor = A[i].getCursor();
String Field1 = IDataUtil.getString(ACursor, "Field1");
String Field2 = IDataUtil.getString(ACursor, "Field2");
String Field3 = IDataUtil.getString(ACursor, "Field3");
ACursor.destroy();
// Create IData[i] and cursors finally put all Fields into B[i] variable output
B[i] = IDataFactory.create();
IDataCursor BCursor = B[i].getCursor();
IDataUtil.put(BCursor, "F1", Field1);
IDataUtil.put(BCursor, "F2", Field2);
IDataUtil.put(BCursor, "F3", Field3);
BCursor.destroy();
// OR JUST USE CLONE BELOW IF YOU DON'T HAVE ANY MODIFICATION INSIDE THE VARIABLE
// B[i] = IDataUtil.clone(A[i]);
}
}
pipelineCursor.destroy();
// Finally to put the B Map(IData) to output.
// Actually you can use only single pipelineCursor throughout all code but it's just for readable
IDataUtil.put(pipelineCursor, "B", B);
pipelineCursor.destroy();
}
- 结果
2. 隐式循环:对于相同大小的简单列表,您可能希望在 MAP 步骤中直接链接它们
- 创建流服务和输入输出文档
- 创建 MAP 步骤
- 在 ForEach 循环中选择两个文档。
3. 显式循环:使用 LOOP 步骤及其输出数组。
- 创建流服务和输入输出文档
- 创建 LOOP 步骤
- 改变LOOP的属性,输入array=A;输出数组=B;并在 LOOP 步骤下创建地图
- 将 A 中的所有参数映射到 B
希望这些有帮助...