This is an automated email from the ASF dual-hosted git repository.

mcasters pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hop.git


The following commit(s) were added to refs/heads/master by this push:
     new 3753700  HOP-2918 : Create transform integration tests: Number Range, 
If null, Null if
     new 7fc7858  Merge pull request #840 from mattcasters/master
3753700 is described below

commit 3753700d9571a69f3652e75f6449d14936d47179
Author: Matt Casters <[email protected]>
AuthorDate: Tue Jun 1 17:55:51 2021 +0200

    HOP-2918 : Create transform integration tests: Number Range, If null, Null 
if
---
 .../neo4j-graph-output-build.hpl                   | 284 +++++++++++++++++++++
 .../neo4j-graph-output-validation.hpl              | 149 +++++++++++
 integration-tests/transforms/0023-number-range.hpl | 110 ++++----
 .../transforms/0024-if-null-all-fields.hpl         | 217 ++++++++++++++++
 .../transforms/0024-if-null-by-type.hpl            | 235 +++++++++++++++++
 .../transforms/0024-if-null-specific-fields.hpl    | 241 +++++++++++++++++
 ...023-number-range.hpl => 0025-null-if-basic.hpl} | 186 +++++++-------
 .../datasets/golden-if-null-all-fields.csv         |   7 +
 .../transforms/datasets/golden-if-null-by-type.csv |   7 +
 .../datasets/golden-if-null-specific-fields.csv    |   7 +
 .../transforms/datasets/golden-null-if-basic.csv   |   5 +
 .../transforms/datasets/golden-number-rang.csv     |  20 +-
 .../transforms/main-0023-number-range.hwf          |  61 +++++
 integration-tests/transforms/main-0024-if-null.hwf |  67 +++++
 integration-tests/transforms/main-0025-null-if.hwf |  61 +++++
 .../dataset/golden-if-null-all-fields.json         |  56 ++++
 .../metadata/dataset/golden-if-null-by-type.json   |  56 ++++
 .../dataset/golden-if-null-specific-fields.json    |  56 ++++
 ...number-range.json => golden-null-if-basic.json} |  24 +-
 .../metadata/dataset/golden-number-range.json      |   2 +-
 .../metadata/unit-test/0023-number-range UNIT.json |  10 +-
 .../unit-test/0024-if-null-all-fields UNIT.json    |  53 ++++
 .../unit-test/0024-if-null-by-type UNIT.json       |  53 ++++
 .../0024-if-null-specific-fields UNIT.json         |  53 ++++
 .../unit-test/0025-null-if-basic UNIT.json         |  43 ++++
 25 files changed, 1888 insertions(+), 175 deletions(-)

diff --git 
a/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-build.hpl 
b/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-build.hpl
new file mode 100644
index 0000000..fcaf655
--- /dev/null
+++ 
b/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-build.hpl
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pipeline>
+  <info>
+    <name>neo4j-graph-output-build</name>
+    <name_sync_with_filename>Y</name_sync_with_filename>
+    <description/>
+    <extended_description/>
+    <pipeline_version/>
+    <pipeline_type>Normal</pipeline_type>
+    <pipeline_status>0</pipeline_status>
+    <parameters>
+    </parameters>
+    <capture_transform_performance>N</capture_transform_performance>
+    
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+    
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+    <created_user>-</created_user>
+    <created_date>2019/08/06 16:10:49.753</created_date>
+    <modified_user>-</modified_user>
+    <modified_date>2019/08/06 16:10:49.753</modified_date>
+    <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA=</key_for_session_key>
+    <is_key_private>N</is_key_private>
+  </info>
+  <notepads>
+    <notepad>
+      <note>Commit size set to 123 to check for dangling records</note>
+      <xloc>160</xloc>
+      <yloc>240</yloc>
+      <width>330</width>
+      <heigth>29</heigth>
+      <fontname>Sans</fontname>
+      <fontsize>14</fontsize>
+      <fontbold>N</fontbold>
+      <fontitalic>N</fontitalic>
+      <fontcolorred>0</fontcolorred>
+      <fontcolorgreen>0</fontcolorgreen>
+      <fontcolorblue>0</fontcolorblue>
+      <backgroundcolorred>136</backgroundcolorred>
+      <backgroundcolorgreen>138</backgroundcolorgreen>
+      <backgroundcolorblue>133</backgroundcolorblue>
+      <bordercolorred>100</bordercolorred>
+      <bordercolorgreen>100</bordercolorgreen>
+      <bordercolorblue>100</bordercolorblue>
+    </notepad>
+  </notepads>
+  <order>
+    <hop>
+      <from>customers-1k.txt</from>
+      <to>Update Customers graph</to>
+      <enabled>Y</enabled>
+    </hop>
+  </order>
+  <transform>
+    <name>Update Customers graph</name>
+    <type>Neo4jGraphOutput</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <connection>Test</connection>
+    <model>Customers</model>
+    <batch_size>123</batch_size>
+    <create_indexes>Y</create_indexes>
+    <returning_graph>N</returning_graph>
+    <return_graph_field/>
+    <validate_against_model>N</validate_against_model>
+    <out_of_order_allowed>Y</out_of_order_allowed>
+    <mappings>
+      <mapping>
+        <source_field>id</source_field>
+        <target_type>Node</target_type>
+        <target_name>Customer</target_name>
+        <target_property>id</target_property>
+      </mapping>
+      <mapping>
+        <source_field>name</source_field>
+        <target_type>Node</target_type>
+        <target_name>Customer</target_name>
+        <target_property>name</target_property>
+      </mapping>
+      <mapping>
+        <source_field>firstname</source_field>
+        <target_type>Node</target_type>
+        <target_name>Customer</target_name>
+        <target_property>firstname</target_property>
+      </mapping>
+      <mapping>
+        <source_field>birthdate</source_field>
+        <target_type>Node</target_type>
+        <target_name>Customer</target_name>
+        <target_property>birthdate</target_property>
+      </mapping>
+      <mapping>
+        <source_field>zip</source_field>
+        <target_type>Node</target_type>
+        <target_name>Zip</target_name>
+        <target_property>zip</target_property>
+      </mapping>
+      <mapping>
+        <source_field>city</source_field>
+        <target_type>Node</target_type>
+        <target_name>City</target_name>
+        <target_property>city</target_property>
+      </mapping>
+      <mapping>
+        <source_field>street</source_field>
+        <target_type>Node</target_type>
+        <target_name>Street</target_name>
+        <target_property>street</target_property>
+      </mapping>
+      <mapping>
+        <source_field>housenr</source_field>
+        <target_type>Node</target_type>
+        <target_name>House</target_name>
+        <target_property>housenr</target_property>
+      </mapping>
+      <mapping>
+        <source_field>stateCode</source_field>
+        <target_type>Node</target_type>
+        <target_name>State</target_name>
+        <target_property>stateCode</target_property>
+      </mapping>
+      <mapping>
+        <source_field>state</source_field>
+        <target_type>Node</target_type>
+        <target_name>State</target_name>
+        <target_property>state</target_property>
+      </mapping>
+    </mappings>
+    <attributes/>
+    <GUI>
+      <xloc>464</xloc>
+      <yloc>128</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>customers-1k.txt</name>
+    <type>CSVInput</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <filename>${PROJECT_HOME}/datasets/customers.csv</filename>
+    <filename_field/>
+    <rownum_field/>
+    <include_filename>N</include_filename>
+    <separator>,</separator>
+    <enclosure>"</enclosure>
+    <header>Y</header>
+    <buffer_size>50000</buffer_size>
+    <lazy_conversion>N</lazy_conversion>
+    <add_filename_result>N</add_filename_result>
+    <parallel>N</parallel>
+    <newline_possible>N</newline_possible>
+    <encoding/>
+    <fields>
+      <field>
+        <name>id</name>
+        <type>Integer</type>
+        <format>#</format>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>15</length>
+        <precision>0</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>name</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>10</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>firstname</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>13</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>zip</name>
+        <type>Integer</type>
+        <format>#</format>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>15</length>
+        <precision>0</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>city</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>8</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>birthdate</name>
+        <type>Date</type>
+        <format>yyyy/MM/dd</format>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>-1</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>street</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>11</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>housenr</name>
+        <type>Integer</type>
+        <format>#</format>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>15</length>
+        <precision>0</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>stateCode</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>9</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+      <field>
+        <name>state</name>
+        <type>String</type>
+        <format/>
+        <currency>EUR</currency>
+        <decimal>.</decimal>
+        <group>,</group>
+        <length>30</length>
+        <precision>-1</precision>
+        <trim_type>none</trim_type>
+      </field>
+    </fields>
+    <attributes/>
+    <GUI>
+      <xloc>208</xloc>
+      <yloc>128</yloc>
+    </GUI>
+  </transform>
+  <transform_error_handling>
+  </transform_error_handling>
+  <attributes/>
+</pipeline>
diff --git 
a/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-validation.hpl
 
