use of org.knime.core.node.streamable.simple.SimpleStreamableOperatorInternals in project knime-core by knime.
the class RuleEngineFilter2PortsNodeModel method execute.
/**
* {@inheritDoc}
*/
@Override
protected BufferedDataTable[] execute(final BufferedDataTable[] inData, final ExecutionContext exec) throws Exception {
BufferedDataTable ruleTable = inData[RuleEngine2PortsNodeModel.RULE_PORT];
BufferedDataTable dataTable = inData[RuleEngine2PortsNodeModel.DATA_PORT];
// m_rulesList.clear();
// m_rulesList.addAll(RuleEngineVariable2PortsNodeModel.rules(ruleTable, m_settings, RuleNodeSettings.RuleFilter));
// final List<Rule> rules = parseRules(dataTable.getDataTableSpec(), RuleNodeSettings.RuleFilter);
final BufferedDataContainer first = exec.createDataContainer(dataTable.getDataTableSpec(), true);
final int nrOutPorts = getNrOutPorts();
final RowAppender second = nrOutPorts > 1 ? exec.createDataContainer(dataTable.getDataTableSpec(), true) : new RowAppender() {
@Override
public void addRowToTable(final DataRow row) {
// do nothing
}
};
// final RowAppender[] containers = new RowAppender[]{first, second};
// final int matchIndex = m_includeOnMatch ? 0 : 1;
// final int otherIndex = 1 - matchIndex;
//
final BufferedDataTable[] ret = new BufferedDataTable[nrOutPorts];
// try {
// final MutableLong rowIdx = new MutableLong();
// final long rows = inData[DATA_PORT].size();
// final VariableProvider provider = new VariableProvider() {
// @Override
// public Object readVariable(final String name, final Class<?> type) {
// return RuleEngineFilter2PortsNodeModel.this.readVariable(name, type);
// }
//
// @Override
// @Deprecated
// public int getRowCount() {
// throw new UnsupportedOperationException();
// }
//
// @Override
// public long getRowCountLong() {
// return rows;
// }
//
// @Override
// @Deprecated
// public int getRowIndex() {
// throw new UnsupportedOperationException();
// }
//
// @Override
// public long getRowIndexLong() {
// return rowIdx.longValue();
// }
// };
// for (DataRow row : inData[DATA_PORT]) {
// rowIdx.increment();
// exec.setProgress(rowIdx.longValue() / (double)rows, "Adding row " + rowIdx.longValue() + " of " + rows);
// exec.checkCanceled();
// boolean wasMatch = false;
// for (final Rule r : rules) {
// if (r.getCondition().matches(row, provider).getOutcome() == MatchState.matchedAndStop) {
// // r.getSideEffect().perform(row, provider);
// DataValue value = r.getOutcome().getComputedResult(row, provider);
// if (value instanceof BooleanValue) {
// final BooleanValue bv = (BooleanValue)value;
// containers[bv.getBooleanValue() ? matchIndex : otherIndex].addRowToTable(row);
// } else {
// containers[matchIndex].addRowToTable(row);
// }
// wasMatch = true;
// break;
// }
// }
// if (!wasMatch) {
// containers[otherIndex].addRowToTable(row);
// }
// }
// } finally {
// first.close();
// ret[0] = first.getTable();
// if (second instanceof BufferedDataContainer) {
// BufferedDataContainer container = (BufferedDataContainer)second;
// container.close();
// ret[1] = container.getTable();
// }
// }
final PortOutput[] outputs = new PortOutput[] { new BufferedDataTableRowOutput(first), new RowAppenderRowOutput(second) };
final StreamableOperator streamableOperator = createStreamableOperator(new PartitionInfo(0, 1), new DataTableSpec[] { inData[0].getSpec(), inData[1].getSpec() });
final PortInput[] inputs = new PortInput[] { new DataTableRowInput(dataTable), new DataTableRowInput(ruleTable) };
final SimpleStreamableOperatorInternals internals = new SimpleStreamableOperatorInternals();
internals.getConfig().addLong(CFG_ROW_COUNT, dataTable.size());
streamableOperator.loadInternals(internals);
streamableOperator.runFinal(inputs, outputs, exec);
ret[0] = first.getTable();
if (ret.length > 1) {
ret[1] = ((BufferedDataContainer) second).getTable();
}
return ret;
}
use of org.knime.core.node.streamable.simple.SimpleStreamableOperatorInternals in project knime-core by knime.
the class RuleEngineFilter2PortsNodeModel method createStreamableOperator.
/**
* {@inheritDoc}
*/
@Override
public StreamableOperator createStreamableOperator(final PartitionInfo partitionInfo, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
return new StreamableOperator() {
private SimpleStreamableOperatorInternals m_internals;
/**
* {@inheritDoc}
*/
@Override
public void loadInternals(final StreamableOperatorInternals internals) {
m_internals = (SimpleStreamableOperatorInternals) internals;
}
/**
* {@inheritDoc}
*/
@Override
public void runIntermediate(final PortInput[] inputs, final ExecutionContext exec) throws Exception {
// count number of rows
long count = 0;
RowInput rowInput = (RowInput) inputs[DATA_PORT];
while (rowInput.poll() != null) {
count++;
}
m_internals.getConfig().addLong(CFG_ROW_COUNT, count);
}
/**
* {@inheritDoc}
*/
@Override
public StreamableOperatorInternals saveInternals() {
return m_internals;
}
@Override
public void runFinal(final PortInput[] inputs, final PortOutput[] outputs, final ExecutionContext exec) throws Exception {
long rowCount = -1L;
if (m_internals.getConfig().containsKey(CFG_ROW_COUNT)) {
rowCount = m_internals.getConfig().getLong(CFG_ROW_COUNT);
}
m_rulesList.clear();
final PortInput rulePort = inputs[RULE_PORT];
if (rulePort instanceof PortObjectInput) {
PortObjectInput poRule = (PortObjectInput) rulePort;
m_rulesList.addAll(RuleEngineVariable2PortsNodeModel.rules((BufferedDataTable) poRule.getPortObject(), m_settings, RuleNodeSettings.RuleFilter));
} else if (rulePort instanceof RowInput) {
RowInput riRule = (RowInput) rulePort;
m_rulesList.addAll(RuleEngineVariable2PortsNodeModel.rules(riRule, m_settings, RuleNodeSettings.RuleFilter));
}
final DataTableSpec spec = (DataTableSpec) inSpecs[DATA_PORT];
try {
parseRules(spec, RuleNodeSettings.RuleSplitter);
} catch (final ParseException e) {
throw new InvalidSettingsException(e);
}
final RowInput inputPartitions = (RowInput) inputs[DATA_PORT];
final List<Rule> rules = parseRules(inputPartitions.getDataTableSpec(), RuleNodeSettings.RuleFilter);
final RowOutput first = (RowOutput) outputs[0];
final int nrOutPorts = getNrOutPorts();
final RowOutput second = nrOutPorts > 1 ? (RowOutput) outputs[1] : new RowOutput() {
@Override
public void push(final DataRow row) throws InterruptedException {
// do nothing
}
@Override
public void close() throws InterruptedException {
// do nothing
}
};
final RowOutput[] containers = new RowOutput[] { first, second };
final int matchIndex = m_includeOnMatch ? 0 : 1;
final int otherIndex = 1 - matchIndex;
try {
final MutableLong rowIdx = new MutableLong(0L);
final long rows = rowCount;
final VariableProvider provider = new VariableProvider() {
@Override
public Object readVariable(final String name, final Class<?> type) {
return RuleEngineFilter2PortsNodeModel.this.readVariable(name, type);
}
@Override
@Deprecated
public int getRowCount() {
throw new UnsupportedOperationException();
}
@Override
public long getRowCountLong() {
return rows;
}
@Override
@Deprecated
public int getRowIndex() {
throw new UnsupportedOperationException();
}
@Override
public long getRowIndexLong() {
return rowIdx.longValue();
}
};
DataRow row;
while ((row = inputPartitions.poll()) != null) {
rowIdx.increment();
if (rows > 0) {
exec.setProgress(rowIdx.longValue() / (double) rows, () -> "Adding row " + rowIdx.longValue() + " of " + rows);
} else {
exec.setMessage(() -> "Adding row " + rowIdx.longValue() + " of " + rows);
}
exec.checkCanceled();
boolean wasMatch = false;
for (Rule r : rules) {
if (r.getCondition().matches(row, provider).getOutcome() == MatchState.matchedAndStop) {
// r.getSideEffect().perform(row, provider);
DataValue value = r.getOutcome().getComputedResult(row, provider);
if (value instanceof BooleanValue) {
final BooleanValue bv = (BooleanValue) value;
containers[bv.getBooleanValue() ? matchIndex : otherIndex].push(row);
} else {
containers[matchIndex].push(row);
}
wasMatch = true;
break;
}
}
if (!wasMatch) {
containers[otherIndex].push(row);
}
}
} finally {
try {
second.close();
} finally {
first.close();
}
}
}
};
}
use of org.knime.core.node.streamable.simple.SimpleStreamableOperatorInternals in project knime-core by knime.
the class RuleEngineNodeModel method createStreamableOperator.
/**
* {@inheritDoc}
*/
@Override
public StreamableOperator createStreamableOperator(final PartitionInfo partitionInfo, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
final DataTableSpec spec = (DataTableSpec) inSpecs[0];
final List<Rule> parsedRules;
try {
parsedRules = parseRules(spec, RuleNodeSettings.RuleEngine);
} catch (final ParseException e) {
throw new InvalidSettingsException(e);
}
return new StreamableOperator() {
private SimpleStreamableOperatorInternals m_internals;
/**
* {@inheritDoc}
*/
@Override
public void loadInternals(final StreamableOperatorInternals internals) {
m_internals = (SimpleStreamableOperatorInternals) internals;
}
/**
* {@inheritDoc}
*/
@Override
public void runIntermediate(final PortInput[] inputs, final ExecutionContext exec) throws Exception {
// count number of rows
long count = 0;
RowInput rowInput = (RowInput) inputs[0];
while (rowInput.poll() != null) {
count++;
}
m_internals.getConfig().addLong(CFG_ROW_COUNT, count);
}
/**
* {@inheritDoc}
*/
@Override
public StreamableOperatorInternals saveInternals() {
return m_internals;
}
@Override
public void runFinal(final PortInput[] inputs, final PortOutput[] outputs, final ExecutionContext exec) throws Exception {
long rowCount = -1L;
if (m_internals.getConfig().containsKey(CFG_ROW_COUNT)) {
rowCount = m_internals.getConfig().getLong(CFG_ROW_COUNT);
}
createRearranger(((RowInput) inputs[0]).getDataTableSpec(), parsedRules, rowCount, false).createStreamableFunction(0, 0).runFinal(inputs, outputs, exec);
}
};
}
use of org.knime.core.node.streamable.simple.SimpleStreamableOperatorInternals in project knime-core by knime.
the class StringToDurationPeriodNodeModel method createInitialStreamableOperatorInternals.
@Override
public StreamableOperatorInternals createInitialStreamableOperatorInternals() {
final SimpleStreamableOperatorInternals simpleStreamableOperatorInternals = new SimpleStreamableOperatorInternals();
simpleStreamableOperatorInternals.getConfig().addBoolean("needsIteration", true);
simpleStreamableOperatorInternals.getConfig().addInt("sizeRow", 0);
return simpleStreamableOperatorInternals;
}
use of org.knime.core.node.streamable.simple.SimpleStreamableOperatorInternals in project knime-core by knime.
the class StringToDurationPeriodNodeModel method computeFinalOutputSpecs.
@Override
public PortObjectSpec[] computeFinalOutputSpecs(final StreamableOperatorInternals internals, final PortObjectSpec[] inSpecs) throws InvalidSettingsException {
if (m_type.getStringValue().equals(OutputType.Automatic.name())) {
final SimpleStreamableOperatorInternals simpleInternals = (SimpleStreamableOperatorInternals) internals;
final Config config = simpleInternals.getConfig();
final DataColumnSpec[] colSpecs = new DataColumnSpec[config.getInt("sizeRow")];
for (int i = 0; i < colSpecs.length; i++) {
final DataColumnSpecCreator dataColumnSpecCreator = new DataColumnSpecCreator(config.getString("colname" + i), config.getDataType("type" + i));
colSpecs[i] = dataColumnSpecCreator.createSpec();
}
return new DataTableSpec[] { new DataTableSpec(colSpecs) };
} else {
return configure(new DataTableSpec[] { (DataTableSpec) inSpecs[0] });
}
}
Aggregations