Synopsis: coalesce
returns the first non-empty string of the input strings. If no input
strings are given or all of them are empty, then empty string is returned. Note: a blank
string (with only whitespaces) is not considered as empty.
Pkg doc: here.
Example:
"tracking_number": { "custom_func": {
"name": "coalesce",
"args": [
{ "xpath": "tracking_number_h002_cn" },
{ "xpath": "tracking_number_h001" }
]
}}
If IDR node tracking_number_h002_cn
value is ""
and tracking_number_h001
value is "ABC"
,
then the result field tracking_number
value is "ABC"
.
Synopsis: concat
concatenates a number of strings together. If no strings specified, ""
is
returned.
Pkg doc: here.
Example:
"event_date_time": { "custom_func": {
"name": "concat",
"args": [
{ "xpath": "event_date" },
{ "const": "T" },
{ "xpath": "event_time" }
]
}}
If IDR node event_date
value is "12/31/2020"
and event_time
value is "12:34:56"
,
then the result field event_date_time
value is "12/31/2020T12:34:56"
.
Synopsis: dateTimeLayoutToRFC3339
parses a datetime string according to a given layout, and
normalizes and returns it in RFC3339 format.
Pkg doc: here.
Example:
"day_before_month": { "custom_func": {
"name": "dateTimeLayoutToRFC3339",
"args": [
{ "xpath": "DayBeforeMonth" },
{ "const": "02/01/06T15:04:05", "_comment": "layout" },
{ "const": "false", "_comment": "layoutTZ" },
{ "const": "Pacific/Auckland", "_comment": "fromTZ" },
{ "const": "America/Los_Angeles", "_comment": "toTZ" }
]
}}
If IDR node DayBeforeMonth
value is "31/12/20T12:34:56"
, then the result field
day_before_month
value is "2020-12-30T15:34:56-08:00"
: first, input "31/12/20T12:34:56"
is parsed in the time zone of "Pacific/Auckland"
which is GMT+13 at that moment of time.
So the input datetime string, if translated into UTC, is "2020-12-30T23:34:56Z"
. Now the caller
specifies the desired output timezone to be "America/Los_Angeles"
which is GMT-8 at that moment
of time, so the eventual output is "2020-12-30T15:34:56-08:00"
.
Param layoutTZ
should be a boolean string value "true"
or "false"
, depending on if the
provided layout
param contains TZ info (such as Z
suffix, or tz offset like -08:00
) in it or
not. If layout
has TZ info, then fromTZ
param will be ignored; if layout
and input don't have
TZ info, and fromTZ
is specified, then the datetime string will be parsed in as if it's in the
fromTZ
timezone. If toTZ
is empty, then whatever the tz from the input parsing will remain intact;
or the parsed input datetime will be converted into the toTZ
.
If you're not sure, please check this sample to find out more subtleties about date time parsing and conversion.
Synopsis: dateTimeToEpoch
parses a datetime string intelligently, and returns its epoch number.
Pkg doc: here.
Example:
"epoch": { "custom_func": {
"name": "dateTimeToEpoch",
"args": [
{ "xpath": "event_datetime" },
{ "const": "", "_comment": "fromTZ" },
{ "const": "SECOND", "_comment": "unit" }
]
}}
If IDR node event_datetime
value is "12/31/2020T12:34:56Z"
, then the result field
epoch
value is "1609418096"
: first, input "12/31/2020T12:34:56Z"
will be parsed in as is (since it has Z
suffix, so it is time-zoned, plus fromTZ
is ""
).
Then the function converts the input datetime to epoch seconds.
Param unit
has two valid values: "SECOND"
or "MILLISECOND"
.
Synopsis: dateTimeToRFC3339
parses a datetime string intelligently, normalizes and returns it
in RFC3339 format.
Pkg doc: here.
Example:
"no_tz_date_time_use_to_tz": { "custom_func": {
"name": "dateTimeToRFC3339",
"args": [
{ "xpath": "DateTimeWithNoTZ" },
{ "const": "", "_comment": "fromTZ" },
{ "const": "America/Los_Angeles", "_comment": "toTZ" }
]
}},
This custom_func
params and behavior is very similar to
dateTimeLayoutToRFC3339
except that it doesn't need a layout
and it
instead tries to parse the input datetime string intelligently.
If you're not sure, please check this sample to find out more subtleties about date time parsing and conversion.
Synopsis: epochToDateTimeRFC3339
translates an epoch timestamp into an RFC3339 formatted datetime
string.
Pkg doc: here.
Example:
"epoch_to_datetime": { "custom_func": {
"name": "epochToDateTimeRFC3339",
"args": [
{ "xpath": "event_epoch" },
{ "const": "MILLISECOND", "_comment": "unit" }
]
}}
If IDR node event_epoch
value is "1609418096000"
, then the result field
epoch_to_datetime
value is "2020-12-31T12:34:56Z"
: first, input "1609418096000"
will be parsed in as epoch value in milliseconds. Then the function converts the epoch value
to RFC3339 string.
Param unit
has two valid values: "SECOND"
or "MILLISECOND"
.
There is an optional param at the end, tz
: if not specified, the output will be in UTC (Z
)
time zone; if specified, it must be of a standard IANA time zone string, such as
"America/Los_Angeles"
.
Synopsis: lower
lowers the case of an input string.
Pkg doc: here.
Example:
"carrier": { "custom_func": { "name": "lower", "args": [ { "xpath": "../GLOBAL/carrier" } ] } },
If IDR node ../GLOBAL/carrier
value is "ABC"
, then the result field carrier
value is "abc"
.
Synopsis: now
returns the current time in UTC in RFC3339 format.
Pkg doc: here.
Example:
"now_datetime": { "custom_func": { "name": "now" }},
The result field now_datetime
value will be the current system datetime in UTC in RFC3339.
Synopsis: upper
uppers the case of an input string.
Pkg doc: here.
Example:
"carrier": { "custom_func": { "name": "upper", "args": [ { "xpath": "../GLOBAL/carrier" } ] } },
If IDR node ../GLOBAL/carrier
value is "abc"
, then the result field carrier
value is "ABC"
.
Synopsis: uuidv3
uses MD5 to produce a consistent/stable UUID for an input string.
Pkg doc: here.
Example:
"unique_customer_order_id": { "custom_func": {
"name": "uuidv3",
"args": [
{ "custom_func": {
"name": "concat",
"args: [
{ "xpath": "customer_id" },
{ "const": "/" },
{ "xpath": "order_id" }
]
}}
]
}}
The result field unique_customer_order_id
will contain the value of an MD5 hash of the concatenated
string of customer_id value, "/"
, and order_id value.
Synopsis: copy
copies the current contextual idr.Node
and returns it as a JSON marshaling
friendly interface{}
.
Pkg doc: here.
Example:
"first_book": { "xpath": "book[position() = 1]", "custom_func": { "name": "copy"} },
The result field first_book
will be an exact copy of first book
node from the input.
Synopsis: javascript
runs a javascript.
Pkg doc: here.
Example:
"avg_price": {
"custom_func": {
"name": "javascript",
"args": [
{ "const": "t=0; for(i=0; i<prices.length; i++) { t+=prices[i]; } Math.floor(t*100/prices.length)/100;" },
{ "const": "prices" }, { "array": [ { "xpath": "books/*/price", "type": "float" } ] }
]
}
},
The result field avg_price
will contain the average price (to the 2nd decimal places) of all the
book prices.
For more information about javascript
, check this
in-depth explanation.
Synopsis: javascript_with_context
runs a javascript with contextual _node
provided.
Pkg doc: here.
Example:
"full_name": { "xpath": "./personal_info", "custom_func" {
"name": "javascript_with_context",
"args": [
{ "const": "var n = JSON.parse(_node); n.['Last Name'] + ', ' + n.['First Name']" }
]
}}
The result field full_name
will be a concatenated string of the last name and the first name from
the current IDR node.
For more information about javascript_with_context
, check this
in-depth explanation.