b/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-validation.hpl
new file mode 100644
index 0000000..f348f03
--- /dev/null
+++ 
b/integration-tests/neo4j/tests/neo4j-graph-output/neo4j-graph-output-validation.hpl
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pipeline>
+  <info>
+    <name>neo4j-cypher-graph-validation</name>
+    <name_sync_with_filename>Y</name_sync_with_filename>
+    <description/>
+    <extended_description/>
+    <pipeline_version/>
+    <pipeline_type>Normal</pipeline_type>
+    <pipeline_status>0</pipeline_status>
+    <parameters>
+    </parameters>
+    <capture_transform_performance>N</capture_transform_performance>
+    
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+    
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+    <created_user>-</created_user>
+    <created_date>2019/08/06 18:28:33.119</created_date>
+    <modified_user>-</modified_user>
+    <modified_date>2019/08/06 18:28:33.119</modified_date>
+    <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA=</key_for_session_key>
+    <is_key_private>N</is_key_private>
+  </info>
+  <notepads>
+  </notepads>
+  <order>
+    <hop>
+      <from>Read :Customer</from>
+      <to>CUSTOMERS</to>
+      <enabled>Y</enabled>
+    </hop>
+  </order>
+  <transform>
+    <name>CUSTOMERS</name>
+    <type>Dummy</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <attributes/>
+    <GUI>
+      <xloc>368</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Read :Customer</name>
+    <type>Neo4jCypherOutput</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <connection>Test</connection>
+    <cypher>MATCH (c:Customer)
+MATCH (c)-[:IN_CITY]->(i:City)
+MATCH (c)-[:IN_STATE]->(s:State)
+MATCH (c)-[:IN_STREET]->(r:Street)
+MATCH (c)-[:IN_HOUSE]->(h:House)
+MATCH (c)-[:IN_ZIP]->(z:Zip)
+RETURN c.id as id, 
+   c.name as name, 
+   c.firstname as firstname,
+   c.birthdate as birthdate,
+   z.zip as zip,
+   i.city as city, 
+   r.street as street,
+   h.housenr as housenr,
+   s.stateCode as stateCode,
+   s.state as state</cypher>
+    <batch_size/>
+    <read_only>Y</read_only>
+    <nr_retries_on_error/>
+    <retry>Y</retry>
+    <cypher_from_field>N</cypher_from_field>
+    <cypher_field/>
+    <unwind>N</unwind>
+    <unwind_map/>
+    <returning_graph>N</returning_graph>
+    <return_graph_field/>
+    <mappings/>
+    <returns>
+      <return>
+        <name>id</name>
+        <type>Integer</type>
+        <source_type>Integer</source_type>
+      </return>
+      <return>
+        <name>name</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+      <return>
+        <name>firstname</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+      <return>
+        <name>birthdate</name>
+        <type>Date</type>
+        <source_type>LocalDateTime</source_type>
+      </return>
+      <return>
+        <name>zip</name>
+        <type>Integer</type>
+        <source_type>Integer</source_type>
+      </return>
+      <return>
+        <name>city</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+      <return>
+        <name>street</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+      <return>
+        <name>housenr</name>
+        <type>Integer</type>
+        <source_type>Integer</source_type>
+      </return>
+      <return>
+        <name>stateCode</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+      <return>
+        <name>state</name>
+        <type>String</type>
+        <source_type>String</source_type>
+      </return>
+    </returns>
+    <attributes/>
+    <GUI>
+      <xloc>192</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform_error_handling>
+  </transform_error_handling>
+  <attributes/>
+</pipeline>
diff --git a/integration-tests/transforms/0023-number-range.hpl 
b/integration-tests/transforms/0023-number-range.hpl
index afa9515..a2f7eda 100644
--- a/integration-tests/transforms/0023-number-range.hpl
+++ b/integration-tests/transforms/0023-number-range.hpl
@@ -16,7 +16,7 @@
     <created_date>2021/05/31 14:12:11.112</created_date>
     <modified_user>-</modified_user>
     <modified_date>2021/05/31 14:12:11.112</modified_date>
-    <key_for_session_key/>
+    <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA=</key_for_session_key>
     <is_key_private>N</is_key_private>
   </info>
   <notepads>
@@ -34,6 +34,53 @@
     </hop>
   </order>
   <transform>
+    <name>Price range</name>
+    <type>NumberRange</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <inputField>price</inputField>
+    <outputField>range</outputField>
+    <fallBackValue>illegal</fallBackValue>
+    <rules>
+      <rule>
+        <lower_bound>-1.7976931348623157E308</lower_bound>
+        <upper_bound>10.0</upper_bound>
+        <value>bargain</value>
+      </rule>
+      <rule>
+        <lower_bound>10.0</lower_bound>
+        <upper_bound>50.0</upper_bound>
+        <value>cheap</value>
+      </rule>
+      <rule>
+        <lower_bound>50.0</lower_bound>
+        <upper_bound>250.0</upper_bound>
+        <value>average</value>
+      </rule>
+      <rule>
+        <lower_bound>250.0</lower_bound>
+        <upper_bound>1000.0</upper_bound>
+        <value>pricey</value>
+      </rule>
+      <rule>
+        <lower_bound>1000.0</lower_bound>
+        <upper_bound>1.7976931348623157E308</upper_bound>
+        <value>expensive</value>
+      </rule>
+    </rules>
+    <attributes/>
+    <GUI>
+      <xloc>256</xloc>
+      <yloc>80</yloc>
+    </GUI>
+  </transform>
+  <transform>
     <name>Prices</name>
     <type>DataGrid</type>
     <description/>
