use of org.pentaho.metaverse.api.IComponentDescriptor in project pentaho-metaverse by pentaho.
the class TransExecutorStepAnalyzer method linkResultFieldToSubTrans.
/**
* Checks to see if the sub trans has any RowToResult steps in it.
* If so, it will link the fields it outputs to the fields created by this step and are sent to the
* "target step for output rows".
*
* @param streamFieldNode stream field node sent to the step defined as "target step for output rows"
* @param subTransMeta TransMeta of the transformation to be executed by the TransExecutor step
* @param subTransNode IMetaverseNode representing the sub-transformation to be executed
* @param descriptor Descriptor to use as a basis for any nodes created
*/
protected void linkResultFieldToSubTrans(IMetaverseNode streamFieldNode, TransMeta subTransMeta, IMetaverseNode subTransNode, IComponentDescriptor descriptor) {
List<StepMeta> steps = subTransMeta.getSteps();
if (!CollectionUtils.isEmpty(steps)) {
for (StepMeta step : steps) {
if (step.getStepMetaInterface() instanceof RowsToResultMeta) {
RowsToResultMeta rtrm = (RowsToResultMeta) step.getStepMetaInterface();
// Create a new descriptor for the RowsToResult step.
IComponentDescriptor stepDescriptor = new MetaverseComponentDescriptor(step.getName(), DictionaryConst.NODE_TYPE_TRANS_STEP, subTransNode, descriptor.getContext());
// Create a new node for the step, to be used as the parent of the the field we want to link to
IMetaverseNode subTransStepNode = createNodeFromDescriptor(stepDescriptor);
try {
RowMetaInterface rowMetaInterface = rtrm.getParentStepMeta().getParentTransMeta().getStepFields(step);
for (int i = 0; i < rowMetaInterface.getFieldNames().length; i++) {
String field = rowMetaInterface.getFieldNames()[i];
if (streamFieldNode.getName().equals(field)) {
// Create the descriptor for the trans field that is derived from the incoming result field
IComponentDescriptor stepFieldDescriptor = new MetaverseComponentDescriptor(field, DictionaryConst.NODE_TYPE_TRANS_FIELD, subTransStepNode, descriptor.getContext());
// Create the node
// IMetaverseNode subTransField = createNodeFromDescriptor( stepFieldDescriptor );
IMetaverseNode subTransField = createFieldNode(stepFieldDescriptor, rowMetaInterface.getValueMeta(i), StepAnalyzer.NONE, false);
// Add the link
metaverseBuilder.addLink(subTransField, DictionaryConst.LINK_DERIVES, streamFieldNode);
// no need to keep looking for a match on field name, we just handled it.
continue;
}
}
} catch (KettleStepException e) {
log.warn("Could not get step fields of RowsToResult step in sub transformation - " + subTransMeta.getName(), e);
}
}
}
}
}
use of org.pentaho.metaverse.api.IComponentDescriptor in project pentaho-metaverse by pentaho.
the class TransExecutorStepAnalyzer method linkUsedFieldToSubTrans.
/**
* Checks to see if the sub trans has any RowFromResult steps in it.
* If so, it will link the original field node to the fields created in the RowFromResult step in the sub trans
*
* @param originalFieldNode incoming stream field node to the TransExecutorStep
* @param subTransMeta TransMeta of the transformation to be executed by the TransExecutor step
* @param subTransNode IMetaverseNode representing the sub-transformation to be executed
* @param descriptor Descriptor to use as a basis
*/
protected void linkUsedFieldToSubTrans(IMetaverseNode originalFieldNode, TransMeta subTransMeta, IMetaverseNode subTransNode, IComponentDescriptor descriptor) {
List<StepMeta> steps = subTransMeta.getSteps();
if (!CollectionUtils.isEmpty(steps)) {
for (StepMeta step : steps) {
if (step.getStepMetaInterface() instanceof RowsFromResultMeta) {
RowsFromResultMeta rfrm = (RowsFromResultMeta) step.getStepMetaInterface();
// Create a new descriptor for the RowsFromResult step.
IComponentDescriptor stepDescriptor = new MetaverseComponentDescriptor(StepAnalyzer.NONE, DictionaryConst.NODE_TYPE_TRANS_STEP, subTransNode, descriptor.getContext());
// Create a new node for the step, to be used as the parent of the the field we want to link to
IMetaverseNode subTransStepNode = createNodeFromDescriptor(stepDescriptor);
try {
RowMetaInterface rowMetaInterface = rfrm.getParentStepMeta().getParentTransMeta().getStepFields(step);
for (int i = 0; i < rowMetaInterface.getFieldNames().length; i++) {
String field = rowMetaInterface.getFieldNames()[i];
if (originalFieldNode.getName().equals(field)) {
// Create the descriptor for the trans field that is derived from the incoming result field
IComponentDescriptor stepFieldDescriptor = new MetaverseComponentDescriptor(field, DictionaryConst.NODE_TYPE_TRANS_FIELD, subTransStepNode, descriptor.getContext());
// Create the node
IMetaverseNode subTransField = createFieldNode(stepFieldDescriptor, rowMetaInterface.getValueMeta(i), step.getName(), false);
// Add the link
metaverseBuilder.addLink(originalFieldNode, DictionaryConst.LINK_DERIVES, subTransField);
// no need to keep looking for a match on field name, we just handled it.
continue;
}
}
} catch (KettleStepException e) {
log.warn("Could not get step fields of RowsFromResult step in sub transformation - " + subTransMeta.getName(), e);
}
}
}
}
}
use of org.pentaho.metaverse.api.IComponentDescriptor in project pentaho-metaverse by pentaho.
the class StepAnalyzerTest method testGetInputFieldsWithException.
@Test
public void testGetInputFieldsWithException() {
analyzer = new StepAnalyzer() {
@Override
public void validateState(IComponentDescriptor descriptor, BaseStepMeta object) throws MetaverseAnalyzerException {
throw new MetaverseAnalyzerException("expected exception");
}
@Override
public Set<Class<? extends BaseStepMeta>> getSupportedSteps() {
return null;
}
@Override
protected Set getUsedFields(BaseStepMeta meta) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void customAnalyze(BaseStepMeta meta, IMetaverseNode rootNode) throws MetaverseAnalyzerException {
// TODO Auto-generated method stub
}
};
assertNull(analyzer.getInputFields(null));
}
use of org.pentaho.metaverse.api.IComponentDescriptor in project pentaho-metaverse by pentaho.
the class StepAnalyzerTest method testCreateFieldNode.
@Test
public void testCreateFieldNode() throws Exception {
IComponentDescriptor fieldDescriptor = mock(IComponentDescriptor.class);
ValueMetaInterface fieldMeta = new ValueMeta("address");
MetaverseTransientNode node = new MetaverseTransientNode("hello");
doReturn(node).when(analyzer).createNodeFromDescriptor(fieldDescriptor);
IMetaverseNode fieldNode = analyzer.createFieldNode(fieldDescriptor, fieldMeta, "nextStep", true);
assertNotNull(fieldNode);
assertNotNull(fieldNode.getProperty(DictionaryConst.PROPERTY_KETTLE_TYPE));
assertEquals("nextStep", fieldNode.getProperty(DictionaryConst.PROPERTY_TARGET_STEP));
// make sure it got added to the graph
verify(builder).addNode(node);
}
use of org.pentaho.metaverse.api.IComponentDescriptor in project pentaho-metaverse by pentaho.
the class BaseKettleMetaverseComponentTest method testCreateNodeFromDescriptor.
@Test
public void testCreateNodeFromDescriptor() throws Exception {
String namespaceId = "{namespace: 'my namespace', name: 'my name', type: 'my type'}";
ILogicalIdGenerator idGenerator = DictionaryConst.LOGICAL_ID_GENERATOR_DEFAULT;
IComponentDescriptor descriptor = mock(IComponentDescriptor.class);
INamespace ns = mock(INamespace.class);
when(descriptor.getParentNamespace()).thenReturn(mock(INamespace.class));
when(descriptor.getNamespace()).thenReturn(ns);
when(ns.getNamespaceId()).thenReturn(namespaceId);
component.metaverseObjectFactory = spy(new MetaverseObjectFactory());
IMetaverseNode node = component.createNodeFromDescriptor(descriptor, idGenerator);
assertNotNull(node);
assertTrue(node.getLogicalId().contains(namespaceId));
}
Aggregations