1

我正在使用 Talend Open Studio 进行数据集成,我想创建一个自定义组件,该组件将输出输入数据以及从输入列派生的一些额外列。作为概念证明,在下面的代码中,我尝试为每一列创建一个重复的列,但实际示例将具有更复杂的逻辑。这是我在 .javajet 文件的“开始”部分为组件尝试的内容:

<%@ jet
    imports="
        org.talend.core.model.process.INode
        org.talend.core.model.process.ElementParameterParser
        org.talend.core.model.metadata.IMetadataTable
        org.talend.core.model.metadata.IMetadataColumn
        org.talend.core.model.process.IConnection
        org.talend.core.model.process.IConnectionCategory
        org.talend.designer.codegen.config.CodeGeneratorArgument
        org.talend.core.model.metadata.types.JavaTypesManager
        org.talend.core.model.metadata.types.JavaType
        java.util.List
        java.util.Map       
    "
%>
<%
    CodeGeneratorArgument codeGenArgument = (CodeGeneratorArgument) argument;
    INode node = (INode)codeGenArgument.getArgument();
    String cid = node.getUniqueName();   

    IConnection conn = node.getOutgoingConnections().get(0);
    IMetadataTable outputMetadataTable = conn.getMetadataTable();

    List<IMetadataTable> metadatas = node.getMetadataList();
    IMetadataTable metadata = metadatas.get(0);

    List<IMetadataColumn> columnsToAdd = new java.util.ArrayList<IMetadataColumn>();
    for(IMetadataColumn col : outputMetadataTable.getListColumns()){
      IMetadataColumn cloned = col.clone();
      cloned.setLabel("Clone_of_" + cloned.getLabel());
      columnsToAdd.add(cloned);
    }

    List<IMetadataColumn> cols = new java.util.ArrayList<IMetadataColumn>(outputMetadataTable.getListColumns());
    cols.addAll(columnsToAdd);
    outputMetadataTable.setListColumns(cols);

%>

这似乎几乎可以工作,但并不完全。如果我将组件添加为具有单个输入和单个输出的流的一部分,则输出确实会显示所需的额外列。但是,生成的 Java 代码仍然存在编译错误。看起来我的组件输出的“结构”没有表示附加列的字段。也就是说,如果 row1 是输入,row2 是输出,则 row2Struct 类没有由元数据更改表示的额外字段。因此,即使 UI 会显示这些列存在于输出中,但似乎我实际上无法将任何值放入这些列中。

由于我能够更改元数据中的列,因此必须有一种方法可以让我将其反映在行的结构中,对吗?是否有某种“更新”方法或我缺少的东西?

4

1 回答 1

-1

在这种情况下,row2Struct 构造函数需要在您的 _main.javajet 生成的 java 代码中调用,如下所示:

<%
String outConnName = conn.getName();
%>
<%=outConnName %> = new <%=outConnName %>Struct();

然后如果你想在你的输出数据流中复制一些输入数据,你可以生成以下java代码:

<%
for ( IMetadataColumn outColumn : outColumns) {
%>
<%=outConnName%>.<%=outColumn.getLabel()%> = <%=inConnName%>.<%=outColumn.getLabel()%>;
<%
}
%>
于 2013-04-09T19:45:51.570 回答