@@ -59,12 +106,12 @@
       <field>
         <name>price</name>
         <type>Number</type>
-        <format>#.#</format>
+        <format>#.00</format>
         <currency/>
         <decimal>.</decimal>
         <group/>
-        <length>-1</length>
-        <precision>-1</precision>
+        <length>5</length>
+        <precision>2</precision>
         <set_empty_string>N</set_empty_string>
       </field>
     </fields>
@@ -112,55 +159,8 @@
     </data>
     <attributes/>
     <GUI>
-      <xloc>160</xloc>
-      <yloc>112</yloc>
-    </GUI>
-  </transform>
-  <transform>
-    <name>Price range</name>
-    <type>NumberRange</type>
-    <description/>
-    <distribute>Y</distribute>
-    <custom_distribution/>
-    <copies>1</copies>
-    <partitioning>
-      <method>none</method>
-      <schema_name/>
-    </partitioning>
-    <inputField>price</inputField>
-    <outputField>range</outputField>
-    <fallBackValue>illegal</fallBackValue>
-    <rules>
-      <rule>
-        <lower_bound>-1.7976931348623157E308</lower_bound>
-        <upper_bound>10.0</upper_bound>
-        <value>bargain</value>
-      </rule>
-      <rule>
-        <lower_bound>10.0</lower_bound>
-        <upper_bound>50.0</upper_bound>
-        <value>cheap</value>
-      </rule>
-      <rule>
-        <lower_bound>50.0</lower_bound>
-        <upper_bound>250.0</upper_bound>
-        <value>average</value>
-      </rule>
-      <rule>
-        <lower_bound>250.0</lower_bound>
-        <upper_bound>1000.0</upper_bound>
-        <value>pricey</value>
-      </rule>
-      <rule>
-        <lower_bound>1000.0</lower_bound>
-        <upper_bound>1.7976931348623157E308</upper_bound>
-        <value>expensive</value>
-      </rule>
-    </rules>
-    <attributes/>
-    <GUI>
-      <xloc>320</xloc>
-      <yloc>112</yloc>
+      <xloc>96</xloc>
+      <yloc>80</yloc>
     </GUI>
   </transform>
   <transform>
@@ -176,8 +176,8 @@
     </partitioning>
     <attributes/>
     <GUI>
-      <xloc>480</xloc>
-      <yloc>112</yloc>
+      <xloc>416</xloc>
+      <yloc>80</yloc>
     </GUI>
   </transform>
   <transform_error_handling>
