Customer Portal

problem in spliting record

Comments 2

  • Avatar
    oldforum
    0
    Comment actions Permalink
    hello

    i have created my SplitRecord class and modified component factory

    then when i execute my testSplit graph i get exception that INPUT port has no out put port but there is in my graph.

    i am providing full resources so

    this is my graph
    [testSplit.grf]
    <?xml version="1.0" encoding="UTF-8"?>
    <Graph name="Testing split">

    <Global>
    <Metadata id="salesMetadata" fileURL="E:/CloverETL/Examples/metadata/sales.txt"/>
    <Metadata id="salesOutMetadata" fileURL="E:/CloverETL/Examples/metadata/salesout.txt"/>
    <Metadata id="dateMetadata" fileURL="E:/CloverETL/Examples/metadata/date.txt"/>
    <DBConnection id="InpDB" dbConfig="E:/CloverETL/Examples/Postgress.cfg"/>
    <DBConnection id="outputDB" dbConfig="E:/CloverETL/Examples/Postgress1.cfg"/>
    </Global>
    <Phase number="0">
    <Node id="INPUT" type="DB_INPUT_TABLE" dbConnection="InpDB" sqlQuery="select customer_id,"date",prefix || ' ' || doc_no as doc_no,version,pm.person_first_name || ' ' || pm.person_last_name as sales_representative,item_id,qty,price,discount1,discount2 from sv_master as sv,employee_master as em,person_master as pm,sv_detail as sd where sv.id <> 0 and sv.current_version and sv.sales_representativ=em.id and em.person_master_id=pm.id and sd.sv_id=sv.id"/>
    <Node id="SPLIT" type="SPLIT_RECORD" />
    <Node id="OUTDATE" type="DB_OUTPUT_TABLE" dbConnection="outputDB" dbTable="mydate"/>
    <Node id="OUTSALES" type="DB_OUTPUT_TABLE" dbConnection="outputDB" dbTable="sales"/>
    <Edge id="INEDGE" fromNode="INPUT:0" toNode="SPLIT:0" metadata="salesMetadata"/>
    <Edge id="MIDEDGE" fromNode="SPLIT:0" toNode="OUTDATE:0" metadata="dateMetadata"/>
    <Edge id="OUTEDGE1" fromNode="SPLIT:1" toNode="OUTSALES:0" metadata="salesOutMetadata"/>
    </Phase>
    </Graph>


    here what i get on console

    [console dump]
    *** CloverETL framework/transformation graph runner ver1.7, (c) 2002-05 D.Pavlis, released under GNU Lesser General Public License ***

    Graph definition file: E:/CloverETL/Examples/testSplit.txt
    phase No. 0
    phase No. 0
    java.lang.NullPointerException
    at org.jetel.graph.TransformationGraphXMLReaderWriter.instantiateNodes(TransformationGraphXMLReaderWriter.java:381)
    at org.jetel.graph.TransformationGraphXMLReaderWriter.instantiatePhases(TransformationGraphXMLReaderWriter.java:348)
    at org.jetel.graph.TransformationGraphXMLReaderWriter.read(TransformationGraphXMLReaderWriter.java:242)
    at org.jetel.main.runGraph.main(runGraph.java:124)
    Initializing DB connection: jdbc:postgresql://192.168.0.3/vtech0506 ... OK
    Initializing DB connection: jdbc:postgresql://192.168.0.3/olap ... OK
    [Clover] starting WatchDog thread ...
    [WatchDog] Thread started.
    [WatchDog] Running on 1 CPU(s) max available memory for JVM 1639 KB
    [Clover] Initializing phase: 0
    initializing edges: all edges initialized successfully...
    initializing nodes:
    INPUT ...FAILED !
    Nov 12, 2005 5:12:02 PM org.jetel.graph.Phase init
    SEVERE: At least one output port has to be defined for node INPUT
    [WatchDog] !!! Phase finished with error - stopping graph run !!!
    Failed starting graph !
    [Clover] WatchDog thread finished - total execution time: 0 (sec)
    [Clover] !!! Graph execution finished with errors !!!


    here is my SplitRecord class


    /*
    * Created on Nov 10, 2005
    *
    * TODO To change the template for this generated file go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    package org.jetel.component;

    /**
    * @author Deepak
    *
    * TODO To change the template for this generated type comment go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    import java.io.IOException;

    import org.jetel.data.DataRecord;
    import org.jetel.exception.ComponentNotReadyException;
    import org.jetel.graph.InputPort;
    import org.jetel.graph.Node;
    import org.jetel.graph.OutputPort;

    /**
    * @author Deepak
    *
    * TODO To change the template for this generated type comment go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    public class SplitRecord extends Node{

    public static final String COMPONENT_TYPE="SPLIT_RECORD";

    public SplitRecord(String id)
    {
    super(id);
    }

    public String getType() {
    return COMPONENT_TYPE;
    }

    public void init() throws ComponentNotReadyException {
    // test that we have at least one input port and one output
    if (inPorts.size()<1){
    throw new ComponentNotReadyException("At least one input port has to be defined for node " + id);
    }else if (outPorts.size()<1){
    throw new ComponentNotReadyException("At least one output port has to be defined for node " + id);
    }
    }

    public void run()
    {
    boolean isDriverDifferent;

    // get all ports involved
    InputPort inPort = getInputPort(0);
    DataRecord driverRecordread = new DataRecord(inPort.getMetadata());
    driverRecordread.init();

    int index=0;

    // get array of all ports defined/connected - use collection Collection - getInPorts();
    OutputPort outPorts[];
    outPorts = (OutputPort[]) getOutPorts().toArray(new OutputPort[0]);




    System.out.println("the no. of out put pin in split is " + outPorts.length);

    int cou[] = new int[5];
    Integer timeid=new Integer (1);

    while (runIt)
    {
    try
    {
    driverRecordread = inPort.readRecord(driverRecordread);
    if(driverRecordread != null)
    {
    DataRecord record0 = new DataRecord(outPorts[0].getMetadata());
    record0.init();
    record0.getField(0).setValue(driverRecordread.getField(1).getValue());

    DataRecord record1=new DataRecord(outPorts[1].getMetadata());
    record1.init();
    record1.getField(0).setValue(new Integer(1));
    record1.getField(1).setValue(driverRecordread.getField(0).getValue());
    record1.getField(2).setValue(timeid );
    record1.getField(3).setValue(driverRecordread.getField(2).getValue());
    record1.getField(4).setValue(driverRecordread.getField(3).getValue());
    record1.getField(5).setValue(driverRecordread.getField(4).getValue());
    record1.getField(6).setValue(driverRecordread.getField(5).getValue());
    record1.getField(7).setValue("KG");
    record1.getField(8).setValue(driverRecordread.getField(6).getValue());
    record1.getField(9).setValue(driverRecordread.getField(7).getValue());
    record1.getField(10).setValue(driverRecordread.getField(8).getValue());
    record1.getField(11).setValue(driverRecordread.getField(9).getValue());


    outPorts[0].writeRecord(record0 );
    outPorts[1].writeRecord(record1 );

    }else
    {
    break;
    }
    } catch (IOException ex)
    {
    resultMsg = ex.getMessage();
    resultCode = Node.RESULT_ERROR;
    closeAllOutputPorts();
    System.out.println("IO error in split:" + ex.getMessage());
    ex.printStackTrace();
    return;
    } catch (Exception ex)
    {
    resultMsg = ex.getMessage();
    resultCode = Node.RESULT_FATAL_ERROR;
    System.out.println("error in split:" + ex.getMessage());
    ex.printStackTrace();
    return;
    }
    }

    broadcastEOF();

    if (runIt) {
    resultMsg = "OK";
    } else
    {
    resultMsg = "STOPPED";
    }
    resultCode = Node.RESULT_OK;
    }

    public boolean checkConfig() {
    return true;
    }

    }


    i made this entry in component factory class

    registerComponent(SplitRecord.COMPONENT_TYPE,"org.jetel.component.SplitRecord");


    so
    there is two thing wrong here
    1) though there is output port in INPUT node
    the input node can't initialise due to it not get any output port

    2) graphNode.setPhase(phaseNum);
    instruction in org.jetel.graph.TransformationGraphXMLReaderWriter.instantiateNodes() function throws nullpontexception

    if any body figure out problem then inform me

    thanks in advance
  • Avatar
    oldforum
    0
    Comment actions Permalink
    Creating a new data record is easy. Following example shows how to create metadata object first and then how to create data record based on this:

    -----------------
    DataRecordMetadata metadata=new DataRecordMetadata("TestInput",DataRecordMetadata.DELIMITED_RECORD);

    metadata.addField(new DataFieldMetadata("Name",DataFieldMetadata.STRING_FIELD, ";"));
    metadata.addField(new DataFieldMetadata("Age",DataFieldMetadata.NUMERIC_FIELD, "|"));
    metadata.addField(new DataFieldMetadata("City",DataFieldMetadata.STRING_FIELD, "\n"));

    DataRecord record = new DataRecord(metadata);
    record.init();

    // assign value to Name field:
    record.getField(0).setValue("John Brown");

    // assign value to Age field:
    record.getField("Age").setValue(31);

    -----------------
    Note: Unless you want to use the record
    to be output to text file, it does not matter
    whether you create DELIMITED_RECORD
    and which delimiters you assign to fields - any
    character(s) will work.

    Internally, the data (record) is stored as
    variable-length data structure. You may
    later redefine the (text) formatting by
    creating record with the same structure but
    different delimiters.

    For info about custom components building, see "Step-by-step component building " on
    Clover's web site. Documentation section.

Please sign in to leave a comment.