This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new f29a4cb8da Issue #2382 : Add result files and log text options to
Simple Evaluation (#7962)
f29a4cb8da is described below
commit f29a4cb8daf01879e976329bb17a99c2a0faf775
Author: Matt Casters <[email protected]>
AuthorDate: Sat Aug 15 10:21:05 2026 +0200
Issue #2382 : Add result files and log text options to Simple Evaluation
(#7962)
Allow Simple Evaluation to check the number of result files and to look
for text snippets in the previous action's log, as a no-code alternative
to JavaScript previous_result checks.
---
.../ROOT/pages/workflow/actions/simpleeval.adoc | 46 ++++-
...pleval.hwf => 0010-simpleeval-log-contains.hwf} | 112 ++++++------
...val.hwf => 0010-simpleeval-nr-result-files.hwf} | 120 +++++++------
integration-tests/actions/files-0010/f1.txt | 0
integration-tests/actions/files-0010/f2.txt | 0
integration-tests/actions/files-0010/f3.txt | 0
integration-tests/actions/main-0010-simpleval.hwf | 121 ++++++++-----
.../actions/simpleeval/ActionSimpleEval.java | 42 ++++-
.../actions/simpleeval/ActionSimpleEvalDialog.java | 43 +++--
.../simpleeval/messages/messages_en_US.properties | 7 +-
.../actions/simpleeval/ActionSimpleEvalTest.java | 188 +++++++++++++++++++++
.../test/resources/simple-eval-log-text-action.xml | 31 ++++
.../resources/simple-eval-result-files-action.xml | 31 ++++
13 files changed, 574 insertions(+), 167 deletions(-)
diff --git
a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/simpleeval.adoc
b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/simpleeval.adoc
index 479765684c..d6f1a8cdbc 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/simpleeval.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/simpleeval.adoc
@@ -16,7 +16,7 @@ under the License.
////
:documentationPath: /workflow/actions/
:language: en_US
-:description: The Simple evaluation action evaluates contents of a variable or
a field in the result stream.
+:description: The Simple evaluation action evaluates a variable, a field in
the result stream, the number of result files, or log text from the previous
action.
:openvar: ${
:closevar: }
@@ -25,7 +25,7 @@ under the License.
== Description
-The `Simple evaluation` action evaluates contents or value of a variable or a
field in the result stream.
+The `Simple evaluation` action evaluates the contents of a variable, a field
in the result stream, the number of result files, or the log text of the
previous workflow action.
Connect two actions with the output of the Simple Evaluation.
@@ -44,9 +44,15 @@ The green (success) hop will be called if the condition was
evaluated successful
|Option|Description
|Action name|The name of the workflow action.
2+|Source
-|Evaluate|Evaluation type: field or variable.
-|Field name|The field to evaluate
-|Type|Data type.
+|Evaluate a|
+Evaluation type:
+
+* Field from previous result
+* Variable
+* Number of result files
+* Log text from previous result
+|Field name|The field to evaluate (only shown when evaluating a field)
+|Type|Data type (hidden when evaluating result files or log text)
2+|Success On
|Success when source variable set| The action will always success if the
source variable was set otherwise it will fail.
|Success condition a|
@@ -93,3 +99,33 @@ And remember: Once this variable is set, the variable keeps
existing, even when
|Success On: Success condition|Equal/Non equal/etc.|Select the condition to be
met for a successful result
|Success On: Value||Value to compare the field to
|===
+
+**Evaluating the number of result files**
+
+Use this to check how many files the previous action added to the workflow
result (for example after *Add filenames to result* or a pipeline that adds
files).
+
+The source is treated as a number. Typical conditions are equal to, greater
than, smaller than, or between.
+
+[options="header"]
+|===
+|Field|Value|Explanation
+|Source: Evaluate|Number of result files|Select this to evaluate how many
files the previous action added to the result
+|Success On: Success condition|Equal/Greater than/Between/etc.|Compare the
file count
+|Success On: Value||Expected number of result files
+|===
+
+**Evaluating log text from the previous result**
+
+Use this to verify that a previous pipeline or workflow action logged an
expected snippet, or that an unwanted snippet is absent.
+
+The source is the log text captured for the previous action. It is treated as
a string. Typical conditions are *If value contains* and *If value not
contains*. Regular expressions are also supported.
+
+This is a no-code alternative to checking the previous result log text in a
JavaScript action.
+
+[options="header"]
+|===
+|Field|Value|Explanation
+|Source: Evaluate|Log text from previous result|Select this to evaluate the
previous action's log text
+|Success On: Success condition|Contains/Not contains/Regex/etc.|Check for
presence or absence of a snippet
+|Success On: Value||The text snippet or regular expression to look for
+|===
diff --git a/integration-tests/actions/main-0010-simpleval.hwf
b/integration-tests/actions/0010-simpleeval-log-contains.hwf
similarity index 63%
copy from integration-tests/actions/main-0010-simpleval.hwf
copy to integration-tests/actions/0010-simpleeval-log-contains.hwf
index f6006fd2eb..d4b9ac0f12 100644
--- a/integration-tests/actions/main-0010-simpleval.hwf
+++ b/integration-tests/actions/0010-simpleeval-log-contains.hwf
@@ -18,59 +18,66 @@ limitations under the License.
-->
<workflow>
- <name>main-0010-simpleval</name>
+ <name>New workflow</name>
<name_sync_with_filename>Y</name_sync_with_filename>
- <description/>
- <extended_description/>
- <workflow_version/>
<created_user>-</created_user>
- <created_date>2021/05/05 18:31:44.849</created_date>
<modified_user>-</modified_user>
- <modified_date>2021/05/05 18:31:44.849</modified_date>
- <parameters>
- </parameters>
+ <created_date>2026/08/14 22:45:10.291</created_date>
+ <modified_date>2026/08/14 22:45:10.291</modified_date>
+ <parameters/>
<actions>
<action>
+ <repeat>N</repeat>
+ <schedulerType>0</schedulerType>
+ <intervalSeconds>0</intervalSeconds>
+ <intervalMinutes>60</intervalMinutes>
+ <DayOfMonth>1</DayOfMonth>
+ <weekDay>1</weekDay>
+ <minutes>0</minutes>
+ <hour>12</hour>
+ <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
<name>Start</name>
<description/>
<type>SPECIAL</type>
<attributes/>
- <DayOfMonth>1</DayOfMonth>
- <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
- <hour>12</hour>
- <intervalMinutes>60</intervalMinutes>
- <intervalSeconds>0</intervalSeconds>
- <minutes>0</minutes>
- <repeat>N</repeat>
- <schedulerType>0</schedulerType>
- <weekDay>1</weekDay>
- <parallel>N</parallel>
- <xloc>128</xloc>
+ <xloc>96</xloc>
<yloc>96</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
<action>
- <name>0010-simpleeval-stringequal-targetvar-unset.hwf</name>
+ <loglevel>Basic</loglevel>
+ <logsubject>Sentinel</logsubject>
+ <logmessage>ABC123</logmessage>
+ <name>Write to log</name>
<description/>
- <type>WORKFLOW</type>
+ <type>WRITE_TO_LOG</type>
<attributes/>
- <add_date>N</add_date>
- <add_time>N</add_time>
- <create_parent_folder>N</create_parent_folder>
- <exec_per_row>N</exec_per_row>
-
<filename>${PROJECT_HOME}/0010-simpleeval-stringequal-targetvar-unset.hwf</filename>
- <loglevel>Nothing</loglevel>
- <parameters>
- <pass_all_parameters>Y</pass_all_parameters>
- </parameters>
- <params_from_previous>N</params_from_previous>
- <run_configuration>local</run_configuration>
- <set_append_logfile>N</set_append_logfile>
- <set_logfile>N</set_logfile>
- <wait_until_finished>Y</wait_until_finished>
+ <xloc>224</xloc>
+ <yloc>96</yloc>
<parallel>N</parallel>
- <xloc>368</xloc>
+ <attributes_hac/>
+ </action>
+ <action>
+ <valuetype>logtext</valuetype>
+ <fieldtype>string</fieldtype>
+ <fieldname/>
+ <variablename/>
+ <mask/>
+ <comparevalue>ABC123</comparevalue>
+ <minvalue/>
+ <maxvalue/>
+ <successcondition>contains</successcondition>
+ <successwhenvarset>N</successwhenvarset>
+ <successbooleancondition>true</successbooleancondition>
+ <successnumbercondition>equal</successnumbercondition>
+ <name>Simple evaluation</name>
+ <description/>
+ <type>SIMPLE_EVAL</type>
+ <attributes/>
+ <xloc>352</xloc>
<yloc>96</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
<action>
@@ -78,48 +85,53 @@ limitations under the License.
<description/>
<type>SUCCESS</type>
<attributes/>
- <parallel>N</parallel>
- <xloc>656</xloc>
+ <xloc>480</xloc>
<yloc>96</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
<action>
+ <loglevel>Error</loglevel>
<name>Abort workflow</name>
<description/>
<type>ABORT</type>
<attributes/>
- <always_log_rows>N</always_log_rows>
- <message>Simple eval: String comparison to unset variable
failed</message>
+ <xloc>480</xloc>
+ <yloc>192</yloc>
<parallel>N</parallel>
- <xloc>368</xloc>
- <yloc>224</yloc>
<attributes_hac/>
</action>
</actions>
<hops>
<hop>
<from>Start</from>
- <to>0010-simpleeval-stringequal-targetvar-unset.hwf</to>
- <enabled>Y</enabled>
+ <to>Write to log</to>
<evaluation>Y</evaluation>
<unconditional>Y</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
- <from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
- <to>Success</to>
+ <from>Write to log</from>
+ <to>Simple evaluation</to>
+ <evaluation>Y</evaluation>
+ <unconditional>N</unconditional>
<enabled>Y</enabled>
+ </hop>
+ <hop>
+ <from>Simple evaluation</from>
+ <to>Success</to>
<evaluation>Y</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
- <from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
+ <from>Simple evaluation</from>
<to>Abort workflow</to>
- <enabled>Y</enabled>
<evaluation>N</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
</hops>
- <notepads>
- </notepads>
+ <notepads/>
<attributes/>
</workflow>
diff --git a/integration-tests/actions/main-0010-simpleval.hwf
b/integration-tests/actions/0010-simpleeval-nr-result-files.hwf
similarity index 58%
copy from integration-tests/actions/main-0010-simpleval.hwf
copy to integration-tests/actions/0010-simpleeval-nr-result-files.hwf
index f6006fd2eb..ec2a572537 100644
--- a/integration-tests/actions/main-0010-simpleval.hwf
+++ b/integration-tests/actions/0010-simpleeval-nr-result-files.hwf
@@ -18,59 +18,72 @@ limitations under the License.
-->
<workflow>
- <name>main-0010-simpleval</name>
+ <name>New workflow</name>
<name_sync_with_filename>Y</name_sync_with_filename>
- <description/>
- <extended_description/>
- <workflow_version/>
<created_user>-</created_user>
- <created_date>2021/05/05 18:31:44.849</created_date>
<modified_user>-</modified_user>
- <modified_date>2021/05/05 18:31:44.849</modified_date>
- <parameters>
- </parameters>
+ <created_date>2026/08/14 22:47:26.109</created_date>
+ <modified_date>2026/08/14 22:47:26.109</modified_date>
+ <parameters/>
<actions>
<action>
+ <repeat>N</repeat>
+ <schedulerType>0</schedulerType>
+ <intervalSeconds>0</intervalSeconds>
+ <intervalMinutes>60</intervalMinutes>
+ <DayOfMonth>1</DayOfMonth>
+ <weekDay>1</weekDay>
+ <minutes>0</minutes>
+ <hour>12</hour>
+ <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
<name>Start</name>
<description/>
<type>SPECIAL</type>
<attributes/>
- <DayOfMonth>1</DayOfMonth>
- <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
- <hour>12</hour>
- <intervalMinutes>60</intervalMinutes>
- <intervalSeconds>0</intervalSeconds>
- <minutes>0</minutes>
- <repeat>N</repeat>
- <schedulerType>0</schedulerType>
- <weekDay>1</weekDay>
+ <xloc>50</xloc>
+ <yloc>50</yloc>
<parallel>N</parallel>
- <xloc>128</xloc>
- <yloc>96</yloc>
<attributes_hac/>
</action>
<action>
- <name>0010-simpleeval-stringequal-targetvar-unset.hwf</name>
+ <arg_from_previous>N</arg_from_previous>
+ <delete_all_before>N</delete_all_before>
+ <include_subfolders>N</include_subfolders>
+ <fields>
+ <field>
+ <name>${PROJECT_HOME}/files-0010</name>
+ <filemask>.*\.txt$</filemask>
+ </field>
+ </fields>
+ <name>Add filenames to result</name>
<description/>
- <type>WORKFLOW</type>
+ <type>ADD_RESULT_FILENAMES</type>
<attributes/>
- <add_date>N</add_date>
- <add_time>N</add_time>
- <create_parent_folder>N</create_parent_folder>
- <exec_per_row>N</exec_per_row>
-
<filename>${PROJECT_HOME}/0010-simpleeval-stringequal-targetvar-unset.hwf</filename>
- <loglevel>Nothing</loglevel>
- <parameters>
- <pass_all_parameters>Y</pass_all_parameters>
- </parameters>
- <params_from_previous>N</params_from_previous>
- <run_configuration>local</run_configuration>
- <set_append_logfile>N</set_append_logfile>
- <set_logfile>N</set_logfile>
- <wait_until_finished>Y</wait_until_finished>
+ <xloc>208</xloc>
+ <yloc>48</yloc>
+ <parallel>N</parallel>
+ <attributes_hac/>
+ </action>
+ <action>
+ <valuetype>resultfiles</valuetype>
+ <fieldtype>number</fieldtype>
+ <fieldname/>
+ <variablename/>
+ <mask/>
+ <comparevalue>3</comparevalue>
+ <minvalue/>
+ <maxvalue/>
+ <successcondition>equal</successcondition>
+ <successwhenvarset>N</successwhenvarset>
+ <successbooleancondition>true</successbooleancondition>
+ <successnumbercondition>equal</successnumbercondition>
+ <name>Simple evaluation</name>
+ <description/>
+ <type>SIMPLE_EVAL</type>
+ <attributes/>
+ <xloc>400</xloc>
+ <yloc>48</yloc>
<parallel>N</parallel>
- <xloc>368</xloc>
- <yloc>96</yloc>
<attributes_hac/>
</action>
<action>
@@ -78,48 +91,53 @@ limitations under the License.
<description/>
<type>SUCCESS</type>
<attributes/>
+ <xloc>544</xloc>
+ <yloc>48</yloc>
<parallel>N</parallel>
- <xloc>656</xloc>
- <yloc>96</yloc>
<attributes_hac/>
</action>
<action>
+ <loglevel>Error</loglevel>
<name>Abort workflow</name>
<description/>
<type>ABORT</type>
<attributes/>
- <always_log_rows>N</always_log_rows>
- <message>Simple eval: String comparison to unset variable
failed</message>
+ <xloc>544</xloc>
+ <yloc>144</yloc>
<parallel>N</parallel>
- <xloc>368</xloc>
- <yloc>224</yloc>
<attributes_hac/>
</action>
</actions>
<hops>
<hop>
<from>Start</from>
- <to>0010-simpleeval-stringequal-targetvar-unset.hwf</to>
- <enabled>Y</enabled>
+ <to>Add filenames to result</to>
<evaluation>Y</evaluation>
<unconditional>Y</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
- <from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
- <to>Success</to>
+ <from>Add filenames to result</from>
+ <to>Simple evaluation</to>
+ <evaluation>Y</evaluation>
+ <unconditional>N</unconditional>
<enabled>Y</enabled>
+ </hop>
+ <hop>
+ <from>Simple evaluation</from>
+ <to>Success</to>
<evaluation>Y</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
- <from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
+ <from>Simple evaluation</from>
<to>Abort workflow</to>
- <enabled>Y</enabled>
<evaluation>N</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
</hops>
- <notepads>
- </notepads>
+ <notepads/>
<attributes/>
</workflow>
diff --git a/integration-tests/actions/files-0010/f1.txt
b/integration-tests/actions/files-0010/f1.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/integration-tests/actions/files-0010/f2.txt
b/integration-tests/actions/files-0010/f2.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/integration-tests/actions/files-0010/f3.txt
b/integration-tests/actions/files-0010/f3.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/integration-tests/actions/main-0010-simpleval.hwf
b/integration-tests/actions/main-0010-simpleval.hwf
index f6006fd2eb..45ef58b570 100644
--- a/integration-tests/actions/main-0010-simpleval.hwf
+++ b/integration-tests/actions/main-0010-simpleval.hwf
@@ -22,55 +22,54 @@ limitations under the License.
<name_sync_with_filename>Y</name_sync_with_filename>
<description/>
<extended_description/>
- <workflow_version/>
<created_user>-</created_user>
- <created_date>2021/05/05 18:31:44.849</created_date>
<modified_user>-</modified_user>
+ <created_date>2021/05/05 18:31:44.849</created_date>
<modified_date>2021/05/05 18:31:44.849</modified_date>
- <parameters>
- </parameters>
+ <workflow_version/>
+ <parameters/>
<actions>
<action>
+ <repeat>N</repeat>
+ <schedulerType>0</schedulerType>
+ <intervalSeconds>0</intervalSeconds>
+ <intervalMinutes>60</intervalMinutes>
+ <DayOfMonth>1</DayOfMonth>
+ <weekDay>1</weekDay>
+ <minutes>0</minutes>
+ <hour>12</hour>
+ <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
<name>Start</name>
<description/>
<type>SPECIAL</type>
<attributes/>
- <DayOfMonth>1</DayOfMonth>
- <doNotWaitOnFirstExecution>N</doNotWaitOnFirstExecution>
- <hour>12</hour>
- <intervalMinutes>60</intervalMinutes>
- <intervalSeconds>0</intervalSeconds>
- <minutes>0</minutes>
- <repeat>N</repeat>
- <schedulerType>0</schedulerType>
- <weekDay>1</weekDay>
- <parallel>N</parallel>
<xloc>128</xloc>
<yloc>96</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
<action>
- <name>0010-simpleeval-stringequal-targetvar-unset.hwf</name>
- <description/>
- <type>WORKFLOW</type>
- <attributes/>
+
<filename>${PROJECT_HOME}/0010-simpleeval-stringequal-targetvar-unset.hwf</filename>
+ <params_from_previous>N</params_from_previous>
+ <exec_per_row>N</exec_per_row>
+ <set_logfile>N</set_logfile>
<add_date>N</add_date>
<add_time>N</add_time>
- <create_parent_folder>N</create_parent_folder>
- <exec_per_row>N</exec_per_row>
-
<filename>${PROJECT_HOME}/0010-simpleeval-stringequal-targetvar-unset.hwf</filename>
<loglevel>Nothing</loglevel>
+ <set_append_logfile>N</set_append_logfile>
+ <create_parent_folder>N</create_parent_folder>
+ <wait_until_finished>Y</wait_until_finished>
<parameters>
<pass_all_parameters>Y</pass_all_parameters>
</parameters>
- <params_from_previous>N</params_from_previous>
<run_configuration>local</run_configuration>
- <set_append_logfile>N</set_append_logfile>
- <set_logfile>N</set_logfile>
- <wait_until_finished>Y</wait_until_finished>
- <parallel>N</parallel>
+ <name>0010-simpleeval-stringequal-targetvar-unset.hwf</name>
+ <description/>
+ <type>WORKFLOW</type>
+ <attributes/>
<xloc>368</xloc>
<yloc>96</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
<action>
@@ -78,21 +77,55 @@ limitations under the License.
<description/>
<type>SUCCESS</type>
<attributes/>
+ <xloc>576</xloc>
+ <yloc>320</yloc>
<parallel>N</parallel>
- <xloc>656</xloc>
- <yloc>96</yloc>
<attributes_hac/>
</action>
<action>
- <name>Abort workflow</name>
+ <filename>${PROJECT_HOME}/0010-simpleeval-log-contains.hwf</filename>
+ <params_from_previous>N</params_from_previous>
+ <exec_per_row>N</exec_per_row>
+ <set_logfile>N</set_logfile>
+ <add_date>N</add_date>
+ <add_time>N</add_time>
+ <set_append_logfile>N</set_append_logfile>
+ <create_parent_folder>N</create_parent_folder>
+ <wait_until_finished>Y</wait_until_finished>
+ <parameters>
+ <pass_all_parameters>Y</pass_all_parameters>
+ </parameters>
+ <run_configuration>local</run_configuration>
+ <name>0010-simpleeval-log-contains</name>
<description/>
- <type>ABORT</type>
+ <type>WORKFLOW</type>
<attributes/>
- <always_log_rows>N</always_log_rows>
- <message>Simple eval: String comparison to unset variable
failed</message>
+ <xloc>368</xloc>
+ <yloc>192</yloc>
<parallel>N</parallel>
+ <attributes_hac/>
+ </action>
+ <action>
+ <filename>${PROJECT_HOME}/0010-simpleeval-nr-result-files.hwf</filename>
+ <params_from_previous>N</params_from_previous>
+ <exec_per_row>N</exec_per_row>
+ <set_logfile>N</set_logfile>
+ <add_date>N</add_date>
+ <add_time>N</add_time>
+ <set_append_logfile>N</set_append_logfile>
+ <create_parent_folder>N</create_parent_folder>
+ <wait_until_finished>Y</wait_until_finished>
+ <parameters>
+ <pass_all_parameters>Y</pass_all_parameters>
+ </parameters>
+ <run_configuration>local</run_configuration>
+ <name>0010-simpleeval-nr-result-files</name>
+ <description/>
+ <type>WORKFLOW</type>
+ <attributes/>
<xloc>368</xloc>
- <yloc>224</yloc>
+ <yloc>320</yloc>
+ <parallel>N</parallel>
<attributes_hac/>
</action>
</actions>
@@ -100,26 +133,32 @@ limitations under the License.
<hop>
<from>Start</from>
<to>0010-simpleeval-stringequal-targetvar-unset.hwf</to>
- <enabled>Y</enabled>
<evaluation>Y</evaluation>
<unconditional>Y</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
<from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
- <to>Success</to>
- <enabled>Y</enabled>
+ <to>0010-simpleeval-log-contains</to>
<evaluation>Y</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
<hop>
- <from>0010-simpleeval-stringequal-targetvar-unset.hwf</from>
- <to>Abort workflow</to>
+ <from>0010-simpleeval-log-contains</from>
+ <to>0010-simpleeval-nr-result-files</to>
+ <evaluation>Y</evaluation>
+ <unconditional>N</unconditional>
<enabled>Y</enabled>
- <evaluation>N</evaluation>
+ </hop>
+ <hop>
+ <from>0010-simpleeval-nr-result-files</from>
+ <to>Success</to>
+ <evaluation>Y</evaluation>
<unconditional>N</unconditional>
+ <enabled>Y</enabled>
</hop>
</hops>
- <notepads>
- </notepads>
+ <notepads/>
<attributes/>
</workflow>
diff --git
a/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEval.java
b/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEval.java
index d96b3804ce..e25ba90a06 100644
---
a/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEval.java
+++
b/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEval.java
@@ -54,7 +54,10 @@ public class ActionSimpleEval extends ActionBase implements
Cloneable, IAction {
public enum ValueType implements IEnumHasCodeAndDescription {
FIELD("field", BaseMessages.getString(PKG,
"ActionSimpleEval.EvalPreviousField.Label")),
- VARIABLE("variable", BaseMessages.getString(PKG,
"ActionSimpleEval.EvalVariable.Label"));
+ VARIABLE("variable", BaseMessages.getString(PKG,
"ActionSimpleEval.EvalVariable.Label")),
+ RESULT_FILES(
+ "resultfiles", BaseMessages.getString(PKG,
"ActionSimpleEval.EvalResultFiles.Label")),
+ LOG_TEXT("logtext", BaseMessages.getString(PKG,
"ActionSimpleEval.EvalLogText.Label"));
private final String code;
private final String description;
@@ -421,12 +424,28 @@ public class ActionSimpleEval extends ActionBase
implements Cloneable, IAction {
}
sourcevalue = resolve(getVariableWithSpec());
break;
+ case RESULT_FILES:
+ int fileCount = result.getResultFiles() != null ?
result.getResultFiles().size() : 0;
+ sourcevalue = Integer.toString(fileCount);
+ break;
+ case LOG_TEXT:
+ sourcevalue = Const.NVL(result.getLogText(), "");
+ break;
default:
break;
}
if (isDetailed()) {
- logDetailed(BaseMessages.getString(PKG,
"ActionSimpleEval.Log.ValueToevaluate", sourcevalue));
+ if (valueType == ValueType.LOG_TEXT) {
+ logDetailed(
+ BaseMessages.getString(
+ PKG,
+ "ActionSimpleEval.Log.LogTextToEvaluate",
+ Integer.toString(sourcevalue.length())));
+ } else {
+ logDetailed(
+ BaseMessages.getString(PKG,
"ActionSimpleEval.Log.ValueToevaluate", sourcevalue));
+ }
}
boolean success = false;
@@ -437,7 +456,9 @@ public class ActionSimpleEval extends ActionBase implements
Cloneable, IAction {
String realMinValue = resolve(minValue);
String realMaxValue = resolve(maxValue);
- switch (fieldType) {
+ FieldType evaluationType = getEvaluationFieldType();
+
+ switch (evaluationType) {
case STRING:
switch (successStringCondition) {
case EQUAL: // equal
@@ -1144,6 +1165,21 @@ public class ActionSimpleEval extends ActionBase
implements Cloneable, IAction {
return fieldType;
}
+ /**
+ * Result files are always compared as a number. Log text is always compared
as a string.
+ *
+ * @return the field type actually used during evaluation
+ */
+ FieldType getEvaluationFieldType() {
+ if (valueType == ValueType.RESULT_FILES) {
+ return FieldType.NUMBER;
+ }
+ if (valueType == ValueType.LOG_TEXT) {
+ return FieldType.STRING;
+ }
+ return fieldType;
+ }
+
public SuccessStringCondition getSuccessStringCondition() {
return successStringCondition;
}
diff --git
a/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalDialog.java
b/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalDialog.java
index 2136607433..32bd8e17e2 100644
---
a/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalDialog.java
+++
b/plugins/actions/simpleeval/src/main/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalDialog.java
@@ -517,10 +517,11 @@ public class ActionSimpleEvalDialog extends ActionDialog {
}
private void refresh() {
- boolean evaluatepreviousRowField =
- ValueType.lookupDescription(wValueType.getText()) == ValueType.FIELD;
- boolean evaluateVariable =
- ValueType.lookupDescription(wValueType.getText()) ==
ValueType.VARIABLE;
+ ValueType selectedValueType =
ValueType.lookupDescription(wValueType.getText());
+ boolean evaluatepreviousRowField = selectedValueType == ValueType.FIELD;
+ boolean evaluateVariable = selectedValueType == ValueType.VARIABLE;
+ boolean evaluateResultFiles = selectedValueType == ValueType.RESULT_FILES;
+ boolean evaluateLogText = selectedValueType == ValueType.LOG_TEXT;
wlVariableName.setVisible(evaluateVariable);
wVariableName.setVisible(evaluateVariable);
wlFieldName.setVisible(evaluatepreviousRowField);
@@ -529,27 +530,32 @@ public class ActionSimpleEvalDialog extends ActionDialog {
wSuccessWhenSet.setVisible(evaluateVariable);
boolean successWhenSet = wSuccessWhenSet.getSelection() &&
evaluateVariable;
+ boolean showType = !successWhenSet && !evaluateResultFiles &&
!evaluateLogText;
- wlFieldType.setVisible(!successWhenSet);
- wFieldType.setVisible(!successWhenSet);
+ wlFieldType.setVisible(showType);
+ wFieldType.setVisible(showType);
boolean valueTypeDate =
- FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.DATE_TIME;
- wlMask.setVisible(!successWhenSet && valueTypeDate);
- wMask.setVisible(!successWhenSet && valueTypeDate);
+ showType && FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.DATE_TIME;
+ wlMask.setVisible(valueTypeDate);
+ wMask.setVisible(valueTypeDate);
- boolean valueTypeString =
FieldType.lookupDescription(wFieldType.getText()) == FieldType.STRING;
+ boolean valueTypeString =
+ evaluateLogText
+ || (showType && FieldType.lookupDescription(wFieldType.getText())
== FieldType.STRING);
wlSuccessStringCondition.setVisible(!successWhenSet && valueTypeString);
wSuccessStringCondition.setVisible(!successWhenSet && valueTypeString);
boolean valueTypeNumber =
- FieldType.lookupDescription(wFieldType.getText()) == FieldType.NUMBER
- || FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.DATE_TIME;
+ evaluateResultFiles
+ || (showType
+ && (FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.NUMBER
+ || FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.DATE_TIME));
wlSuccessNumberCondition.setVisible(!successWhenSet && valueTypeNumber);
wSuccessNumberCondition.setVisible(!successWhenSet && valueTypeNumber);
boolean valueTypeBoolean =
- FieldType.lookupDescription(wFieldType.getText()) == FieldType.BOOLEAN;
+ showType && FieldType.lookupDescription(wFieldType.getText()) ==
FieldType.BOOLEAN;
wlSuccessBooleanCondition.setVisible(!successWhenSet && valueTypeBoolean);
wSuccessBooleanCondition.setVisible(!successWhenSet && valueTypeBoolean);
@@ -583,10 +589,17 @@ public class ActionSimpleEvalDialog extends ActionDialog {
}
action.setName(wName.getText());
- action.setValueType(ValueType.lookupDescription(wValueType.getText()));
+ ValueType valueType = ValueType.lookupDescription(wValueType.getText());
+ action.setValueType(valueType);
action.setFieldName(wFieldName.getText());
action.setVariableName(wVariableName.getText());
- action.setFieldType(FieldType.lookupDescription(wFieldType.getText()));
+ if (valueType == ValueType.RESULT_FILES) {
+ action.setFieldType(FieldType.NUMBER);
+ } else if (valueType == ValueType.LOG_TEXT) {
+ action.setFieldType(FieldType.STRING);
+ } else {
+ action.setFieldType(FieldType.lookupDescription(wFieldType.getText()));
+ }
action.setMask(wMask.getText());
action.setCompareValue(wCompareValue.getText());
action.setMinValue(wMinValue.getText());
diff --git
a/plugins/actions/simpleeval/src/main/resources/org/apache/hop/workflow/actions/simpleeval/messages/messages_en_US.properties
b/plugins/actions/simpleeval/src/main/resources/org/apache/hop/workflow/actions/simpleeval/messages/messages_en_US.properties
index a2341fc191..41f4a021d3 100644
---
a/plugins/actions/simpleeval/src/main/resources/org/apache/hop/workflow/actions/simpleeval/messages/messages_en_US.properties
+++
b/plugins/actions/simpleeval/src/main/resources/org/apache/hop/workflow/actions/simpleeval/messages/messages_en_US.properties
@@ -20,7 +20,7 @@
ActionSimpleEval.CheckingVariable=Checking variable [{0}] ...
ActionSimpleEval.CompareValue.Label=Value
ActionSimpleEval.CompareValue.Tooltip=Value
-ActionSimpleEval.Description=Evaluate one field or variable
+ActionSimpleEval.Description=Evaluate a field, variable, result files or log
text
ActionSimpleEval.Error.FieldNotExist=We can not field [{0}] in the previous
action result\!
ActionSimpleEval.Error.IncorrectDates=Incorrect dates\! {0} (min) must be
before {1} (max)\!
ActionSimpleEval.Error.IncorrectNumbers=Incorrect numbers\! [{0}] (min) must
be before [{1}] (max)\!
@@ -29,7 +29,9 @@ ActionSimpleEval.Error.UnparsableBoolean=Error converting to
boolean value [{0}]
ActionSimpleEval.Error.UnparsableDate=Can not convert value {0} to date\!
ActionSimpleEval.Error.UnparsableNumber=Can not convert value [{0}] to
number\! {1}
ActionSimpleEval.Error.VariableMissing=Variable name is missing\!
+ActionSimpleEval.EvalLogText.Label=Log text from previous result
ActionSimpleEval.EvalPreviousField.Label=Field from previous result
+ActionSimpleEval.EvalResultFiles.Label=Number of result files
ActionSimpleEval.EvalVariable.Label=Variable
ActionSimpleEval.FieldName.Label=Field name
ActionSimpleEval.FieldName.Tooltip=Field name
@@ -38,10 +40,11 @@ ActionSimpleEval.FieldTypeBoolean.Label=Boolean
ActionSimpleEval.FieldTypeDateTime.Label=Date time
ActionSimpleEval.FieldTypeNumber.Label=Number
ActionSimpleEval.FieldTypeString.Label=String
-ActionSimpleEval.keyword=evaluate,condition,variable,compare,test
+ActionSimpleEval.keyword=evaluate,condition,variable,compare,test,log,files,result
ActionSimpleEval.Log.ArgFromPrevious.Found=found [{0}] row(s) from previous
result
ActionSimpleEval.Log.CompareWithValue=Comparing incoming value [{0}] with
value [{1}]...
ActionSimpleEval.Log.CompareWithValues=Comparing incoming value [{0}] (min)
and [{1}] (max)...
+ActionSimpleEval.Log.LogTextToEvaluate=Evaluating log text from previous
result ({0} character(s))
ActionSimpleEval.Log.ValueToevaluate=Value to evaluate is {0}
ActionSimpleEval.Mask.Label=Mask
ActionSimpleEval.MaxValue.Label=Max
diff --git
a/plugins/actions/simpleeval/src/test/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalTest.java
b/plugins/actions/simpleeval/src/test/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalTest.java
index c9035ab6aa..3c3a6cec00 100644
---
a/plugins/actions/simpleeval/src/test/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalTest.java
+++
b/plugins/actions/simpleeval/src/test/java/org/apache/hop/workflow/actions/simpleeval/ActionSimpleEvalTest.java
@@ -19,9 +19,14 @@ package org.apache.hop.workflow.actions.simpleeval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
import org.apache.hop.core.HopClientEnvironment;
+import org.apache.hop.core.Result;
+import org.apache.hop.core.ResultFile;
import org.apache.hop.core.database.DatabaseMeta;
+import org.apache.hop.core.logging.HopLogStore;
import org.apache.hop.metadata.serializer.memory.MemoryMetadataProvider;
import org.apache.hop.workflow.action.ActionSerializationTestUtil;
import org.apache.hop.workflow.actions.simpleeval.ActionSimpleEval.FieldType;
@@ -29,11 +34,17 @@ import
org.apache.hop.workflow.actions.simpleeval.ActionSimpleEval.SuccessBoolea
import
org.apache.hop.workflow.actions.simpleeval.ActionSimpleEval.SuccessNumberCondition;
import
org.apache.hop.workflow.actions.simpleeval.ActionSimpleEval.SuccessStringCondition;
import org.apache.hop.workflow.actions.simpleeval.ActionSimpleEval.ValueType;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
/** Unit tests for Simple Eval action. */
class ActionSimpleEvalTest {
+ @BeforeAll
+ static void setUpBeforeClass() {
+ HopLogStore.init();
+ }
+
@Test
void testSerialization() throws Exception {
HopClientEnvironment.init();
@@ -61,4 +72,181 @@ class ActionSimpleEvalTest {
assertFalse(action.isSuccessWhenVarSet());
}
+
+ @Test
+ void testResultFilesSerialization() throws Exception {
+ ActionSimpleEval action =
+ ActionSerializationTestUtil.testSerialization(
+ "/simple-eval-result-files-action.xml", ActionSimpleEval.class);
+
+ assertEquals(ValueType.RESULT_FILES, action.getValueType());
+ assertEquals(FieldType.NUMBER, action.getFieldType());
+ assertEquals(SuccessNumberCondition.EQUAL,
action.getSuccessNumberCondition());
+ assertEquals("2", action.getCompareValue());
+ }
+
+ @Test
+ void testLogTextSerialization() throws Exception {
+ ActionSimpleEval action =
+ ActionSerializationTestUtil.testSerialization(
+ "/simple-eval-log-text-action.xml", ActionSimpleEval.class);
+
+ assertEquals(ValueType.LOG_TEXT, action.getValueType());
+ assertEquals(FieldType.STRING, action.getFieldType());
+ assertEquals(SuccessStringCondition.CONTAINS,
action.getSuccessStringCondition());
+ assertEquals("Finished pipeline", action.getCompareValue());
+ }
+
+ @Test
+ void testResultFilesEqualSuccess() throws Exception {
+ ActionSimpleEval action = resultFilesAction(SuccessNumberCondition.EQUAL,
"2");
+ Result result = resultWithFiles(2);
+
+ Result actual = action.execute(result, 0);
+
+ assertTrue(actual.isResult());
+ assertEquals(0, actual.getNrErrors());
+ }
+
+ @Test
+ void testResultFilesEqualFailure() throws Exception {
+ ActionSimpleEval action = resultFilesAction(SuccessNumberCondition.EQUAL,
"3");
+ Result result = resultWithFiles(2);
+
+ Result actual = action.execute(result, 0);
+
+ assertFalse(actual.isResult());
+ assertEquals(0, actual.getNrErrors());
+ }
+
+ @Test
+ void testResultFilesZeroWhenEmpty() throws Exception {
+ ActionSimpleEval action = resultFilesAction(SuccessNumberCondition.EQUAL,
"0");
+
+ Result actual = action.execute(new Result(), 0);
+
+ assertTrue(actual.isResult());
+ }
+
+ @Test
+ void testResultFilesGreaterThan() throws Exception {
+ ActionSimpleEval action =
resultFilesAction(SuccessNumberCondition.GREATER, "1");
+ Result result = resultWithFiles(2);
+
+ assertTrue(action.execute(result, 0).isResult());
+ }
+
+ @Test
+ void testResultFilesBetween() throws Exception {
+ ActionSimpleEval action = new ActionSimpleEval("eval");
+ action.setValueType(ValueType.RESULT_FILES);
+ action.setSuccessNumberCondition(SuccessNumberCondition.BETWEEN);
+ action.setMinValue("1");
+ action.setMaxValue("3");
+
+ assertTrue(action.execute(resultWithFiles(2), 0).isResult());
+ assertFalse(action.execute(resultWithFiles(0), 0).isResult());
+ assertFalse(action.execute(resultWithFiles(4), 0).isResult());
+ }
+
+ @Test
+ void testResultFilesIgnoresConfiguredFieldType() throws Exception {
+ ActionSimpleEval action = resultFilesAction(SuccessNumberCondition.EQUAL,
"1");
+ action.setFieldType(FieldType.STRING);
+
+ assertEquals(FieldType.NUMBER, action.getEvaluationFieldType());
+ assertTrue(action.execute(resultWithFiles(1), 0).isResult());
+ }
+
+ @Test
+ void testLogTextContainsSuccess() throws Exception {
+ ActionSimpleEval action = logTextAction(SuccessStringCondition.CONTAINS,
"Abort this workflow");
+ Result result = resultWithLog("Starting\nAbort this workflow\nERROR\n");
+
+ Result actual = action.execute(result, 0);
+
+ assertTrue(actual.isResult());
+ assertEquals(0, actual.getNrErrors());
+ }
+
+ @Test
+ void testLogTextContainsFailure() throws Exception {
+ ActionSimpleEval action = logTextAction(SuccessStringCondition.CONTAINS,
"missing snippet");
+ Result result = resultWithLog("Starting\nAbort this workflow\nERROR\n");
+
+ assertFalse(action.execute(result, 0).isResult());
+ }
+
+ @Test
+ void testLogTextNotContainsSuccess() throws Exception {
+ ActionSimpleEval action =
+ logTextAction(SuccessStringCondition.NOT_CONTAINS, "Success: we should
not see this");
+ Result result = resultWithLog("Starting\nAbort this workflow\nERROR\n");
+
+ assertTrue(action.execute(result, 0).isResult());
+ }
+
+ @Test
+ void testLogTextNotContainsFailure() throws Exception {
+ ActionSimpleEval action =
logTextAction(SuccessStringCondition.NOT_CONTAINS, "ERROR");
+ Result result = resultWithLog("Starting\nAbort this workflow\nERROR\n");
+
+ assertFalse(action.execute(result, 0).isResult());
+ }
+
+ @Test
+ void testLogTextNullTreatedAsEmpty() throws Exception {
+ ActionSimpleEval action =
logTextAction(SuccessStringCondition.NOT_CONTAINS, "ERROR");
+
+ assertTrue(action.execute(new Result(), 0).isResult());
+ }
+
+ @Test
+ void testLogTextRegex() throws Exception {
+ ActionSimpleEval action = logTextAction(SuccessStringCondition.REGEX,
"(?s).*ERROR.*");
+ Result result = resultWithLog("line 1\nERROR: boom\nline 3");
+
+ assertTrue(action.execute(result, 0).isResult());
+ }
+
+ @Test
+ void testLogTextIgnoresConfiguredFieldType() throws Exception {
+ ActionSimpleEval action = logTextAction(SuccessStringCondition.CONTAINS,
"ok");
+ action.setFieldType(FieldType.NUMBER);
+
+ assertEquals(FieldType.STRING, action.getEvaluationFieldType());
+ assertTrue(action.execute(resultWithLog("this is ok"), 0).isResult());
+ }
+
+ private static ActionSimpleEval resultFilesAction(
+ SuccessNumberCondition condition, String compareValue) {
+ ActionSimpleEval action = new ActionSimpleEval("eval");
+ action.setValueType(ValueType.RESULT_FILES);
+ action.setSuccessNumberCondition(condition);
+ action.setCompareValue(compareValue);
+ return action;
+ }
+
+ private static ActionSimpleEval logTextAction(
+ SuccessStringCondition condition, String compareValue) {
+ ActionSimpleEval action = new ActionSimpleEval("eval");
+ action.setValueType(ValueType.LOG_TEXT);
+ action.setSuccessStringCondition(condition);
+ action.setCompareValue(compareValue);
+ return action;
+ }
+
+ private static Result resultWithFiles(int count) {
+ Result result = new Result();
+ for (int i = 0; i < count; i++) {
+ result.getResultFiles().put("file-" + i, mock(ResultFile.class));
+ }
+ return result;
+ }
+
+ private static Result resultWithLog(String logText) {
+ Result result = new Result();
+ result.setLogText(logText);
+ return result;
+ }
}
diff --git
a/plugins/actions/simpleeval/src/test/resources/simple-eval-log-text-action.xml
b/plugins/actions/simpleeval/src/test/resources/simple-eval-log-text-action.xml
new file mode 100644
index 0000000000..5f684056f1
--- /dev/null
+++
b/plugins/actions/simpleeval/src/test/resources/simple-eval-log-text-action.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You 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.
+ ~
+ -->
+<action>
+ <name>Check log text</name>
+ <description />
+ <type>SIMPLE_EVAL</type>
+ <attributes />
+ <comparevalue>Finished pipeline</comparevalue>
+ <fieldtype>string</fieldtype>
+ <successbooleancondition>true</successbooleancondition>
+ <successcondition>contains</successcondition>
+ <successnumbercondition>equal</successnumbercondition>
+ <successwhenvarset>N</successwhenvarset>
+ <valuetype>logtext</valuetype>
+</action>
diff --git
a/plugins/actions/simpleeval/src/test/resources/simple-eval-result-files-action.xml
b/plugins/actions/simpleeval/src/test/resources/simple-eval-result-files-action.xml
new file mode 100644
index 0000000000..46facc9d72
--- /dev/null
+++
b/plugins/actions/simpleeval/src/test/resources/simple-eval-result-files-action.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You 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.
+ ~
+ -->
+<action>
+ <name>Check result files</name>
+ <description />
+ <type>SIMPLE_EVAL</type>
+ <attributes />
+ <comparevalue>2</comparevalue>
+ <fieldtype>number</fieldtype>
+ <successbooleancondition>true</successbooleancondition>
+ <successcondition>equal</successcondition>
+ <successnumbercondition>equal</successnumbercondition>
+ <successwhenvarset>N</successwhenvarset>
+ <valuetype>resultfiles</valuetype>
+</action>