diff --git a/integration-tests/transforms/0024-if-null-all-fields.hpl 
b/integration-tests/transforms/0024-if-null-all-fields.hpl
new file mode 100644
index 0000000..3cd7711
--- /dev/null
+++ b/integration-tests/transforms/0024-if-null-all-fields.hpl
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pipeline>
+  <info>
+    <name>0024-if-null-all-fields</name>
+    <name_sync_with_filename>Y</name_sync_with_filename>
+    <description/>
+    <extended_description/>
+    <pipeline_version/>
+    <pipeline_type>Normal</pipeline_type>
+    <parameters>
+    </parameters>
+    <capture_transform_performance>N</capture_transform_performance>
+    
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+    
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+    <created_user>-</created_user>
+    <created_date>2021/06/01 15:47:03.315</created_date>
+    <modified_user>-</modified_user>
+    <modified_date>2021/06/01 15:47:03.315</modified_date>
+    <key_for_session_key/>
+    <is_key_private>N</is_key_private>
+  </info>
+  <notepads>
+  </notepads>
+  <order>
+    <hop>
+      <from>Sample data</from>
+      <to>If Null - all fields</to>
+      <enabled>Y</enabled>
+    </hop>
+    <hop>
+      <from>If Null - all fields</from>
+      <to>Verify</to>
+      <enabled>Y</enabled>
+    </hop>
+  </order>
+  <transform>
+    <name>If Null - all fields</name>
+    <type>IfNull</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <replaceAllByValue>?</replaceAllByValue>
+    <replaceAllMask/>
+    <selectFields>N</selectFields>
+    <selectValuesType>N</selectValuesType>
+    <setEmptyStringAll>N</setEmptyStringAll>
+    <valuetypes>
+      </valuetypes>
+    <fields>
+      </fields>
+    <attributes/>
+    <GUI>
+      <xloc>272</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Sample data</name>
+    <type>DataGrid</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <fields>
+      <field>
+        <name>a</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>b</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>c</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>d</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>e</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>f</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+    </fields>
+    <data>
+      <line>
+        <item>a1</item>
+        <item/>
+        <item>c1</item>
+        <item/>
+        <item>e1</item>
+        <item>f1</item>
+      </line>
+      <line>
+        <item/>
+        <item>b2</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item>c3</item>
+        <item/>
+        <item/>
+        <item>f3</item>
+      </line>
+      <line>
+        <item/>
+        <item>b4</item>
+        <item>c4</item>
+        <item>d4</item>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>e5</item>
+        <item/>
+      </line>
+      <line>
+        <item>a6</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>f6</item>
+      </line>
+    </data>
+    <attributes/>
+    <GUI>
+      <xloc>112</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Verify</name>
+    <type>Dummy</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <attributes/>
+    <GUI>
+      <xloc>448</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform_error_handling>
+  </transform_error_handling>
+  <attributes/>
+</pipeline>
diff --git a/integration-tests/transforms/0024-if-null-by-type.hpl 
b/integration-tests/transforms/0024-if-null-by-type.hpl
new file mode 100644
index 0000000..623cf8b
--- /dev/null
+++ b/integration-tests/transforms/0024-if-null-by-type.hpl
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pipeline>
+  <info>
+    <name>0024-if-null-by-type</name>
+    <name_sync_with_filename>Y</name_sync_with_filename>
+    <description/>
+    <extended_description/>
+    <pipeline_version/>
+    <pipeline_type>Normal</pipeline_type>
+    <parameters>
+    </parameters>
+    <capture_transform_performance>N</capture_transform_performance>
+    
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+    
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+    <created_user>-</created_user>
+    <created_date>2021/06/01 15:54:59.351</created_date>
+    <modified_user>-</modified_user>
+    <modified_date>2021/06/01 15:54:59.351</modified_date>
+    <key_for_session_key/>
+    <is_key_private>N</is_key_private>
+  </info>
+  <notepads>
+  </notepads>
+  <order>
+    <hop>
+      <from>If Null - types</from>
+      <to>Verify</to>
+      <enabled>Y</enabled>
+    </hop>
+    <hop>
+      <from>Sample data</from>
+      <to>If Null - types</to>
+      <enabled>Y</enabled>
+    </hop>
+  </order>
+  <transform>
+    <name>If Null - types</name>
+    <type>IfNull</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <replaceAllByValue>?</replaceAllByValue>
+    <replaceAllMask/>
+    <selectFields>N</selectFields>
+    <selectValuesType>Y</selectValuesType>
+    <setEmptyStringAll>N</setEmptyStringAll>
+    <valuetypes>
+      <valuetype>
+        <name>Integer</name>
+        <value>999</value>
+        <mask>#</mask>
+        <set_type_empty_string>N</set_type_empty_string>
+      </valuetype>
+      <valuetype>
+        <name>Number</name>
+        <value>0.5</value>
+        <mask>#.#</mask>
+        <set_type_empty_string>N</set_type_empty_string>
+      </valuetype>
+      <valuetype>
+        <name>String</name>
+        <value>?</value>
+        <mask/>
+        <set_type_empty_string>N</set_type_empty_string>
+      </valuetype>
+    </valuetypes>
+    <fields>
+      </fields>
+    <attributes/>
+    <GUI>
+      <xloc>272</xloc>
+      <yloc>80</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Sample data</name>
+    <type>DataGrid</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <fields>
+      <field>
+        <name>strA</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>intB</name>
+        <type>Integer</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>strC</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>numD</name>
+        <type>Number</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>strE</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>intF</name>
+        <type>Integer</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+    </fields>
+    <data>
+      <line>
+        <item>a1</item>
+        <item>11</item>
+        <item>c1</item>
+        <item/>
+        <item>e1</item>
+        <item>111</item>
+      </line>
+      <line>
+        <item/>
+        <item>22</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item>c3</item>
+        <item/>
+        <item/>
+        <item>333</item>
+      </line>
+      <line>
+        <item/>
+        <item>44</item>
+        <item>c4</item>
+        <item>4.4</item>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>e5</item>
+        <item/>
+      </line>
+      <line>
+        <item>a6</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>666</item>
+      </line>
+    </data>
+    <attributes/>
+    <GUI>
+      <xloc>112</xloc>
+      <yloc>80</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Verify</name>
+    <type>Dummy</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <attributes/>
+    <GUI>
+      <xloc>416</xloc>
+      <yloc>80</yloc>
+    </GUI>
+  </transform>
+  <transform_error_handling>
+  </transform_error_handling>
+  <attributes/>
+</pipeline>
diff --git a/integration-tests/transforms/0024-if-null-specific-fields.hpl 
b/integration-tests/transforms/0024-if-null-specific-fields.hpl
new file mode 100644
index 0000000..33c9607
--- /dev/null
+++ b/integration-tests/transforms/0024-if-null-specific-fields.hpl
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pipeline>
+  <info>
+    <name>0024-if-null-specific-fields</name>
+    <name_sync_with_filename>Y</name_sync_with_filename>
+    <description/>
+    <extended_description/>
+    <pipeline_version/>
+    <pipeline_type>Normal</pipeline_type>
+    <parameters>
+    </parameters>
+    <capture_transform_performance>N</capture_transform_performance>
+    
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
+    
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
+    <created_user>-</created_user>
+    <created_date>2021/06/01 15:47:03.315</created_date>
+    <modified_user>-</modified_user>
+    <modified_date>2021/06/01 15:47:03.315</modified_date>
+    <key_for_session_key>H4sIAAAAAAAAAAMAAAAAAAAAAAA=</key_for_session_key>
+    <is_key_private>N</is_key_private>
+  </info>
+  <notepads>
+  </notepads>
+  <order>
+    <hop>
+      <from>Sample data</from>
+      <to>If Null - fields a,c,d,f</to>
+      <enabled>Y</enabled>
+    </hop>
+    <hop>
+      <from>If Null - fields a,c,d,f</from>
+      <to>Verify</to>
+      <enabled>Y</enabled>
+    </hop>
+  </order>
+  <transform>
+    <name>If Null - fields a,c,d,f</name>
+    <type>IfNull</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <replaceAllByValue>?</replaceAllByValue>
+    <replaceAllMask/>
+    <selectFields>Y</selectFields>
+    <selectValuesType>N</selectValuesType>
+    <setEmptyStringAll>N</setEmptyStringAll>
+    <valuetypes>
+      </valuetypes>
+    <fields>
+      <field>
+        <name>a</name>
+        <value>a?</value>
+        <mask/>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>c</name>
+        <value>c?</value>
+        <mask/>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>d</name>
+        <value>d?</value>
+        <mask/>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>f</name>
+        <value>f?</value>
+        <mask/>
+        <set_empty_string>N</set_empty_string>
+      </field>
+    </fields>
+    <attributes/>
+    <GUI>
+      <xloc>272</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Sample data</name>
+    <type>DataGrid</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <fields>
+      <field>
+        <name>a</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>b</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>c</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>d</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>e</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>f</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+    </fields>
+    <data>
+      <line>
+        <item>a1</item>
+        <item/>
+        <item>c1</item>
+        <item/>
+        <item>e1</item>
+        <item>f1</item>
+      </line>
+      <line>
+        <item/>
+        <item>b2</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item>c3</item>
+        <item/>
+        <item/>
+        <item>f3</item>
+      </line>
+      <line>
+        <item/>
+        <item>b4</item>
+        <item>c4</item>
+        <item>d4</item>
+        <item/>
+        <item/>
+      </line>
+      <line>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>e5</item>
+        <item/>
+      </line>
+      <line>
+        <item>a6</item>
+        <item/>
+        <item/>
+        <item/>
+        <item/>
+        <item>f6</item>
+      </line>
+    </data>
+    <attributes/>
+    <GUI>
+      <xloc>112</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Verify</name>
+    <type>Dummy</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <attributes/>
+    <GUI>
+      <xloc>448</xloc>
+      <yloc>96</yloc>
+    </GUI>
+  </transform>
+  <transform_error_handling>
+  </transform_error_handling>
+  <attributes/>
+</pipeline>
diff --git a/integration-tests/transforms/0023-number-range.hpl 
b/integration-tests/transforms/0025-null-if-basic.hpl
similarity index 51%
copy from integration-tests/transforms/0023-number-range.hpl
copy to integration-tests/transforms/0025-null-if-basic.hpl
index afa9515..5e88880 100644
--- a/integration-tests/transforms/0023-number-range.hpl
+++ b/integration-tests/transforms/0025-null-if-basic.hpl
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <pipeline>
   <info>
-    <name>0023-number-range</name>
+    <name>0025-null-if-basic</name>
     <name_sync_with_filename>Y</name_sync_with_filename>
     <description/>
     <extended_description/>
@@ -13,9 +13,9 @@
     
<transform_performance_capturing_delay>1000</transform_performance_capturing_delay>
     
<transform_performance_capturing_size_limit>100</transform_performance_capturing_size_limit>
     <created_user>-</created_user>
-    <created_date>2021/05/31 14:12:11.112</created_date>
+    <created_date>2021/06/01 17:40:11.867</created_date>
     <modified_user>-</modified_user>
