From 1cbd593732e2e6b92025bcc46deced0dcde9130a Mon Sep 17 00:00:00 2001 From: Andrey Khayrutdinov Date: Fri, 6 Mar 2015 16:37:09 +0400 Subject: [PATCH] [PDI-13545] - Records are lost when you copy from a mapping to a step with multiple copies --- .../di/trans/steps/mapping/Mapping.java | 64 +++-- .../trans/steps/mapping/MappingUnitTest.java | 96 +++++++ .../di/trans/steps/mapping/MappingTest.java | 51 ++++ .../steps/mapping/pdi-13545/pdi-13545-1.ktr | 240 ++++++++++++++++++ .../steps/mapping/pdi-13545/pdi-13545-2.ktr | 240 ++++++++++++++++++ .../mapping/pdi-13545/pdi-13545-internal.ktr | 142 +++++++++++ 6 files changed, 806 insertions(+), 27 deletions(-) create mode 100644 engine/test-src/org/pentaho/di/trans/steps/mapping/MappingUnitTest.java create mode 100644 testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-1.ktr create mode 100644 testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-2.ktr create mode 100644 testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-internal.ktr diff --git a/engine/src/org/pentaho/di/trans/steps/mapping/Mapping.java b/engine/src/org/pentaho/di/trans/steps/mapping/Mapping.java index 1f45e7c829be..86623dbea6d3 100644 --- a/engine/src/org/pentaho/di/trans/steps/mapping/Mapping.java +++ b/engine/src/org/pentaho/di/trans/steps/mapping/Mapping.java @@ -31,6 +31,7 @@ import java.util.Map.Entry; import java.util.Set; +import com.google.common.annotations.VisibleForTesting; import org.pentaho.di.core.Const; import org.pentaho.di.core.Result; import org.pentaho.di.core.RowSet; @@ -476,34 +477,9 @@ public void prepareMappingExecution() throws KettleException { mappingOutputSource = mappingOutputSteps[0]; } - // To what step in this transformation are we writing to? + // To what steps in this transformation are we writing to? // - StepInterface[] targetSteps; - if ( !Const.isEmpty( outputDefinition.getOutputStepname() ) ) { - // If we have a target step specification for the output of the mapping, - // we need to send it over there... - // - StepInterface target = getTrans().findRunThread( outputDefinition.getOutputStepname() ); - if ( target == null ) { - throw new KettleException( BaseMessages.getString( PKG, "MappingDialog.Exception.StepNameNotFound", - outputDefinition.getOutputStepname() ) ); - } - targetSteps = new StepInterface[] { target, }; - } else { - // No target step is specified. - // See if we can find the next steps in the transformation.. - // - List nextSteps = getTransMeta().findNextSteps( getStepMeta() ); - - // Let's send the data to all the next steps we find... - // The origin is the mapping output step - // The target is all the next steps after this mapping step. - // - targetSteps = new StepInterface[nextSteps.size()]; - for ( int s = 0; s < targetSteps.length; s++ ) { - targetSteps[s] = getTrans().findRunThread( nextSteps.get( s ).getName() ); - } - } + StepInterface[] targetSteps = pickupTargetStepsFor( outputDefinition ); // Now tell the mapping output step where to look... // Also explain the mapping output steps how to rename the values back... @@ -523,6 +499,40 @@ public void prepareMappingExecution() throws KettleException { getTrans().getActiveSubtransformations().put( getStepname(), getData().getMappingTrans() ); } + @VisibleForTesting StepInterface[] pickupTargetStepsFor( MappingIODefinition outputDefinition ) + throws KettleException { + List result; + if ( !Const.isEmpty( outputDefinition.getOutputStepname() ) ) { + // If we have a target step specification for the output of the mapping, + // we need to send it over there... + // + result = getTrans().findStepInterfaces( outputDefinition.getOutputStepname() ); + if ( Const.isEmpty( result ) ) { + throw new KettleException( BaseMessages.getString( PKG, "MappingDialog.Exception.StepNameNotFound", + outputDefinition.getOutputStepname() ) ); + } + } else { + // No target step is specified. + // See if we can find the next steps in the transformation.. + // + List nextSteps = getTransMeta().findNextSteps( getStepMeta() ); + + // Let's send the data to all the next steps we find... + // The origin is the mapping output step + // The target is all the next steps after this mapping step. + // + result = new ArrayList(); + for ( StepMeta nextStep : nextSteps ) { + // need to take into the account different copies of the step + List copies = getTrans().findStepInterfaces( nextStep.getName() ); + if ( copies != null ) { + result.addAll( copies ); + } + } + } + return result.toArray( new StepInterface[ result.size() ] ); + } + void initTransFromMeta() throws KettleException { // Create the transformation from meta-data... // diff --git a/engine/test-src/org/pentaho/di/trans/steps/mapping/MappingUnitTest.java b/engine/test-src/org/pentaho/di/trans/steps/mapping/MappingUnitTest.java new file mode 100644 index 000000000000..a3551786d93f --- /dev/null +++ b/engine/test-src/org/pentaho/di/trans/steps/mapping/MappingUnitTest.java @@ -0,0 +1,96 @@ +/*! ****************************************************************************** + * + * Pentaho Data Integration + * + * Copyright (C) 2002-2015 by Pentaho : http://www.pentaho.com + * + ******************************************************************************* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +package org.pentaho.di.trans.steps.mapping; + +import org.junit.Before; +import org.junit.Test; +import org.pentaho.di.core.exception.KettleException; +import org.pentaho.di.trans.step.StepDataInterface; +import org.pentaho.di.trans.step.StepInterface; +import org.pentaho.di.trans.step.StepMeta; +import org.pentaho.di.trans.steps.StepMockUtil; +import org.pentaho.di.trans.steps.mock.StepMockHelper; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.matchers.JUnitMatchers.hasItems; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Andrey Khayrutdinov + */ +public class MappingUnitTest { + + private StepMockHelper mockHelper; + private Mapping mapping; + + @Before + public void setUp() throws Exception { + mockHelper = StepMockUtil.getStepMockHelper( MappingMeta.class, "MappingUnitTest" ); + mapping = + new Mapping( mockHelper.stepMeta, mockHelper.stepDataInterface, 0, mockHelper.transMeta, mockHelper.trans ); + } + + + @SuppressWarnings( "unchecked" ) + @Test + public void pickupTargetStepsFor_OutputIsNotDefined() throws Exception { + StepMeta singleMeta = new StepMeta( "single", null ); + StepMeta copiedMeta = new StepMeta( "copied", null ); + when( mockHelper.transMeta.findNextSteps( mockHelper.stepMeta ) ).thenReturn( asList( singleMeta, copiedMeta ) ); + + StepInterface single = mock( StepInterface.class ); + when( mockHelper.trans.findStepInterfaces( "single" ) ).thenReturn( singletonList( single ) ); + + StepInterface copy1 = mock( StepInterface.class ); + StepInterface copy2 = mock( StepInterface.class ); + when( mockHelper.trans.findStepInterfaces( "copied" ) ).thenReturn( asList( copy1, copy2 ) ); + + MappingIODefinition definition = new MappingIODefinition( null, null ); + StepInterface[] targetSteps = mapping.pickupTargetStepsFor( definition ); + + assertThat( asList( targetSteps ), hasItems( is( single ), is( copy1 ), is( copy2 ) ) ); + } + + @SuppressWarnings( "unchecked" ) + @Test + public void pickupTargetStepsFor_OutputIsDefined() throws Exception { + StepInterface copy1 = mock( StepInterface.class ); + StepInterface copy2 = mock( StepInterface.class ); + when( mockHelper.trans.findStepInterfaces( "copied" ) ).thenReturn( asList( copy1, copy2 ) ); + + MappingIODefinition definition = new MappingIODefinition( null, "copied" ); + StepInterface[] targetSteps = mapping.pickupTargetStepsFor( definition ); + + assertThat( asList( targetSteps ), hasItems( is( copy1 ), is( copy2 ) ) ); + } + + @Test(expected = KettleException.class) + public void pickupTargetStepsFor_OutputIsDefined_ThrowsExceptionIfFindsNone() throws Exception { + MappingIODefinition definition = new MappingIODefinition( null, "non-existing" ); + mapping.pickupTargetStepsFor( definition ); + } +} diff --git a/test/org/pentaho/di/trans/steps/mapping/MappingTest.java b/test/org/pentaho/di/trans/steps/mapping/MappingTest.java index 00b738a59f24..8aaba1f4bbee 100644 --- a/test/org/pentaho/di/trans/steps/mapping/MappingTest.java +++ b/test/org/pentaho/di/trans/steps/mapping/MappingTest.java @@ -250,4 +250,55 @@ public void testMapping_WhenSharingPreviousStepWithAnother() throws Exception { assertEquals( 0, trans.getErrors() ); } + + + /** + * This test case relates to PDI-13545. It executes a transformation with a Mapping step that is not configured + * manually with an outputStepname property and, therefore, it is set to be a mapping output step from the + * internal transformation. + * + * @throws Exception + */ + public void testMapping_WhenNextStepHasTwoCopies_AndOutputIsNotDefinedExplicitly() throws Exception { + runTransWhenMappingsIsFollowedByCopiedStep( + "testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/PDI-13545-1.ktr" ); + } + + /** + * This test case relates to PDI-13545. It executes a transformation with a Mapping step that is configured manually + * with an outputStepname property. + * + * @throws Exception + */ + public void testMapping_WhenNextStepHasTwoCopies_AndOutputIsDefinedExplicitly() throws Exception { + runTransWhenMappingsIsFollowedByCopiedStep( + "testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/PDI-13545-2.ktr" ); + } + + /** + * This method runs transformations related to PDI-13545.
The scenario is the following: there are two step + * generating data, the latter of which is a Mapping step. They are followed with a Join Rows step, that has two + * copies. The last in a row is a Dummy step, named "Last". Since both generating steps output 3 rows ([10, 20, 30] + * and [1, 2, 3] respectively), the last step must obtain 3*3=9 rows. + * + * @param transPath a path to transformation file + * @throws Exception + */ + private void runTransWhenMappingsIsFollowedByCopiedStep( String transPath ) throws Exception { + KettleEnvironment.init(); + + TransMeta transMeta = new TransMeta( transPath ); + transMeta.setTransformationType( TransMeta.TransformationType.Normal ); + + Trans trans = new Trans( transMeta ); + trans.prepareExecution( null ); + trans.startThreads(); + trans.waitUntilFinished(); + + assertEquals( 0, trans.getErrors() ); + + List list = trans.findBaseSteps( "Last" ); + assertEquals( 1, list.size() ); + assertEquals( 9, list.get( 0 ).getLinesRead() ); + } } diff --git a/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-1.ktr b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-1.ktr new file mode 100644 index 000000000000..15c69ce02100 --- /dev/null +++ b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-1.ktr @@ -0,0 +1,240 @@ + + + + pdi-13545-1 + + + + Normal + / + + + + + + + + + +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDTRANSNAMEYTRANSNAMESTATUSYSTATUSLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSSTARTDATEYSTARTDATEENDDATEYENDDATELOGDATEYLOGDATEDEPDATEYDEPDATEREPLAYDATEYREPLAYDATELOG_FIELDYLOG_FIELDEXECUTING_SERVERNEXECUTING_SERVEREXECUTING_USERNEXECUTING_USERCLIENTNCLIENT + + +
+ + +ID_BATCHYID_BATCHSEQ_NRYSEQ_NRLOGDATEYLOGDATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSINPUT_BUFFER_ROWSYINPUT_BUFFER_ROWSOUTPUT_BUFFER_ROWSYOUTPUT_BUFFER_ROWS + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATELOGGING_OBJECT_TYPEYLOGGING_OBJECT_TYPEOBJECT_NAMEYOBJECT_NAMEOBJECT_COPYYOBJECT_COPYREPOSITORY_DIRECTORYYREPOSITORY_DIRECTORYFILENAMEYFILENAMEOBJECT_IDYOBJECT_IDOBJECT_REVISIONYOBJECT_REVISIONPARENT_CHANNEL_IDYPARENT_CHANNEL_IDROOT_CHANNEL_IDYROOT_CHANNEL_ID + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSLOG_FIELDNLOG_FIELD + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATEMETRICS_DATEYMETRICS_DATEMETRICS_CODEYMETRICS_CODEMETRICS_DESCRIPTIONYMETRICS_DESCRIPTIONMETRICS_SUBJECTYMETRICS_SUBJECTMETRICS_TYPEYMETRICS_TYPEMETRICS_VALUEYMETRICS_VALUE + + + +
+ + 0.0 + 0.0 + + 10000 + 50 + 50 + N + Y + 50000 + Y + + N + 1000 + 100 + + + + + + + + + - + 2015/03/06 08:29:21.115 + - + 2015/03/06 08:29:21.115 + H4sIAAAAAAAAAAMAAAAAAAAAAAA= + N + + + + + CustomersJoin Rows (cartesian product)Y + Join Rows (cartesian product)Sorted MergeY + Sorted MergeLastY + messages-subjob.ktrJoin Rows (cartesian product)Y + + + Customers + DataGrid + + Y + + 1 + + none + + + + + CID + Integer + + + + + -1 + -1 + N + + + + 10 + 20 + 30 + + + + 236 + 97 + Y + + + + + Join Rows (cartesian product) + JoinRows + + N + + 2 + + none + + + %%java.io.tmpdir%% + out + 500 +
Customers
+ + + N + + = + + + + + + 428 + 161 + Y + +
+ + + Last + Dummy + + Y + + 1 + + none + + + + + 748 + 161 + Y + + + + + Sorted Merge + SortedMerge + + Y + + 1 + + none + + + + + CID + Y + + + + + 588 + 161 + Y + + + + + messages-subjob.ktr + Mapping + + N + + 1 + + none + + + filename + + + ${Internal.Transformation.Filename.Directory}/pdi-13545-internal.ktr + + + + + + + + Y + N + + + Y + + + N + N + + + 236 + 177 + Y + + + + + + + + N + + diff --git a/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-2.ktr b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-2.ktr new file mode 100644 index 000000000000..40277c05ed38 --- /dev/null +++ b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-2.ktr @@ -0,0 +1,240 @@ + + + + pdi-13545-2 + + + + Normal + / + + + + + +
+ + + +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDTRANSNAMEYTRANSNAMESTATUSYSTATUSLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSSTARTDATEYSTARTDATEENDDATEYENDDATELOGDATEYLOGDATEDEPDATEYDEPDATEREPLAYDATEYREPLAYDATELOG_FIELDYLOG_FIELDEXECUTING_SERVERNEXECUTING_SERVEREXECUTING_USERNEXECUTING_USERCLIENTNCLIENT + + +
+ + +ID_BATCHYID_BATCHSEQ_NRYSEQ_NRLOGDATEYLOGDATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSINPUT_BUFFER_ROWSYINPUT_BUFFER_ROWSOUTPUT_BUFFER_ROWSYOUTPUT_BUFFER_ROWS + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATELOGGING_OBJECT_TYPEYLOGGING_OBJECT_TYPEOBJECT_NAMEYOBJECT_NAMEOBJECT_COPYYOBJECT_COPYREPOSITORY_DIRECTORYYREPOSITORY_DIRECTORYFILENAMEYFILENAMEOBJECT_IDYOBJECT_IDOBJECT_REVISIONYOBJECT_REVISIONPARENT_CHANNEL_IDYPARENT_CHANNEL_IDROOT_CHANNEL_IDYROOT_CHANNEL_ID + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSLOG_FIELDNLOG_FIELD + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATEMETRICS_DATEYMETRICS_DATEMETRICS_CODEYMETRICS_CODEMETRICS_DESCRIPTIONYMETRICS_DESCRIPTIONMETRICS_SUBJECTYMETRICS_SUBJECTMETRICS_TYPEYMETRICS_TYPEMETRICS_VALUEYMETRICS_VALUE + + + +
+ + 0.0 + 0.0 + + 10000 + 50 + 50 + N + Y + 50000 + Y + + N + 1000 + 100 + + + + + + + + + - + 2015/03/06 08:32:10.499 + - + 2015/03/06 08:32:10.499 + H4sIAAAAAAAAAAMAAAAAAAAAAAA= + N + + + + + CustomersJoin Rows (cartesian product)Y + Join Rows (cartesian product)Sorted MergeY + Sorted MergeLastY + messages-subjob.ktrJoin Rows (cartesian product)Y + + + Customers + DataGrid + + Y + + 1 + + none + + + + + CID + Integer + + + + + -1 + -1 + N + + + + 10 + 20 + 30 + + + + 191 + 91 + Y + + + + + Join Rows (cartesian product) + JoinRows + + N + + 2 + + none + + + %%java.io.tmpdir%% + out + 500 +
Customers
+ + + N + + = + + + + + + 383 + 155 + Y + +
+ + + Last + Dummy + + Y + + 1 + + none + + + + + 703 + 155 + Y + + + + + Sorted Merge + SortedMerge + + Y + + 1 + + none + + + + + CID + Y + + + + + 543 + 155 + Y + + + + + messages-subjob.ktr + Mapping + + N + + 1 + + none + + + filename + + + ${Internal.Transformation.Filename.Directory}/pdi-13545-internal.ktr + + + + + + Mapping output specification + Join Rows (cartesian product) + N + N + + + Y + + + Y + Y + + + 191 + 171 + Y + + + + + + + + N + + diff --git a/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-internal.ktr b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-internal.ktr new file mode 100644 index 000000000000..8beeab51cf55 --- /dev/null +++ b/testfiles/org/pentaho/di/trans/steps/mapping/pdi-13545/pdi-13545-internal.ktr @@ -0,0 +1,142 @@ + + + + messages-subjob + + + + Normal + / + + + + + +
+ + + +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDTRANSNAMEYTRANSNAMESTATUSYSTATUSLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSSTARTDATEYSTARTDATEENDDATEYENDDATELOGDATEYLOGDATEDEPDATEYDEPDATEREPLAYDATEYREPLAYDATELOG_FIELDYLOG_FIELDEXECUTING_SERVERNEXECUTING_SERVEREXECUTING_USERNEXECUTING_USERCLIENTNCLIENT + + +
+ + +ID_BATCHYID_BATCHSEQ_NRYSEQ_NRLOGDATEYLOGDATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSINPUT_BUFFER_ROWSYINPUT_BUFFER_ROWSOUTPUT_BUFFER_ROWSYOUTPUT_BUFFER_ROWS + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATELOGGING_OBJECT_TYPEYLOGGING_OBJECT_TYPEOBJECT_NAMEYOBJECT_NAMEOBJECT_COPYYOBJECT_COPYREPOSITORY_DIRECTORYYREPOSITORY_DIRECTORYFILENAMEYFILENAMEOBJECT_IDYOBJECT_IDOBJECT_REVISIONYOBJECT_REVISIONPARENT_CHANNEL_IDYPARENT_CHANNEL_IDROOT_CHANNEL_IDYROOT_CHANNEL_ID + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATETRANSNAMEYTRANSNAMESTEPNAMEYSTEPNAMESTEP_COPYYSTEP_COPYLINES_READYLINES_READLINES_WRITTENYLINES_WRITTENLINES_UPDATEDYLINES_UPDATEDLINES_INPUTYLINES_INPUTLINES_OUTPUTYLINES_OUTPUTLINES_REJECTEDYLINES_REJECTEDERRORSYERRORSLOG_FIELDNLOG_FIELD + + +
+ +ID_BATCHYID_BATCHCHANNEL_IDYCHANNEL_IDLOG_DATEYLOG_DATEMETRICS_DATEYMETRICS_DATEMETRICS_CODEYMETRICS_CODEMETRICS_DESCRIPTIONYMETRICS_DESCRIPTIONMETRICS_SUBJECTYMETRICS_SUBJECTMETRICS_TYPEYMETRICS_TYPEMETRICS_VALUEYMETRICS_VALUE + + + +
+ + 0.0 + 0.0 + + 10000 + 50 + 50 + N + Y + 50000 + Y + + N + 1000 + 100 + + + + + + + + + - + 2015/03/03 13:13:37.999 + - + 2015/03/03 13:13:37.999 + H4sIAAAAAAAAAAMAAAAAAAAAAAA= + N + + + + + MessagesMapping output specificationY + + + Mapping output specification + MappingOutput + + Y + + 1 + + none + + + + + 256 + 192 + Y + + + + + Messages + DataGrid + + N + + 1 + + none + + + + + MID + Integer + + + + + -1 + -1 + N + + + + 1 + 2 + 3 + + + + 109 + 192 + Y + + + + + + + + N + +