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);

%>

これはほとんど機能しているように見えますが、完全ではありません。コンポーネントを 1 つの入力と 1 つの出力を持つフローの一部として追加すると、出力には目的の余分な列が実際に表示されます。ただし、生成された 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 に答える