-    <modified_date>2021/05/31 14:12:11.112</modified_date>
+    <modified_date>2021/06/01 17:40:11.867</modified_date>
     <key_for_session_key/>
     <is_key_private>N</is_key_private>
   </info>
@@ -23,18 +23,53 @@
   </notepads>
   <order>
     <hop>
-      <from>Prices</from>
-      <to>Price range</to>
+      <from>Sample data</from>
+      <to>Null if</to>
       <enabled>Y</enabled>
     </hop>
     <hop>
-      <from>Price range</from>
-      <to>Verify</to>
+      <from>Null if</from>
+      <to>Preview</to>
       <enabled>Y</enabled>
     </hop>
   </order>
   <transform>
-    <name>Prices</name>
+    <name>Null if</name>
+    <type>NullIf</type>
+    <description/>
+    <distribute>Y</distribute>
+    <custom_distribution/>
+    <copies>1</copies>
+    <partitioning>
+      <method>none</method>
+      <schema_name/>
+    </partitioning>
+    <fields>
+      <field>
+        <name>strA</name>
+        <value>a3</value>
+      </field>
+      <field>
+        <name>intB</name>
+        <value>22</value>
+      </field>
+      <field>
+        <name>numC</name>
+        <value>333.33</value>
+      </field>
+      <field>
+        <name>boolD</name>
+        <value>false</value>
+      </field>
+    </fields>
+    <attributes/>
+    <GUI>
+      <xloc>256</xloc>
+      <yloc>128</yloc>
+    </GUI>
+  </transform>
+  <transform>
+    <name>Sample data</name>
     <type>DataGrid</type>
     <description/>
     <distribute>Y</distribute>
@@ -46,7 +81,18 @@
     </partitioning>
     <fields>
       <field>
-        <name>id</name>
+        <name>strA</name>
+        <type>String</type>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>intB</name>
         <type>Integer</type>
         <format/>
         <currency/>
@@ -57,11 +103,22 @@
         <set_empty_string>N</set_empty_string>
       </field>
       <field>
-        <name>price</name>
+        <name>numC</name>
         <type>Number</type>
-        <format>#.#</format>
+        <format/>
+        <currency/>
+        <decimal/>
+        <group/>
+        <length>-1</length>
+        <precision>-1</precision>
+        <set_empty_string>N</set_empty_string>
+      </field>
+      <field>
+        <name>boolD</name>
+        <type>Boolean</type>
+        <format/>
         <currency/>
-        <decimal>.</decimal>
+        <decimal/>
         <group/>
         <length>-1</length>
         <precision>-1</precision>
@@ -70,101 +127,38 @@
     </fields>
     <data>
       <line>
-        <item>1</item>
-        <item>9.99</item>
-      </line>
-      <line>
-        <item>2</item>
-        <item>6.23</item>
-      </line>
-      <line>
-        <item>3</item>
-        <item>57.41</item>
-      </line>
-      <line>
-        <item>4</item>
-        <item>299.99</item>
-      </line>
-      <line>
-        <item>5</item>
-        <item>100.00</item>
+        <item>a1</item>
+        <item>11</item>
+        <item>111.11</item>
+        <item>true</item>
       </line>
       <line>
-        <item>6</item>
-        <item>-103.97</item>
+        <item>a2</item>
+        <item>22</item>
+        <item>222.22</item>
+        <item>false</item>
       </line>
       <line>
-        <item>7</item>
-        <item>974.95</item>
+        <item>a3</item>
+        <item>33</item>
+        <item>333.33</item>
+        <item>true</item>
       </line>
       <line>
-        <item>8</item>
-        <item>2399.99</item>
-      </line>
-      <line>
-        <item>9</item>
-        <item>14.99</item>
-      </line>
-      <line>
-        <item>10</item>
-        <item>123.45</item>
+        <item>a4</item>
+        <item>44</item>
+        <item>444.44</item>
+        <item>false</item>
       </line>
     </data>
     <attributes/>
     <GUI>
-      <xloc>160</xloc>
-      <yloc>112</yloc>
-    </GUI>
-  </transform>
-  <transform>
-    <name>Price range</name>
-    <type>NumberRange</type>
-    <description/>
-    <distribute>Y</distribute>
-    <custom_distribution/>
-    <copies>1</copies>
-    <partitioning>
-      <method>none</method>
-      <schema_name/>
-    </partitioning>
-    <inputField>price</inputField>
-    <outputField>range</outputField>
-    <fallBackValue>illegal</fallBackValue>
-    <rules>
-      <rule>
-        <lower_bound>-1.7976931348623157E308</lower_bound>
-        <upper_bound>10.0</upper_bound>
-        <value>bargain</value>
-      </rule>
-      <rule>
-        <lower_bound>10.0</lower_bound>
-        <upper_bound>50.0</upper_bound>
-        <value>cheap</value>
-      </rule>
-      <rule>
-        <lower_bound>50.0</lower_bound>
-        <upper_bound>250.0</upper_bound>
-        <value>average</value>
-      </rule>
-      <rule>
-        <lower_bound>250.0</lower_bound>
-        <upper_bound>1000.0</upper_bound>
-        <value>pricey</value>
-      </rule>
-      <rule>
-        <lower_bound>1000.0</lower_bound>
-        <upper_bound>1.7976931348623157E308</upper_bound>
-        <value>expensive</value>
-      </rule>
-    </rules>
-    <attributes/>
-    <GUI>
-      <xloc>320</xloc>
-      <yloc>112</yloc>
+      <xloc>96</xloc>
+      <yloc>128</yloc>
     </GUI>
   </transform>
   <transform>
-    <name>Verify</name>
+    <name>Preview</name>
     <type>Dummy</type>
     <description/>
     <distribute>Y</distribute>
@@ -176,8 +170,8 @@
     </partitioning>
     <attributes/>
     <GUI>
-      <xloc>480</xloc>
-      <yloc>112</yloc>
+      <xloc>416</xloc>
+      <yloc>128</yloc>
     </GUI>
   </transform>
   <transform_error_handling>
