User Defined Java Expression
Description
This step allows you to enter User Defined Java Expressions as a basis for the calculation of new values.
If you have a Java expression like :
C=A+B
Then you can simply enter the right side of the expression in the dialog:
A+B
The values are exposed to the expressions as the Java objects they are :
Data type | Java Class |
|---|---|
String | java.lang.String |
Integer | java.lang.Long |
Number | java.lang.Double |
Date | java.util.Date |
BigNumber | BigDecimal |
Binary | byte[] |
Options
Options | Description |
|---|---|
New Field | The new field in the data stream. If you want to overwrite an existing field, you need to define the field here and in the "Replace value" option. |
Java Expression | The Java Expression, see examples below |
Value Type | Type |
Length | Length |
Precision | Precision |
Replace value | Select this identical to the "New field" name when you want to replace the |
Metadata Injection Support
All fields of this step support metadata injection. You can use this step with ETL Metadata Injection to pass metadata to your transformation at runtime.
Examples
Add 2 integers, A and B
A+B
Concatenate 2 Strings : firstname and name and put a space in between
firstname+" "+name
or if you really care about performance, this might be faster:
new StringBuffer(firstname).append(" ").append(name).toString()
Set the first character of each word in upper-case: john doe --> John Doe
org.pentaho.di.core.Const.initCap(name)
Use native Java and API functions
System.getProperty("os.name")
When the used method throws an exception, you need at minimum PDI 3.2.1, see PDI-2611
Business rules (If / Then / Else)
When a<c then return true else return false
a<c?true:false
This can be more complicated
a<c?(a==1?1:2):3
even with OR and AND and other operators and functions
Using Constants
If you use a constant, you may need to define the right type in some expressions otherwise it could throw:
Incompatible expression types "int" and "java.lang.Long"
To solve this, use:
test == null ? new Long(0) : test
In this case, it checks if test is null and replaces with zero. If it is not null, it will return test.
If the return value is a BigNumber (BigDecimal), you need at minimum PDI 3.2.3, see PDI-2910
Cut a string from end and test for null and minimal length
Imagine you have input strings with
Orlando FL
New York NY
and you want to separate the state and city, you could use the following expressions:
For state (get the last 2 characters):
location != null && location.length()>2 ? location.substring(location.length()-2, location.length()) : null
For city (get the beginning without the last 2 characters and trim):
location != null && location.length()>2 ? location.substring(0, location.length()-2).trim() : location
Within the code there is a check for null and a minimal length of 2, the complete example is attached to an enhancement request PDI-6915.
Functionality of a LIKE operator (contains string) and replacing values
The following example returns 1 when abc is within the source string, otherwise 2. It returns also 2 when the source string is null. The return values could be of value type Integer.
samplestr !=null && samplestr.indexOf("abc")>-1 ? 1 : 2
The complete example is attached to an enhancement request PDI-1241.