/** * Finds all source jobs/components for a particular job/component. This * method uses {@link Object} as types because input and output can be quite * polymorphic. Typically {@link InputColumnSinkJob}, * {@link InputColumnSourceJob}, {@link HasComponentRequirement} and * {@link OutcomeSourceJob} implementations are used. * * @param job * typically some {@link InputColumnSinkJob} * @return a list of jobs/components that are a source of this job. */ public Set<Object> findAllSourceJobs(final Object job) { final Set<Object> result = new HashSet<>(); findAllSourceJobs(job, result); return result; }
public static boolean hasFilterPresent(final SourceColumnFinder scf, final ComponentBuilder acb) { return scf.findAllSourceJobs(acb).stream().filter(o -> o instanceof HasFilterOutcomes).findAny().isPresent(); } }
private static Set<HasComponentRequirement> buildSourceJobsOfInputColumns( final InputColumnSinkJob inputColumnSinkJob, final SourceColumnFinder sourceColumnFinder) { final Set<HasComponentRequirement> result = new HashSet<>(); final Set<Object> sourceJobsOfInputColumns = sourceColumnFinder.findAllSourceJobs(inputColumnSinkJob); for (final Iterator<Object> it = sourceJobsOfInputColumns.iterator(); it.hasNext(); ) { final Object sourceJob = it.next(); if (sourceJob instanceof HasComponentRequirement && sourceJob instanceof InputColumnSourceJob) { final HasComponentRequirement sourceOutcomeSinkJob = (HasComponentRequirement) sourceJob; final ComponentRequirement componentRequirement = sourceOutcomeSinkJob.getComponentRequirement(); if (componentRequirement != null) { result.add(sourceOutcomeSinkJob); } } } return result; }
final boolean added = result.add(source); if (added) { findAllSourceJobs(source, result); final HasComponentRequirement hasComponentRequirement = (HasComponentRequirement) job; final ComponentRequirement requirement = hasComponentRequirement.getComponentRequirement(); findAllSourceJobs(requirement, result); final boolean added = result.add(source); if (added) { findAllSourceJobs(source, result);
/** * Gets all available {@link InputColumn}s of a particular type to map to a * particular {@link ComponentBuilder} * * @param componentBuilder * @param dataType * @return */ public List<InputColumn<?>> getAvailableInputColumns(final ComponentBuilder componentBuilder, final Class<?> dataType) { List<InputColumn<?>> result = getAvailableInputColumns(dataType); final SourceColumnFinder finder = new SourceColumnFinder(); finder.addSources(this); result = CollectionUtils.filter(result, inputColumn -> { if (inputColumn.isPhysicalColumn()) { return true; } final InputColumnSourceJob origin = finder.findInputColumnSource(inputColumn); if (origin == null) { return true; } if (origin == componentBuilder) { // exclude columns from the component itself return false; } final Set<Object> sourceComponents = finder.findAllSourceJobs(origin); return !sourceComponents.contains(componentBuilder); }); return result; }
final Set<Object> excludedSet = sourceColumnFinder.findAllSourceJobs(defaultRequirement);
sourceColumnFinder.findAllSourceJobs(tjb).stream().filter(o -> o instanceof HasFilterOutcomes) .findAny().isPresent();