diff --git 
a/integration-tests/transforms/datasets/golden-if-null-all-fields.csv 
b/integration-tests/transforms/datasets/golden-if-null-all-fields.csv
new file mode 100644
index 0000000..d82ab6a
--- /dev/null
+++ b/integration-tests/transforms/datasets/golden-if-null-all-fields.csv
@@ -0,0 +1,7 @@
+a,b,c,d,e,f
+a1,?,c1,?,e1,f1
+?,b2,?,?,?,?
+?,?,c3,?,?,f3
+?,b4,c4,d4,?,?
+?,?,?,?,e5,?
+a6,?,?,?,?,f6
diff --git a/integration-tests/transforms/datasets/golden-if-null-by-type.csv 
b/integration-tests/transforms/datasets/golden-if-null-by-type.csv
new file mode 100644
index 0000000..c024c4a
--- /dev/null
+++ b/integration-tests/transforms/datasets/golden-if-null-by-type.csv
@@ -0,0 +1,7 @@
+strA,intB,strC,numD,strE,intF
+a1,11,c1,0.5,e1,111
+?,22,?,0.5,?,999
+?,999,c3,0.5,?,333
+?,44,c4,4.4,?,999
+?,999,?,0.5,e5,999
+a6,999,?,0.5,?,666
diff --git 
a/integration-tests/transforms/datasets/golden-if-null-specific-fields.csv 
b/integration-tests/transforms/datasets/golden-if-null-specific-fields.csv
new file mode 100644
index 0000000..bf1d5d3
--- /dev/null
+++ b/integration-tests/transforms/datasets/golden-if-null-specific-fields.csv
@@ -0,0 +1,7 @@
+a,b,c,d,e,f
+a1,,c1,d?,e1,f1
+a?,b2,c?,d?,,f?
+a?,,c3,d?,,f3
+a?,b4,c4,d4,,f?
+a?,,c?,d?,e5,f?
+a6,,c?,d?,,f6
diff --git a/integration-tests/transforms/datasets/golden-null-if-basic.csv 
b/integration-tests/transforms/datasets/golden-null-if-basic.csv
new file mode 100644
index 0000000..7bd351b
--- /dev/null
+++ b/integration-tests/transforms/datasets/golden-null-if-basic.csv
@@ -0,0 +1,5 @@
+strA,intB,numC,boolD
+a1,11,111.11,Y
+a2,,222.22,
+,33,,Y
+a4,44,444.44,
diff --git a/integration-tests/transforms/datasets/golden-number-rang.csv 
b/integration-tests/transforms/datasets/golden-number-rang.csv
index 4600a8c..17830fb 100644
--- a/integration-tests/transforms/datasets/golden-number-rang.csv
+++ b/integration-tests/transforms/datasets/golden-number-rang.csv
@@ -1,11 +1,11 @@
 id,price,range
-1,10,bargain
-2,6.2,bargain
-3,57.4,average
-4,300,pricey
-5,100,average
-6,-104,bargain
-7,975,pricey
-8,2400,expensive
-9,15,cheap
-10,123.5,average
+1,9.99,bargain
+2,6.23,bargain
+3,57.41,average
+4,299.99,pricey
+5,100.00,average
+6,-103.97,bargain
+7,974.95,pricey
+8,2399.99,expensive
+9,14.99,cheap
+10,123.45,average
diff --git a/integration-tests/transforms/main-0023-number-range.hwf 
b/integration-tests/transforms/main-0023-number-range.hwf
new file mode 100644
index 0000000..785e28f
--- /dev/null
+++ b/integration-tests/transforms/main-0023-number-range.hwf
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workflow>
+  <name>main-0023-number-range</name>
+  <name_sync_with_filename>Y</name_sync_with_filename>
+  <description/>
+  <extended_description/>
+  <workflow_version/>
+  <created_user>-</created_user>
+  <created_date>2021/05/31 14:18:33.849</created_date>
+  <modified_user>-</modified_user>
+  <modified_date>2021/05/31 14:18:33.849</modified_date>
+  <parameters>
+    </parameters>
+  <actions>
+    <action>
+      <name>Start</name>
+      <description/>
+      <type>SPECIAL</type>
+      <attributes/>
+      <repeat>N</repeat>
+      <schedulerType>0</schedulerType>
+      <intervalSeconds>0</intervalSeconds>
+      <intervalMinutes>60</intervalMinutes>
+      <hour>12</hour>
+      <minutes>0</minutes>
+      <weekDay>1</weekDay>
+      <DayOfMonth>1</DayOfMonth>
+      <parallel>N</parallel>
+      <xloc>144</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+    <action>
+      <name>Run Number Range Tests</name>
+      <description/>
+      <type>RunPipelineTests</type>
+      <attributes/>
+      <test_names>
+        <test_name>
+          <name>0023-number-range UNIT</name>
+        </test_name>
+      </test_names>
+      <parallel>N</parallel>
+      <xloc>352</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+  </actions>
+  <hops>
+    <hop>
+      <from>Start</from>
+      <to>Run Number Range Tests</to>
+      <enabled>Y</enabled>
+      <evaluation>Y</evaluation>
+      <unconditional>Y</unconditional>
+    </hop>
+  </hops>
+  <notepads>
+  </notepads>
+  <attributes/>
+</workflow>
diff --git a/integration-tests/transforms/main-0024-if-null.hwf 
b/integration-tests/transforms/main-0024-if-null.hwf
new file mode 100644
index 0000000..690095e
--- /dev/null
+++ b/integration-tests/transforms/main-0024-if-null.hwf
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workflow>
+  <name>main-0024-if-null</name>
+  <name_sync_with_filename>Y</name_sync_with_filename>
+  <description/>
+  <extended_description/>
+  <workflow_version/>
+  <created_user>-</created_user>
+  <created_date>2021/06/01 17:45:49.992</created_date>
+  <modified_user>-</modified_user>
+  <modified_date>2021/06/01 17:45:49.992</modified_date>
+  <parameters>
+    </parameters>
+  <actions>
+    <action>
+      <name>Start</name>
+      <description/>
+      <type>SPECIAL</type>
+      <attributes/>
+      <repeat>N</repeat>
+      <schedulerType>0</schedulerType>
+      <intervalSeconds>0</intervalSeconds>
+      <intervalMinutes>60</intervalMinutes>
+      <hour>12</hour>
+      <minutes>0</minutes>
+      <weekDay>1</weekDay>
+      <DayOfMonth>1</DayOfMonth>
+      <parallel>N</parallel>
+      <xloc>128</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+    <action>
+      <name>Run If Null Tests</name>
+      <description/>
+      <type>RunPipelineTests</type>
+      <attributes/>
+      <test_names>
+        <test_name>
+          <name>0024-if-null-specific-fields UNIT</name>
+        </test_name>
+        <test_name>
+          <name>0024-if-null-by-type UNIT</name>
+        </test_name>
+        <test_name>
+          <name>0024-if-null-all-fields UNIT</name>
+        </test_name>
+      </test_names>
+      <parallel>N</parallel>
+      <xloc>336</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+  </actions>
+  <hops>
+    <hop>
+      <from>Start</from>
+      <to>Run If Null Tests</to>
+      <enabled>Y</enabled>
+      <evaluation>Y</evaluation>
+      <unconditional>Y</unconditional>
+    </hop>
+  </hops>
+  <notepads>
+  </notepads>
+  <attributes/>
+</workflow>
diff --git a/integration-tests/transforms/main-0025-null-if.hwf 
b/integration-tests/transforms/main-0025-null-if.hwf
new file mode 100644
index 0000000..7e17722
--- /dev/null
+++ b/integration-tests/transforms/main-0025-null-if.hwf
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workflow>
+  <name>main-0025-null-if</name>
+  <name_sync_with_filename>Y</name_sync_with_filename>
+  <description/>
+  <extended_description/>
+  <workflow_version/>
+  <created_user>-</created_user>
+  <created_date>2021/06/01 17:45:49.992</created_date>
+  <modified_user>-</modified_user>
+  <modified_date>2021/06/01 17:45:49.992</modified_date>
+  <parameters>
+    </parameters>
+  <actions>
+    <action>
+      <name>Start</name>
+      <description/>
+      <type>SPECIAL</type>
+      <attributes/>
+      <repeat>N</repeat>
+      <schedulerType>0</schedulerType>
+      <intervalSeconds>0</intervalSeconds>
+      <intervalMinutes>60</intervalMinutes>
+      <hour>12</hour>
+      <minutes>0</minutes>
+      <weekDay>1</weekDay>
+      <DayOfMonth>1</DayOfMonth>
+      <parallel>N</parallel>
+      <xloc>128</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+    <action>
+      <name>Run Null If Tests</name>
+      <description/>
+      <type>RunPipelineTests</type>
+      <attributes/>
+      <test_names>
+        <test_name>
+          <name>0025-null-if-basic UNIT</name>
+        </test_name>
+      </test_names>
+      <parallel>N</parallel>
+      <xloc>336</xloc>
+      <yloc>80</yloc>
+      <attributes_hac/>
+    </action>
+  </actions>
+  <hops>
+    <hop>
+      <from>Start</from>
+      <to>Run Null If Tests</to>
+      <enabled>Y</enabled>
+      <evaluation>Y</evaluation>
+      <unconditional>Y</unconditional>
+    </hop>
+  </hops>
+  <notepads>
+  </notepads>
+  <attributes/>
+</workflow>
diff --git 
a/integration-tests/transforms/metadata/dataset/golden-if-null-all-fields.json 
b/integration-tests/transforms/metadata/dataset/golden-if-null-all-fields.json
new file mode 100644
index 0000000..3276b4f
--- /dev/null
+++ 
b/integration-tests/transforms/metadata/dataset/golden-if-null-all-fields.json
@@ -0,0 +1,56 @@
+{
+  "base_filename": "golden-if-null-all-fields.csv",
+  "name": "golden-if-null-all-fields",
+  "description": "",
+  "dataset_fields": [
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "a"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "b"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "c"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "d"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "e"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "f"
+    }
+  ],
+  "folder_name": ""
+}
\ No newline at end of file
diff --git 
a/integration-tests/transforms/metadata/dataset/golden-if-null-by-type.json 
b/integration-tests/transforms/metadata/dataset/golden-if-null-by-type.json
new file mode 100644
index 0000000..182a6c1
--- /dev/null
+++ b/integration-tests/transforms/metadata/dataset/golden-if-null-by-type.json
@@ -0,0 +1,56 @@
+{
+  "base_filename": "golden-if-null-by-type.csv",
+  "name": "golden-if-null-by-type",
+  "description": "",
+  "dataset_fields": [
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "strA"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 5,
+      "field_precision": 0,
+      "field_format": "####0;-####0",
+      "field_name": "intB"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "strC"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 1,
+      "field_precision": -1,
+      "field_format": "####0.0#########;-####0.0#########",
+      "field_name": "numD"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "strE"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 5,
+      "field_precision": 0,
+      "field_format": "####0;-####0",
+      "field_name": "intF"
+    }
+  ],
+  "folder_name": ""
+}
\ No newline at end of file
diff --git 
a/integration-tests/transforms/metadata/dataset/golden-if-null-specific-fields.json
 
b/integration-tests/transforms/metadata/dataset/golden-if-null-specific-fields.json
new file mode 100644
index 0000000..c71d8ad
--- /dev/null
+++ 
b/integration-tests/transforms/metadata/dataset/golden-if-null-specific-fields.json
@@ -0,0 +1,56 @@
+{
+  "base_filename": "golden-if-null-specific-fields.csv",
+  "name": "golden-if-null-specific-fields",
+  "description": "",
+  "dataset_fields": [
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "a"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "b"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "c"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "d"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "e"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "f"
+    }
+  ],
+  "folder_name": ""
+}
\ No newline at end of file
diff --git 
a/integration-tests/transforms/metadata/dataset/golden-number-range.json 
b/integration-tests/transforms/metadata/dataset/golden-null-if-basic.json
similarity index 52%
copy from integration-tests/transforms/metadata/dataset/golden-number-range.json
copy to integration-tests/transforms/metadata/dataset/golden-null-if-basic.json
index c8bb503..b2748ef 100644
--- a/integration-tests/transforms/metadata/dataset/golden-number-range.json
+++ b/integration-tests/transforms/metadata/dataset/golden-null-if-basic.json
@@ -1,31 +1,39 @@
 {
-  "base_filename": "golden-number-rang.csv",
-  "name": "golden-number-range",
+  "base_filename": "golden-null-if-basic.csv",
+  "name": "golden-null-if-basic",
   "description": "",
   "dataset_fields": [
     {
       "field_comment": "",
       "field_length": -1,
+      "field_type": 2,
+      "field_precision": -1,
+      "field_format": "",
+      "field_name": "strA"
+    },
+    {
+      "field_comment": "",
+      "field_length": -1,
       "field_type": 5,
       "field_precision": 0,
       "field_format": "####0;-####0",
-      "field_name": "id"
+      "field_name": "intB"
     },
     {
       "field_comment": "",
       "field_length": -1,
       "field_type": 1,
       "field_precision": -1,
-      "field_format": "#.#",
-      "field_name": "price"
+      "field_format": "####0.0#########;-####0.0#########",
+      "field_name": "numC"
     },
     {
       "field_comment": "",
-      "field_length": 255,
-      "field_type": 2,
+      "field_length": -1,
+      "field_type": 4,
       "field_precision": -1,
       "field_format": "",
-      "field_name": "range"
+      "field_name": "boolD"
     }
   ],
   "folder_name": ""
diff --git 
a/integration-tests/transforms/metadata/dataset/golden-number-range.json 
b/integration-tests/transforms/metadata/dataset/golden-number-range.json
index c8bb503..0f1c20d 100644
--- a/integration-tests/transforms/metadata/dataset/golden-number-range.json
+++ b/integration-tests/transforms/metadata/dataset/golden-number-range.json
@@ -16,7 +16,7 @@
       "field_length": -1,
       "field_type": 1,
       "field_precision": -1,
-      "field_format": "#.#",
+      "field_format": "#.00",
       "field_name": "price"
     },
     {
diff --git a/integration-tests/transforms/metadata/unit-test/0023-number-range 
UNIT.json b/integration-tests/transforms/metadata/unit-test/0023-number-range 
UNIT.json
index b4ae362..21c75db 100644
--- a/integration-tests/transforms/metadata/unit-test/0023-number-range 
UNIT.json       
+++ b/integration-tests/transforms/metadata/unit-test/0023-number-range 
UNIT.json       
@@ -11,16 +11,16 @@
           "data_set_field": "id"
         },
         {
-          "transform_field": "price",
-          "data_set_field": "price"
-        },
-        {
           "transform_field": "range",
           "data_set_field": "range"
+        },
+        {
+          "transform_field": "price",
+          "data_set_field": "price"
         }
       ],
       "field_order": [
-        ""
+        "id"
       ],
       "transform_name": "Verify",
       "data_set_name": "golden-number-range"
diff --git 
a/integration-tests/transforms/metadata/unit-test/0024-if-null-all-fields 
UNIT.json 
b/integration-tests/transforms/metadata/unit-test/0024-if-null-all-fields 
UNIT.json
new file mode 100644
index 0000000..f8b1d6e
--- /dev/null
+++ b/integration-tests/transforms/metadata/unit-test/0024-if-null-all-fields 
UNIT.json 
@@ -0,0 +1,53 @@
+{
+  "variableValues": [],
+  "database_replacements": [],
+  "autoOpening": true,
+  "basePath": "",
+  "golden_data_sets": [
+    {
+      "field_mappings": [
+        {
+          "transform_field": "a",
+          "data_set_field": "a"
+        },
+        {
+          "transform_field": "b",
+          "data_set_field": "b"
+        },
+        {
+          "transform_field": "c",
+          "data_set_field": "c"
+        },
+        {
+          "transform_field": "d",
+          "data_set_field": "d"
+        },
+        {
+          "transform_field": "e",
+          "data_set_field": "e"
+        },
+        {
+          "transform_field": "f",
+          "data_set_field": "f"
+        }
+      ],
+      "field_order": [
+        "a",
+        "b",
+        "c",
+        "d",
+        "e",
+        "f"
+      ],
+      "transform_name": "Verify",
+      "data_set_name": "golden-if-null-all-fields"
+    }
+  ],
+  "input_data_sets": [],
+  "name": "0024-if-null-all-fields UNIT",
+  "description": "",
+  "trans_test_tweaks": [],
+  "persist_filename": "",
+  "pipeline_filename": 
"/home/matt/git/mattcasters/incubator-hop/integration-tests/transforms/0024-if-null-all-fields.hpl",
+  "test_type": "UNIT_TEST"
+}
\ No newline at end of file
diff --git 
a/integration-tests/transforms/metadata/unit-test/0024-if-null-by-type 
UNIT.json 
b/integration-tests/transforms/metadata/unit-test/0024-if-null-by-type UNIT.json
new file mode 100644
index 0000000..722a2fc
--- /dev/null
+++ b/integration-tests/transforms/metadata/unit-test/0024-if-null-by-type 
UNIT.json    
@@ -0,0 +1,53 @@
+{
+  "variableValues": [],
+  "database_replacements": [],
+  "autoOpening": true,
+  "basePath": "",
+  "golden_data_sets": [
+    {
+      "field_mappings": [
+        {
+          "transform_field": "intB",
+          "data_set_field": "intB"
+        },
+        {
+          "transform_field": "intF",
+          "data_set_field": "intF"
+        },
+        {
+          "transform_field": "numD",
+          "data_set_field": "numD"
+        },
+        {
+          "transform_field": "strA",
+          "data_set_field": "strA"
+        },
+        {
+          "transform_field": "strC",
+          "data_set_field": "strC"
+        },
+        {
+          "transform_field": "strE",
+          "data_set_field": "strE"
+        }
+      ],
+      "field_order": [
+        "strA",
+        "intB",
+        "strC",
+        "numD",
+        "strE",
+        "intF"
+      ],
+      "transform_name": "Verify",
+      "data_set_name": "golden-if-null-by-type"
+    }
+  ],
+  "input_data_sets": [],
+  "name": "0024-if-null-by-type UNIT",
+  "description": "",
+  "trans_test_tweaks": [],
+  "persist_filename": "",
+  "pipeline_filename": 
"/home/matt/git/mattcasters/incubator-hop/integration-tests/transforms/0024-if-null-by-type.hpl",
+  "test_type": "UNIT_TEST"
+}
\ No newline at end of file
diff --git 
a/integration-tests/transforms/metadata/unit-test/0024-if-null-specific-fields 
UNIT.json 
b/integration-tests/transforms/metadata/unit-test/0024-if-null-specific-fields 
UNIT.json
new file mode 100644
index 0000000..e0cc4f7
--- /dev/null
+++ 
b/integration-tests/transforms/metadata/unit-test/0024-if-null-specific-fields 
UNIT.json    
@@ -0,0 +1,53 @@
+{
+  "variableValues": [],
+  "database_replacements": [],
+  "autoOpening": true,
+  "basePath": "",
+  "golden_data_sets": [
+    {
+      "field_mappings": [
+        {
+          "transform_field": "a",
+          "data_set_field": "a"
+        },
+        {
+          "transform_field": "b",
+          "data_set_field": "b"
+        },
+        {
+          "transform_field": "c",
+          "data_set_field": "c"
+        },
+        {
+          "transform_field": "d",
+          "data_set_field": "d"
+        },
+        {
+          "transform_field": "e",
+          "data_set_field": "e"
+        },
+        {
+          "transform_field": "f",
+          "data_set_field": "f"
+        }
+      ],
+      "field_order": [
+        "a",
+        "b",
+        "c",
+        "d",
+        "e",
+        "f"
+      ],
+      "transform_name": "Verify",
+      "data_set_name": "golden-if-null-specific-fields"
+    }
+  ],
+  "input_data_sets": [],
+  "name": "0024-if-null-specific-fields UNIT",
+  "description": "",
+  "trans_test_tweaks": [],
+  "persist_filename": "",
+  "pipeline_filename": 
"/home/matt/git/mattcasters/incubator-hop/integration-tests/transforms/0024-if-null-specific-fields.hpl",
+  "test_type": "UNIT_TEST"
+}
\ No newline at end of file
diff --git a/integration-tests/transforms/metadata/unit-test/0025-null-if-basic 
UNIT.json b/integration-tests/transforms/metadata/unit-test/0025-null-if-basic 
UNIT.json
new file mode 100644
index 0000000..1179c66
--- /dev/null
+++ b/integration-tests/transforms/metadata/unit-test/0025-null-if-basic 
UNIT.json      
@@ -0,0 +1,43 @@
+{
+  "variableValues": [],
+  "database_replacements": [],
+  "autoOpening": true,
+  "basePath": "",
+  "golden_data_sets": [
+    {
+      "field_mappings": [
+        {
+          "transform_field": "boolD",
+          "data_set_field": "boolD"
+        },
+        {
+          "transform_field": "intB",
+          "data_set_field": "intB"
+        },
+        {
+          "transform_field": "numC",
+          "data_set_field": "numC"
+        },
+        {
+          "transform_field": "strA",
+          "data_set_field": "strA"
+        }
+      ],
+      "field_order": [
+        "strA",
+        "intB",
+        "numC",
+        "boolD"
+      ],
+      "transform_name": "Preview",
+      "data_set_name": "golden-null-if-basic"
+    }
+  ],
+  "input_data_sets": [],
+  "name": "0025-null-if-basic UNIT",
+  "description": "",
+  "trans_test_tweaks": [],
+  "persist_filename": "",
+  "pipeline_filename": 
"/home/matt/git/mattcasters/incubator-hop/integration-tests/transforms/0025-null-if-basic.hpl",
+  "test_type": "UNIT_TEST"
+}
\ No newline at end of file

Reply via email to